2016-07-13 8 views
0

は、たとえば、私はこのコードは、MathWorks社のMATLABでの数値をプロットする私の方法であるMATLABプロットの3D図は

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

に、この単純な関数をプロットする方法を知っています。

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

しかし、複雑な機能の場合は、これを行う方法がわかりません。 Ackley関数という名前の関数があります。

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寸法(n=2、ここで

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

と:関数は、あなたの入力は以下のようになっていること、を前提としてい我々の場合はy)。関数は各行で独立して動作するため、同時に任意の数の点を計算できます。

あなたは二つの行列XYを取得しますが、あなたが直接ackley()にそれらを養うことができません

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

meshgrid作成 - あなたが一番上に示すように、入力行列を作成する必要がありますが、各行は1つの点に対応する。あなたはXYの外に列ベクトルを作るためにコロン演算子:を使用して、再びそれらを連結することができます

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

今、あなたは正しい構造を持っているとackleyを呼び出すことができます。

out = ackley(in); 

が、出力行列ではなく列ベクトルになりました。あなたは、このように行列であるためには、それをreshapeする必要があります:

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

最後に、あなたはいつものように、グラフをプロットすることができます

​​

resulting ackley function

+0

は、あなたの答えは非常にある、どうもありがとうございました明らかです。感謝します。 –