Programmazione con maple, goemetria
Ho il seguente esercizio:
Si scriva una procedura maple che accetti in input due coppie di punti (P1,P2) e (Q1,Q2) del piano Euclideo ℝ2 e dia in output, se possibile, un'isometria f(x)=Ax+v, tale che f(Pi)=Qi, i=1,2.
Io ho fatto in questo modo:
restart:with(geometry):with(linalg):
isometria:=proc(P,Q,R,S)
local X, Y, A, v, a, b, F, G;
F:=randvector(2); G:=randvector(2);
if norm(P-Q,2)<>norm(R-S,2) and norm(P-F,2)<>norm(R-G,2) then
ERROR(nonesisteun'isometriachemandaP∈R,Q∈SeF∈G);
end if;
X:=[evalm(P-Q),evalm(P-F)];
Y:=[evalm(R-S),evalm(R-G)];
A:=evalm(transpose(matrix(Y))&*inverse(transpose(matrix(X))));
v:=evalm(R-A&*P);
print(F); print(G);
print([simplify(A),simplify(v)]);
end proc;
Il problema è il seguente, il mio professore mi ha detto che i punti F e G, non devono essere qualsiasi, ma li deve determinare opportunamente la procedura, qualcuno saprebbe dirmi come modificare la procedura per fare in modo che ciò avvenga?
Grazie a presto
Si scriva una procedura maple che accetti in input due coppie di punti (P1,P2) e (Q1,Q2) del piano Euclideo ℝ2 e dia in output, se possibile, un'isometria f(x)=Ax+v, tale che f(Pi)=Qi, i=1,2.
Io ho fatto in questo modo:
restart:with(geometry):with(linalg):
isometria:=proc(P,Q,R,S)
local X, Y, A, v, a, b, F, G;
F:=randvector(2); G:=randvector(2);
if norm(P-Q,2)<>norm(R-S,2) and norm(P-F,2)<>norm(R-G,2) then
ERROR(nonesisteun'isometriachemandaP∈R,Q∈SeF∈G);
end if;
X:=[evalm(P-Q),evalm(P-F)];
Y:=[evalm(R-S),evalm(R-G)];
A:=evalm(transpose(matrix(Y))&*inverse(transpose(matrix(X))));
v:=evalm(R-A&*P);
print(F); print(G);
print([simplify(A),simplify(v)]);
end proc;
Il problema è il seguente, il mio professore mi ha detto che i punti F e G, non devono essere qualsiasi, ma li deve determinare opportunamente la procedura, qualcuno saprebbe dirmi come modificare la procedura per fare in modo che ciò avvenga?
Grazie a presto
Risposte
ok grazie mille, purtroppo l'esame lo devo fare con maple,
approposito anch'io vado in piscina due volte la settimana,
per me il nuoto è lo sport più salutare che esista
approposito anch'io vado in piscina due volte la settimana,
per me il nuoto è lo sport più salutare che esista
Ho trovato due metodi per arrivare allo stesso risultato. Quindi prima di tutto presento le equazioni al quale sono arrivato. $P_1$, $P_2$, $Q_1$ e $Q_2$ sono i punti in input. Siano quindi
$z = (P_1 - P_2) = ((z_x),(z_y)); \quad w = (Q_1 - Q_2) = ((w_x), (w_y));$
$a = (z*w)/(||z||^2) = (z_x w_x + z_y w_y)/(z_x^2 + z_y^2); \quad b = (Jz*w)/(||z||^2) = (z_x w_y - z_y w_x)/(z_x^2 + z_y^2).$
A questo punto la matrice $A$ è definita come segue
$A = ((a, -b), (b, a)),$
e il vettore $v$ è
$v = Q_1 - AP_1.$
DIMOSTRAZIONE CON I NUMERI COMPLESSI
Un metodo semplice per arrivare a questi risultati è quello di passare ai numeri complessi e risolvere il sistema. Ogni matrice $A \in SO(2)$ corrisponde ad un numero complesso $\alpha$ di norma unitaria. Il sistema che devi risolvere diventa quindi:
${(\alpha P_1 + v = Q_1), (\alpha P_2 + v = Q_2):}$
Sottraendo le due equazioni ottenendo
$\alpha (P_1 - P_2) = (Q_1 - Q_2)$
e usando le notazioni precedenti
$\alpha z = w.$
A questo punto la soluzione è immediata:
$\alpha = w/z = (w \bar{z})/(||z||^2) = ((w_x + iw_y)(z_x - iz_y))/(||z||^2) = ((w_x z_x + w_y z_y) + i(w_y z_x - w_x z_y))/(||z||^2) = a + ib.$
$v$ si può quindi a questo punto calcolare dalla prima equazione.
DIMOSTRAZIONE CON LE MATRICI
In questo caso si deve far ricorso ai vettori $Jz$ e $Jw$. Per il discorso che abbiamo fatto precedentemente vale la relazione:
$((a, -b), (b, a))((z_x, -z_y), (z_y, z_x)) = ((w_x, -w_y), (w_y, w_x))$
$((a, -b),(b, a)) = (1/(||z||^2))((w_x, -w_y), (w_y, w_x))((z_x, z_y), (-z_y, z_x))$
$((a, -b),(b, a)) = (1/(||z||^2))((w_x z_x + w_y z_y, w_x z_y - w_y z_x), (w_y z_x - w_x z_y, w_y z_y + w_x z_x)).$
$v$ si ottiene a questo punto dalla solita formula.
OSSERVAZIONI
Ho appena notato che in realtà, nonostante $A$ possa essere a priori una matrice ortogonale qualsiasi, ho dato per scontato che si trattasse di una matrice del gruppo $SO(2)$ nei miei calcoli. Si potrebbe anche ottenere una matrice con determinante negativo risolvendo
$((a, b), (b, -a))((z_x, -z_y), (z_y, z_x)) = ((w_x, w_y), (w_y, -w_x))$
$((a, b), (b, -a)) = (1/(||z||^2))((w_x, w_y), (w_y, -w_x))((z_x, z_y), (-z_y, z_x))$
$((a, b), (b, -a)) = (1/(||z||^2))((w_x z_x - w_y z_y, w_x z_y + w_y z_x), (w_y z_x + w_x z_y, w_y z_y - w_x z_x)).$
P.S. Anche se oggi ho principalmente nuotato, vado in piscina a fare apnea.
$z = (P_1 - P_2) = ((z_x),(z_y)); \quad w = (Q_1 - Q_2) = ((w_x), (w_y));$
$a = (z*w)/(||z||^2) = (z_x w_x + z_y w_y)/(z_x^2 + z_y^2); \quad b = (Jz*w)/(||z||^2) = (z_x w_y - z_y w_x)/(z_x^2 + z_y^2).$
A questo punto la matrice $A$ è definita come segue
$A = ((a, -b), (b, a)),$
e il vettore $v$ è
$v = Q_1 - AP_1.$
DIMOSTRAZIONE CON I NUMERI COMPLESSI
Un metodo semplice per arrivare a questi risultati è quello di passare ai numeri complessi e risolvere il sistema. Ogni matrice $A \in SO(2)$ corrisponde ad un numero complesso $\alpha$ di norma unitaria. Il sistema che devi risolvere diventa quindi:
${(\alpha P_1 + v = Q_1), (\alpha P_2 + v = Q_2):}$
Sottraendo le due equazioni ottenendo
$\alpha (P_1 - P_2) = (Q_1 - Q_2)$
e usando le notazioni precedenti
$\alpha z = w.$
A questo punto la soluzione è immediata:
$\alpha = w/z = (w \bar{z})/(||z||^2) = ((w_x + iw_y)(z_x - iz_y))/(||z||^2) = ((w_x z_x + w_y z_y) + i(w_y z_x - w_x z_y))/(||z||^2) = a + ib.$
$v$ si può quindi a questo punto calcolare dalla prima equazione.
DIMOSTRAZIONE CON LE MATRICI
In questo caso si deve far ricorso ai vettori $Jz$ e $Jw$. Per il discorso che abbiamo fatto precedentemente vale la relazione:
$((a, -b), (b, a))((z_x, -z_y), (z_y, z_x)) = ((w_x, -w_y), (w_y, w_x))$
$((a, -b),(b, a)) = (1/(||z||^2))((w_x, -w_y), (w_y, w_x))((z_x, z_y), (-z_y, z_x))$
$((a, -b),(b, a)) = (1/(||z||^2))((w_x z_x + w_y z_y, w_x z_y - w_y z_x), (w_y z_x - w_x z_y, w_y z_y + w_x z_x)).$
$v$ si ottiene a questo punto dalla solita formula.
OSSERVAZIONI
Ho appena notato che in realtà, nonostante $A$ possa essere a priori una matrice ortogonale qualsiasi, ho dato per scontato che si trattasse di una matrice del gruppo $SO(2)$ nei miei calcoli. Si potrebbe anche ottenere una matrice con determinante negativo risolvendo
$((a, b), (b, -a))((z_x, -z_y), (z_y, z_x)) = ((w_x, w_y), (w_y, -w_x))$
$((a, b), (b, -a)) = (1/(||z||^2))((w_x, w_y), (w_y, -w_x))((z_x, z_y), (-z_y, z_x))$
$((a, b), (b, -a)) = (1/(||z||^2))((w_x z_x - w_y z_y, w_x z_y + w_y z_x), (w_y z_x + w_x z_y, w_y z_y - w_x z_x)).$
P.S. Anche se oggi ho principalmente nuotato, vado in piscina a fare apnea.
Per quanto riguarda il codice è da un sacco che non uso Maple e quindi non sono certo sia corretto. Dovrebbe però essere qualcosa come
restart:with(geometry):with(linalg): isometria := proc(P, Q) local z, w, nz, a, b, A, v; z := P[1] - P[2]; w := Q[1] - Q[2]; if norm(z,2) <> norm(w,2) then ERROR(nonesisteisometria); end if; nz := z[1]^2 + w[1]^2; a := (z[1]*w[1] + z[2]*w[2])/nz; b := (z[1]*w[2] - z[2]*w[1])/nz; A := matrix(2,2, [a, -b, b, a]); v := evalm(Q[1] - A&*P[1]); print([simplify(A), simplify(v)]); end proc;
scusa ma continuo a non capire il tuo procedimento, non capisco perchè inserisci Jz Jw e perchè poni a e b uguali a quei valori, comunque ho provato a far eseguire la tua procedura e ho notato che le isometrie che trova sono diverse da quelle che ho trovato io con il mio procedimento, il mio metodo non può essere sbagliato perchè ho trovato i valori della matrice in maniera diretta, cioè risolvendo il sistema.
Ogni isometria nel piano può essere scritta nella forma $f(P) = AP + v$ dove $A \in O(2)$ è una matrice ortogonale, $v \in RR^2$ è un vettore qualsiasi e $P$ è un qualsiasi punto. Si può facilmente dimostrare che le matrici ortogonali di ordine $2$ possono essere solo in una delle seguenti forme:
1. $A = ((cos\theta, -sin\theta), (sint\theta, cos\theta))$
2. $A = ((cos\theta, sin\theta), (sin\theta, -cos\theta))$
Se la matrice è nella forma 1 allora ha determinante positivo (uguale a 1) e quindi appartiene a $SO(2) \cong U(1)$, mentre se è nella forma 2 si tratta di una riflessione. Nel primo caso a basi positivamente orientate corrispondono basi positivamente orientate, mentre nel secondo l'orientazione cambia.
Dati due punti non viene identificata univocamente la matrice $A$ dell'isometria perché a due punti corrisponde un solo vettore. Non è quindi chiaro se l'orientamento deve venire preservato o meno e ho quindi deciso di considerare le matrici $A$ con determinante positivo. Ecco che quindi la forma della matrice $A$ è abbastanza determinata. Ma in realtà potevo anche fare a meno di scrivere già la forma della matrice nella dimostrazione usando le matrici, perché questa forma veniva direttamente dalla richiesta di essere la matrice di passaggio tra le basi ${z, Jz}$ e ${w, Jw}$. La prima di queste basi è stata scelta in modo da avere un orientamento positivo e le due basi della stessa lunghezza per comodità. La seconda dipende invece dalla scelta della matrice $A$. In questo caso ho deciso che è una rotazione e quindi la base deve essere ortogonale e l'orientamento deve essere mantenuto lo stesso. Se avessi scelto la riflessione avrei dovuto invece scegliere la base ${w, -Jw}$ come immagine della prima. A questo punto i calcoli che ho fatto nella seconda dimostrazione sono i soliti per ottenere la matrice di passaggio da una base ad un altra.
La prima dimostrazione si basava invece sull'isomorfismo $SO(2) \cong U(1)$. Considerando quindi i vettori e i punti coinvolti come numeri complessi viene il sistema che ho scritto (con $\alpha$ al posto di $A$) e una volta ottenuto $\alpha = a + ib$ la matrice $A$ è semplicemente
$A = ((a, -b), (b, a)).$
Infatti, preso un punto $p = ((x),(y)) = x + iy$,
$Ap = \alpha p$
$((a, -b), (b, a))((x),(y)) = (a + ib)(x + iy)$
$((ax - by), (bx + ay)) = ax + iay + ibx - by = (ax - by) + i(ay + bx)$.
Sinceramente non vedo errori nel mio metodo e, viste le due dimostrazioni, sono abbastanza certo sia corretto. Ma se qualcuno vede degli errori sarei ovviamente felice di saperlo. Sei sicuro che il risultato sia veramente diverso? Hai controllato se ho fatto qualche errore nella scrittura del codice?
1. $A = ((cos\theta, -sin\theta), (sint\theta, cos\theta))$
2. $A = ((cos\theta, sin\theta), (sin\theta, -cos\theta))$
Se la matrice è nella forma 1 allora ha determinante positivo (uguale a 1) e quindi appartiene a $SO(2) \cong U(1)$, mentre se è nella forma 2 si tratta di una riflessione. Nel primo caso a basi positivamente orientate corrispondono basi positivamente orientate, mentre nel secondo l'orientazione cambia.
Dati due punti non viene identificata univocamente la matrice $A$ dell'isometria perché a due punti corrisponde un solo vettore. Non è quindi chiaro se l'orientamento deve venire preservato o meno e ho quindi deciso di considerare le matrici $A$ con determinante positivo. Ecco che quindi la forma della matrice $A$ è abbastanza determinata. Ma in realtà potevo anche fare a meno di scrivere già la forma della matrice nella dimostrazione usando le matrici, perché questa forma veniva direttamente dalla richiesta di essere la matrice di passaggio tra le basi ${z, Jz}$ e ${w, Jw}$. La prima di queste basi è stata scelta in modo da avere un orientamento positivo e le due basi della stessa lunghezza per comodità. La seconda dipende invece dalla scelta della matrice $A$. In questo caso ho deciso che è una rotazione e quindi la base deve essere ortogonale e l'orientamento deve essere mantenuto lo stesso. Se avessi scelto la riflessione avrei dovuto invece scegliere la base ${w, -Jw}$ come immagine della prima. A questo punto i calcoli che ho fatto nella seconda dimostrazione sono i soliti per ottenere la matrice di passaggio da una base ad un altra.
La prima dimostrazione si basava invece sull'isomorfismo $SO(2) \cong U(1)$. Considerando quindi i vettori e i punti coinvolti come numeri complessi viene il sistema che ho scritto (con $\alpha$ al posto di $A$) e una volta ottenuto $\alpha = a + ib$ la matrice $A$ è semplicemente
$A = ((a, -b), (b, a)).$
Infatti, preso un punto $p = ((x),(y)) = x + iy$,
$Ap = \alpha p$
$((a, -b), (b, a))((x),(y)) = (a + ib)(x + iy)$
$((ax - by), (bx + ay)) = ax + iay + ibx - by = (ax - by) + i(ay + bx)$.
Sinceramente non vedo errori nel mio metodo e, viste le due dimostrazioni, sono abbastanza certo sia corretto. Ma se qualcuno vede degli errori sarei ovviamente felice di saperlo. Sei sicuro che il risultato sia veramente diverso? Hai controllato se ho fatto qualche errore nella scrittura del codice?
molte cose che scrivi non mi sono chiare, i motivi possono essere due, uno è che è da parecchio tempo che non vedo queste cose, l'altro è che le cose le esponi in maniera diversa da come le ho studiate io.
Comunque a parte questo la procedura che hai scritto rispetta fedelmente ciò che hai scritto nella dimostrazione e quindi è abbastanza chiara. Però alla fine visto che la matrice che si ottiene è comunque la stessa che trovo nella mia procedura, siccome entrambi abbiamo considerato il determinante della matrice uguale a 1, nonostante sia diverso il metodo della dimostrazione, dovremmo ottenere il medesimo risultato, invece andando ad implementare su maple il tuo algoritmo, nel mio caso esce un'isometria e nel tuo caso ne esce un'altra. Ammesso che la tua dimostrazione sia corretta, molto probabilmente ci sarà qualche errore nell'algoritmo da te presentato, forse l'errore sta nel calcolo di z, w, nz, a, b
Comunque a parte questo la procedura che hai scritto rispetta fedelmente ciò che hai scritto nella dimostrazione e quindi è abbastanza chiara. Però alla fine visto che la matrice che si ottiene è comunque la stessa che trovo nella mia procedura, siccome entrambi abbiamo considerato il determinante della matrice uguale a 1, nonostante sia diverso il metodo della dimostrazione, dovremmo ottenere il medesimo risultato, invece andando ad implementare su maple il tuo algoritmo, nel mio caso esce un'isometria e nel tuo caso ne esce un'altra. Ammesso che la tua dimostrazione sia corretta, molto probabilmente ci sarà qualche errore nell'algoritmo da te presentato, forse l'errore sta nel calcolo di z, w, nz, a, b
Che cosa non ti è chiaro esattamente? Mi mostreresti un esempio in cui le isometrie sono diverse e i risultati ottenuti?
allora per esempio nel mio caso
isometria([[0,0],[-1,0]],[[0,0],[-1,0]]); mi esce la matrice A la matrice identica e il vettore v il vettore nullo, mentre nel tuo caso esce la matrice A=(1/2)*I dove con I indico la matrice identica e il vettore v il vettore nullo.
Altro esempio
isometria([[1,0],[3,5]],[[2,6],[4,11]]); a me esce A=I e v=(1,6) mentre nella tua procedura esce A=(29/8)*I e v=(-13/8,6).
Non mi è chiaro perchè consideri (z,Jz) e (w,Jw) e poi perchè li valuti e perchè li consideri
isometria([[0,0],[-1,0]],[[0,0],[-1,0]]); mi esce la matrice A la matrice identica e il vettore v il vettore nullo, mentre nel tuo caso esce la matrice A=(1/2)*I dove con I indico la matrice identica e il vettore v il vettore nullo.
Altro esempio
isometria([[1,0],[3,5]],[[2,6],[4,11]]); a me esce A=I e v=(1,6) mentre nella tua procedura esce A=(29/8)*I e v=(-13/8,6).
Non mi è chiaro perchè consideri (z,Jz) e (w,Jw) e poi perchè li valuti e perchè li consideri
Credo sia un problema del codice in Maple. Ho provato a risolverli a mano e a me i risultati vengono corretti. Trattandosi semplicemente di calcoli non scrivo i dettagli. In entrambi i casi viene comunque $z = w$ e quindi $a = (z * w)/(||z||^2) = 1$ e $a = (Jz * w)/(||z||^2) = 0$. Nota che $Jz * w$ è uguale all'ultima componente del prodotto vettoriale. È quindi uguale a $Jz * w = ||z||||w||sin\alpha$ dove $\alpha$ è l'angolo compreso tra i due vettori ed è antisimmetrico. In inglese prende ogni tanto il nome di "perp dot product".
EDIT: Ho trovato l'errore
avrebbe dovuto essere
È infatti la norma al quadrato di $z$ e non ha senso che partecipi anche $w$ nel calcolo.
EDIT: Ho trovato l'errore
nz := z[1]^2 + w[1]^2;
avrebbe dovuto essere
nz := z[1]^2 + z[2]^2;
È infatti la norma al quadrato di $z$ e non ha senso che partecipi anche $w$ nel calcolo.
Esistono diversi modi di interpretare una trasformazione lineare. Un primo modo è quello di vederle come una mappa che manda un punto o un vettore in un altro punto o vettore dello spazio. In questa interpretazione il sistema di riferimento rimane invariato e si spostano i punti. Se per esempio i due punti che stai considerando sono i vertici di un oggetto, noi stiamo osservando il movimento di questo oggetto (ma noi stiamo fermi). Un secondo punto di vista è quello di far variare il punto di riferimento. Non sono cioè gli oggetti a muoversi, ma noi che li osserviamo. Matematicamente non c'è differenza tra le due cose, ma a volte conviene una interpretazione invece che un'altra. In questo caso ho interpretato la trasformazione $A$ come la trasformazione che mappa la base ${z, Jz}$ in ${w, Jw}$. Su qualsiasi libro di algebra lineare dovresti comunque trovare una lunga trattazione su questo punto di vista.
infatti adesso effettuata questa correzione, vengono gli stessi risultati, questo vuol dire che il ragionamento fatto da te è esatto. Però il problema è che se non capisco il tuo ragionamento non posso far vedere la procedura al mio professore.
l'unica cosa che non capisco è per quale motivo a := (z[1]*w[1] + z[2]*w[2])/nz;
b := (z[1]*w[2] - z[2]*w[1])/nz;
Se riesco a capire questo allora posso mostrare la procedura al mio professore
b := (z[1]*w[2] - z[2]*w[1])/nz;
Se riesco a capire questo allora posso mostrare la procedura al mio professore
Bhe, hai capito almeno perché viene in quel modo usando i numeri complessi? Nell'altro caso si tratta solo di calcoli una volta deciso che ${z, Jz}$ va a finire in ${w, Jw}$.
no purtroppo, non capisco da dove prendi quei Jz e Jw, non ci sarebbe un altro modo per spiegarlo?
praticamente mi interessa capire questo, cioè perchè a e b li hai calcolati in questo modo, cioè in parole povere da dove la ricavi questa formula?
"apatriarca":
$a = (z*w)/(||z||^2) = (z_x w_x + z_y w_y)/(z_x^2 + z_y^2); \quad b = (Jz*w)/(||z||^2) = (z_x w_y - z_y w_x)/(z_x^2 + z_y^2).$
.
Quelle formule si possono anche ricavare nel modo seguente. Se $\alpha$ è l'angolo tra i vettori $z$ e $w$ allora la matrice $A$ deve necessariamente essere la rotazione di angolo $\alpha$. La matrice è quindi semplicemente:
$A = ((\cos\alpha, -\sin\alpha), (\sin\alpha, \cos\alpha)).$
Siccome $||z||=||w||$ perché la trasformazione è una isometria, allora
$cos\alpha = (z*w)/(||z||||w||) = (z*w)/(||z||^2)$
e per via della relazione tra il perp dot product $Jz*w$ e il prodotto vettoriale ($(z_x, z_y, 0)x(w_x, x_y, 0) = (0, 0, z_xw_y - z_yw_x) = (0, 0, Jz*w)$) si ottiene anche
$sin\alpha = (Jz*w)/(||z||||w||) = (Jz*w)/(||z||^2)$
Non credo di poter in effetti arrivare ad una dimostrazione più semplice.
$A = ((\cos\alpha, -\sin\alpha), (\sin\alpha, \cos\alpha)).$
Siccome $||z||=||w||$ perché la trasformazione è una isometria, allora
$cos\alpha = (z*w)/(||z||||w||) = (z*w)/(||z||^2)$
e per via della relazione tra il perp dot product $Jz*w$ e il prodotto vettoriale ($(z_x, z_y, 0)x(w_x, x_y, 0) = (0, 0, z_xw_y - z_yw_x) = (0, 0, Jz*w)$) si ottiene anche
$sin\alpha = (Jz*w)/(||z||||w||) = (Jz*w)/(||z||^2)$
Non credo di poter in effetti arrivare ad una dimostrazione più semplice.
adesso ho capito, grazie per le delucidazioni, in effetti queste cose in parte le ho viste in fisica matematica e in parte in geometria, diciamo che non me le ricordavo.
ho passato l'idoneità di maple con Antonio Lotta, grazie a tutti quelli che mi hanno aiutato

Bravo! Con chi farai l'altro modulo?
l'altro modulo l'ho già fatto con Nardozza