我想创建一个这个函数的密度图:
在Maple中,可以使用densityplot
函数来实现此目的(最后的代码),它给出了:
但是,我不确定在MATLAB中用什么来绘制类似的数字。
这是我目前的MATLAB代码:
x = [0:10:100];
y = [-50:10:50];
s = [10, 0];
i = [50,25];
for ii = 1 : length(x)
sir(ii) = -10 * 9.8 * log10((power((x(ii) - s(1)),2) + power((y(ii) - s(2)),2)) / (power((x(ii) - i(1)),2) + power((y(ii) - i(2)),2)));
end
有人可以在MATLAB中建议一个等效的吗?
对于Maple中的密度图,我使用了
densityplot(sir(x,y), x=0..100, y=-50..50, axes=boxed, style=patchnogrid, scaletorange=-5..50, colorscheme = [black, "green", "white"])
答案 0 :(得分:3)
您可以使用surf
(3D曲面图)来实现这一目标,但是您需要一个比10级更精细的网格才能看起来更好!
此外,您需要meshgrid
才能获得x
和y
坐标的所有组合。
请参阅评论以获取更多详细信息。
% Set up grid points
x = 0:0.1:100;
y = -50:0.1:50;
[x,y] = meshgrid(x,y);
% Set up parameters i, s and g
i = [50 25]; s = [10 0]; g = 9.8;
% Work out density
% - no need for loop if we use element-wise operations ./ and .^
% - power(z,2) replaced by z.^2 (same function, more concise)
% - You forgot the sqare roots in your question's code, included using .^(1/2)
% - line continuation with "...", could remove and have on one line
sir = -10*g*log10( ((x-s(1)).^2 + (y-s(2)).^2).^(1/2) ./ ...
((x-i(1)).^2 + (y-i(2)).^2).^(1/2) );
% Plot, and set to a view from above
surf(x,y,sir,'edgecolor','none','facecolor','interp');
view(2);
% Change the colour scheme
colormap('bone')
结果:
匹配您的示例
您使用了Maple命令scaletorange=-5..50
。这限制了-5
和50
(docs)之间的比例,因此sir
是我们的比例变量,我们应该限制它。在MATLAB中:
% Restrict sir to the range [-5,50]
sir = min(max(sir,-5),50);
% Of course we now have to replot
surf(x,y,sir,'edgecolor','none','facecolor','interp');
view(2);
现在,如果你想要黑色/绿色,你可以使用自定义colormap
,这也可以消除'bone'
colormap
仅有64种颜色引起的条带。
% Define the three colours to interpolate between, and n interpolation points
black = [0 0 0]; green = [0 1 0]; white = [1 1 1];
n = 1000;
% Do colour interpolation, equivalent to Maple's 'colorscheme = [black, "green", "white"]'
% We need an nx3 matrix of colours (columns R,G,B), which we get using interp1
colormap(interp1(1:3, [black; green; white], linspace(1,3,n)));
使用g=3.5
(不确定您使用的是什么),我们得到一个几乎相同的情节