Jacobiana di una funzione vettoriale

Linux1987
Salve devo calcolare numericamente la jacobiana di una funzione vettoriale $r: R^6->R^6$. Praticamente sto scrivendo un algoritmo per la risoluzione di GaussNewton per i minimi quadrati non lineari (mi serve tale algoritmo per la computer vision).
Dalla teoria sappiamo che la matrice jacobiana per una generica funzione $ f: R^n ->R^m $ é
.

La mia domanda é : dal momento che devo calcolare tale matrice come posso farlo avendo a disposizione il vettore in arrivo della funzione $r$?

Grazie

Risposte
Linux1987
Ogni funzione é $r_i$ è definita da 6 parametri che sono i tre angoli di Eulero , e le componenti $t_x,t_y,t_z$ di un vettore di traslazione, a me note, tali componenti vengono utilizzate nella stima di una matrice $[R|t]$ con R matrice di rotazione e t il vettore delle traslazioni. Esempio la funzione $r_1$ é : $ u_L- ( \alpha_u ( (r_(00)X+r_(01)Y+r_(02)Z+t_x)/ (r_(20)X+r_(21)Y+r_(22)Z+t_z) - u_0 ) $ dove $ u_L, \alpha_u, u_0$ sono costanti, mentre $X,Y,Z$ sono coordinate di un punto nello spazio 3d, e$r_(i,j)$ sono le componenti della matrice $R$ definita come il prodotto delle matrici di rotazione ,attorno ai tre angoli di Eulero. Adesso per ottenere la jacobiana dovrei derivare questa funzione , una volta per ogni parametro, infatti quello che devo calcolare è $ (dr)/(dm)$, dove $m$ é il vettore $ (\alpha,\beta,\gamma,t_x,t_y,t_z)$.

La Jacobiana mi serve successivamente per applicare la minimizzazione non lineare nel senso dei minimi quadrati di Gauss Newton

Raptorista1
Non ho ben capito la domanda... Vuoi calcolare la Jacobiana numericamente? Immagino che quindi analiticamente non si riesca. Qual è il problema? La cosa più banale da fare, ma non necessariamente la più furba, è di fare i rapporti incrementali per tutte le derivate che ti servono.

Linux1987
Ciao Raptorista , ho proceduto in questo modo : sono riuscito a ricavarmi le espressioni analitiche delle funzioni $r_i$ , e ho usato la diff del matlab per derivarle rispetto ai 6 parametri, ottenendo una matrice 6x6. Che ne pensi?
p.s. certe derivate analitiche vengono enormi.

Raptorista1
Secondo me è il modo giusto di fare. Se i conti sono troppo lunghi allora puoi usare qualche software per il calcolo simbolico per facilitarti la vita.

Linux1987
si si ho provveduto jn questo modo . però anche col simbolico di matlab e con la semplificazione vengono delle derivate lunghissimi che poi ho dovuto usare in linguaggio c. e per questo che mi chiedevo se vi era un metodo numerico più breve.

Raptorista1
Nessun metodo numerico può battere la conoscenza dell'espressione analitica

Linux1987
Allora definisco adesso la funzione di cui calcolare la Jacobiana. E mostrerò come ho proceduto:
Sia $f: R^3 -> R^3 $ e sia $ P \in R^3$ il vettore di componenti $X, Y,Z \in R $ la funzione $f$ é definita come :
$f_1=\alpha_u*(X/Z)-u_0$ e $f_2=\alpha_v*(Y/Z)-v_0$ e $f_3=\alpha_u*((X-b_L)/Z)-u_0$ con $u_0, v_0 ,\alpha_u,\alpha_v \in R $ parametri fissati. Sia $r_f: R^3->R^3$ una funzione tale che $r_f=y_k-f(M_k(m)*P_k)$ con $m=(\alpha,\beta,\gamma,t_x,t_y,t_z)$ vettore dei parametri di cui sopra che definiscono la matrice di rotazione $M_k(m)$ al passo k. Sia Sia $r_b: R^3->R^3$ una funzione tale che $r_b=y_(k+1)-f((M_k(m))^(-1)*P_(k+1))$ , la funzione $r_d$ viene definita come un vettore $\in R^6$ da $[r_f,r_b]^T$. Con $y_k$ e $y_(k+1) \in R^3$
Quello che devo fare è calcolare la Jacobiana di $(dr_d)/(dm)$.
Ho quindi scritto analiticamente ognuna delle tre funzioni che definiscono l'iesima componente delle due funzioni vettoriali sopra definite, per un totale di 6 funzioni $r_(f,i)$ con $ i=0..2 $ e $r_(b,i)$ con $ i=0..2 $. Per calcolare la Jacobiana ho derivato analiticamente ognuna di queste funzioni rispetto ai 6 parametri del vettore $m$ , ottenendo una matrice di dimensione 6x6. Che ne pensate?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.