2017-05-06 11 views
1

필자는 반복 계산으로 얻은 스칼라 함수를 가지고 있습니다. 행렬을 기준으로 값의 방향 미분을 구별하고 싶습니다. 이 경우 유한 차분 근사법을 어떻게 사용해야합니까? 이 경우 diff 또는 gradient이 도움이됩니까? 숫자 파생어 만 필요합니다. I가 일하는 것이 전형적인 코드는 다음과 같습니다매트릭스에 대한 스칼라의 차별화

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의 마지막 부분은 크기가 일치하지 않습니다 말하는 오류를 구문 것이라는 점을 알고있다. 이 문제를 해결하려면 어떻게해야합니까? x_{ij} 행렬의 원소를 나타내고, X_dotX

+0

가 @Adriaan OK 편집. 그러나 이것은 단지 가상의 예일뿐입니다. 귀하의 회신에 감사드립니다. – vidyarthi

답변

1

하여 코드 및 설명 모두는 매우 혼란 행렬의 기울기를 나타내고 nabla(f)=trace((partial f/patial(x_{ij})*X_dot 의해 X가 주어진 행렬 변수의 스칼라 함수 f의 경사 또는 방향 유도체 참고. n = 4의 반복을 사용하고 있지만 입력이나 출력에 아무 것도하지 않으면 모든 것을 덮어 씁니다. 그래서 나는 당신이 그것을 사용하지 않는 것처럼 보이기 때문에 지금은 n면을 무시할 것입니다. 더욱이 유효한 Matlab/Octave를 작성하려는 시도보다는 오히려 수학이나 의사 코드와 비슷한 많은 구문상의 실수가 있습니다.

하지만 본질적으로 "2D 그리드의 각 (x, y) 좌표에 대해 스칼라 출력 L (x, y)를 계산하는 함수가 있습니다." ~ L은 두 개의 행렬을 곱한 다음 그 행렬식을 얻는 것을 포함합니다. 여기서 이러한 배열 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 격자를 사용하십시오. 그래디언트 xy 벡터 성분 모두를 포착하도록 L의 다른 요소와의 사이, 두 소자 어레이와 같은 출력을 수집 :

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

. 그러나 하나의 변수에 대해서만 그래디언트를 계산하고 싶습니다. 그래서 어떤 변경을해야합니까? – vidyarthi

+0

에서와 같이'gLx' 컴포넌트에만 관심이 있습니까? (또는'gLy' 컴포넌트에서만?) –

+0

네, 두 컴포넌트를 따로 따로 가지고 있습니다. – vidyarthi