2017-05-06 4 views
1

私はスカラー関数を持っていますが、これは反復計算によって得られます。私は行列の要素に対して、値の微分(方向性の導関数の発見)を望みます。この場合、どのように有限差分近似を採用すればよいですか?この場合、diffまたはgradientが役に立ちます。私は数値的な導関数しか求めていないことに注意してください 私はうまくいく典型的なコードは次のとおりです。行列に関してスカラーを微分する

n=4; 
for i=1:n 
    for x(i)=-2:0.04:4; 
    for y(i)=-2:0.04:4; 
     A(:,:,i)=[sin(x(i)), cos(y(i));2sin(x(i)),sin(x(i)+y(i)).^2]; 
     B(:,:,i)=[sin(x(i)), cos(x(i));3sin(y(i)),cos(x(i))]; 
     R(:,:,i)=horzcat(A(:,:,i),B(:,:,i)); 
     L(i)=det(B(:,:,i)'*A(:,:,i)B)(:,:,i)); 

     %how to find gradient of L with respect to x(i), y(i) 
     grad_L=tr((diff(L)/diff(R)')*(gradient(R)) 
    endfor; 
    endfor; 
endfor; 

私はgrad_Lための最後の部分は、寸法が一致しないというエラーを構文であろうことを知っています。これを解決するにはどうすればいいですか?その勾配または可変Xx_{ij}は行列の要素を示し、X_dotがマトリックスの勾配X

+0

@Adriaan OK、編集。しかし、これは単なる仮説的な例です。返信いただきありがとうございます。 – vidyarthi

答えて

1

コードと説明の両方が非常に混乱している意味nabla(f)=trace((partial f/patial(x_{ij})*X_dotにより与えられる行列のスカラー関数fの方向微分に留意されたいです。 n = 4の反復を使用していますが、入力や出力で何もしないで、すべてを上書きします。だからあなたはそれを一切使っていないようだから、今はnの部分を無視します。さらに、有効なMatlab/Octaveを書く試みではなく、数学や擬似コードのように見える多くの構文ミスがあります。

しかし、本質的には、「私は2Dグリッド上の各(x、y)座標に対して、スカラー出力L(x、y)を計算する関数を持っています。 Lへの変換は、2つの行列を乗算し、その行列式を得ることを含む。ここでは、そのような配列Lを生成する方法は次のとおりです。

X = -2 : 0.04 : 4; 
Y = -2 : 0.04 : 4; 
X_indices = 1 : length(X); 
Y_indices = 1 : length(Y); 

for Ind_x = X_indices 
    for Ind_y = Y_indices 
    x = X(Ind_x); y = Y(Ind_y); 
    A = [sin(x), cos(y); 2 * sin(x), sin(x+y)^2]; 
    B = [sin(x), cos(x); 3 * sin(y), cos(x) ]; 
    L(Ind_x, Ind_y) = det (B.' * A * B); 
    end 
end 

あなたはその後、もちろん、ベクトル出力され、Lの傾きを、取得したいです。これを得るには、あなたが基本的にgradient関数を正しく使用しようとしている場合は、Lに直接使用し、グリッドを指定してください。XYは、 Lで異なる要素間、及びグラデーションのxyベクトル成分の両方をキャプチャするように、2つの要素の配列としてその出力を収集:

[gLx, gLy] = gradient(L, X, Y); 
+0

しかし、唯一の変数に関して勾配を計算したいので、どのような変更が必要ですか? – vidyarthi

+0

のように、 'gLx'コンポーネントだけに興味がありますか? (または 'gLy'コンポーネントのみで) –

+0

はい、私は別々に両方のコンポーネントに興味があります – vidyarthi