2016-07-13 145 views
0

例如,我知道如何绘制这个简单的功能在MATLAB情节3D图形

% 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) 

但是,如果对于一些复杂的功能,我不知道该怎么做。有一个名为阿克利功能,

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

这实际上是特定于该实施阿克莱功能:该功能假设,你的输入如下所示:

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

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

当你创建一个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)); 

最后,您可以绘制图形和往常一样:

​​

resulting ackley function

+0

非常感谢你,你的答案是非常明确。欣赏它。 –