2017-05-06 7 views
1

J'ai une fonction scalaire qui est obtenue par des calculs itératifs. Je souhaite différencier (trouver la dérivée directionnelle) des valeurs par rapport à une matrice élémentaire. Comment dois-je employer l'approximation par différence finie dans ce cas. Est-ce que diff ou gradient aider dans ce cas. Notez que je ne veux que des dérivés numériques. Le code typique que je travaillerais sur est:Différencier un scalaire par rapport à la matrice

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; 

Je sais que la dernière partie de grad_L serait syntaxe erreur indiquant les dimensions ne correspondent pas. Comment puis-je procéder pour résoudre cela. Notez que gradient ou dérivée directionnelle d'une fonction scalaire f d'une variable de matrice X est donnée par nabla(f)=trace((partial f/patial(x_{ij})*X_dotx_{ij} désigne des éléments de la matrice et X_dot représente gradient de la matrice X

+0

@Adriaan ok, édité. Mais, ce n'est qu'un exemple hypothétique. – vidyarthi

Répondre

1

deux votre code et l'explication sont très confus. Vous utilisez une itération de n = 4, mais vous ne faites rien avec vos entrées ou sorties, et vous écrasez tout. Donc, je vais ignorer l'aspect n pour l'instant puisque vous ne semblez pas en faire usage. De plus, vous avez beaucoup d'erreurs syntaxiques qui ressemblent plus à des maths ou à des pseudocodes, plutôt qu'à toute tentative d'écriture de Matlab/Octave valide. Mais, essentiellement, vous semblez vous demander: "J'ai une fonction qui, pour chaque coordonnée (x, y) sur une grille 2D, calcule une sortie scalaire L (x, y)", où le calcul mène à L implique de multiplier deux matrices et ensuite d'obtenir leur déterminant. Voilà comment produire un tel tableau 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 

Vous souhaitez ensuite obtenir le gradient de L, qui, bien sûr, est une sortie de vecteur. Maintenant, pour obtenir ceci, en ignorant les maths que vous avez mentionnés pendant une seconde, si vous essayez d'utiliser la fonction gradient correctement, alors vous l'utilisez directement sur L, et spécifiez la grille XY utilisée pour spécifier les espacements entre les différents éléments de L et recueillir sa sortie en tant que tableau à deux éléments, de sorte que vous capturer à la fois le vecteur de composantes x et y du gradient:

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

merci pour votre réponse. Mais je souhaite calculer le gradient par rapport à une seule variable, alors quels changements dois-je faire? – vidyarthi

+0

comme, vous êtes seulement intéressé par le composant 'gLx'? (ou seulement dans le composant 'gLy'?) –

+0

oui, je suis intéressé par les deux composants séparément – vidyarthi