2016-11-13 5 views
0

私は2つの変数の区分関数をプロットしようとしていますが、私が書いたコードは機能しません。Matlab区分2変数関数

これは私のコード

c=-0.5; 
b=0.5; 
L=0:1:100; 
K=0:1:100; 
[L,K]= meshgrid(L,K); 

for i=1:length(L) 
    for q=1:length(K) 
      if 
      { 
      L(i)/K(q)>=-c 
      Z=(K(q).^b).*(L(i)+(b.*c).*K(q)).^(1-b); 
      else 
      Z=((-1/c)^b) .*(1-b).*(1-b); 
      } 
      end 
    end 
end 
surf(Z) 

で誰かが私を助けることができますか?

答えて

0

コードの最初の問題は、中括弧{ ... }の使用です。他の多くのプログラミング言語(CやJavaなど)とは異なり、複数のコマンドをまとめてグループ化するために中括弧は必要ありません(if節やfor節など)。代わりに、MATLABは次のようにendステートメントを使用します。

第2に、各反復ではZ = ...と書いてあり、各反復ではZが上書きされます。そうすれば、コードの最後に単一の数字Zが得られます。代わりにmatrix indexingを使用して、計算結果をZ(i,q)番目の位置に書き込む必要があります。これは、Z(i,q) = ...;と書くのと同じくらい簡単です。これはすでに動作しますが、preallocateZの行列である必要があります。つまり、forループの前にゼロの行列を作成します。その後、MATLABは各反復で行列のサイズを大きくする必要はありません。これはzeros機能を使用して行われます。 (以前に提案されているとして、彼らは、0から100の

に行く必要がありながらsurf(Z)で、彼らは、1から101までとなります。

第三に、あなたは軸権を取得するためにsurf(L,K,Z)の代わりsurf(Z)を呼び出す必要があります今削除された)答えでは、*ではなく、.*を明示的に書く必要はありません。ベクトルや行列ではなくスカラーを扱うからです。同じサイズの2つのベクトル/行列の間でポイントワイズ乗算を計算する場合は、.*が必要です。スカラーでは、どちらも同じ結果につながりますが、必要はありません。

次に、lengthを使用しないでください。 lengthは、配列の次元がのの長さを返します。 Kを0から1000に変更するか、サイズ0.1のステップを実行すると、これは失敗します。代わりに、sizeを使用して、指定された次元の長さを取得します。 iの第1のディメンションとqの第2のディメンションを使用します。

もう1つのヒント:don't use i or j as variables in MATLABは、それらが虚数単位を表すために使用されているためです。 iiまたはkまたは好きな名前を使用してください。私の意見では、とjをforループで使用するのは悪い習慣です。rowNumberimageNumberなどの意味のある名前を使用するか、あなたのケースに該当するものを使用してください。コードを読んでいる誰かがこのが本当にであることを知っています。

c=-0.5; 
b=0.5; 
L=0:1:100; 
K=0:1:100; 
[L,K]= meshgrid(L,K); 

% Preallocate Z 
Z = zeros(size(L,1), size(K,2)); 

for ii=1:size(L,1) 
    for q=1:size(K,2) 
     if L(ii)/K(q)>=-c 
      Z(ii,q) = (K(q)^b)*(L(ii)+(b*c)*K(q))^(1-b); 
     else 
      Z(ii,q) =((-1/c)^b)*(1-b)*(1-b); 
     end 
    end 
end 

surf(L,K,Z) 

これで、コードはエラーなく実行され、期待どおりのサーフェスプロットが作成されます。

0

これは、ベクトル化場所の一例です(オール・イン・ワンの操作)は、MATLAB効率の面で大きなメリットをもたらすことができるコーディング:

c=-0.5; 
b=0.5; 
L=0:1:100; 
K=0:1:100; 

% slow loop-based method - shouldn't use meshgridded L and K here 
Z = zeros(length(L), length(K)); 
for i=1:length(L) 
    for q=1:length(K) 
     if L(i)/K(q)>=-c 
      Z(i,q) = (K(q)^b)*(L(i)+(b*c)*K(q))^(1-b); 
     else 
      Z(i,q) =((-1/c)^b)*(1-b)*(1-b); 
     end 
    end 
end 
figure(1) 
surf(L,K,Z) 



% much faster vectorized approach 
ZZ = zeros(length(L), length(K)); 
[KK,LL]= meshgrid(K, L); % corrected order of meshgrid inputs and outputs 
          % ---alternatively you could use [LL,KK]=ndgrid(L,K); 
case1 = LL ./ KK >= -c; 
case2 = ~case1; 
ZZ(case1) = KK(case1).^b .* (LL(case1) + (b*c) .* KK(case1)) .^ (1 - b); 
ZZ(case2) = ((-1/c)^b)*(1-b)*(1-b); 

figure(2) 
surf(L,K,ZZ)