在matlab中绘制3D图形

时间:2016-07-13 02:14:48

标签: matlab plot

例如,我知道如何在matlab中绘制这个简单的函数

 % simple demo
function z=myfun(x,y)
z=1./((x+y)^2+y^2+5);

这段代码是我在matlab中绘制图形的方法。

 x=-3:3;
y=-3:3;
[X,Y]=meshgrid(x,y);
Z=myfun(X,Y);
surf(X,Y,Z)

但是如果对于某些复杂的功能我不知道如何做到这一点。有一个名为Ackley Function的函数,

function [out]=ackley(in)

% dimension is # of columns of input, x1, x2, ..., xn
n=length(in(1,:));

x=in;
e=exp(1);

out = (20 + e ...
   -20*exp(-0.2*sqrt((1/n).*sum(x.^2,2))) ...
   -exp((1/n).*sum(cos(2*pi*x),2)));
return

有人可以告诉我该怎么做吗?谢谢。

1 个答案:

答案 0 :(得分:1)

这实际上特定于Ackley函数的这个实现:该函数假定您的输入如下所示:

x_1    y_1    (...)
x_2    y_2    (...)
 .      .     (.
 .      .       .
 .      .        .)

其中列数是维度(n=2,即在我们的例子中仅为xy。该函数独立地作用于每一行,因此您可以同时计算任意数量的点。

使用

创建meshgrid
x = -3:3;
y = -3:3;
[X,Y] = meshgrid(x,y);

您将获得两个矩阵XY,但您无法直接将它们输入ackley() - 您必须创建一个输入矩阵,如上图所示,其中每行对应一个点。您可以使用冒号运算符:XY中生成列向量,并再次连接它们:

in = [X(:), Y(:)];

现在您的结构正确,可以拨打ackley

out = ackley(in);

但输出现在是列向量,而不是矩阵。因此,您必须将reshape作为矩阵:

Z = reshape(out, size(X));

最后,您可以照常绘制图表:

surf(X, Y, Z);

resulting ackley function