[Matematica pura, fisica, chimica, ecc.: problemi di allenamento del cervello non legati in alcun modo al commercio - pagina 557

 

Sembra funzionare per l'immagine piatta. Mi sembra che funzionerà anche per il caso N-dimensionale. Ci sono obiezioni?

Mi sembra che sia il momento di scrivere uno script e controllarlo... :)

 

Bene, il vettore normale all'unità data può essere costruito più facilmente - basta sostituire ogni sua coordinata xi con -sqrt(1-xi^2). Questo è in realtà equivalente a una rotazione di 90 gradi nel piano del vettore lontano dall'asse i-esimo (cioè sostituiamo il coseno con -seno, otteniamo il coseno dell'angolo+pi/2). Dopodiché non resta che normalizzare il risultato.

Ma non è affatto detto che si possa ottenere un vettore normale a tutti gli altri dell'insieme in questo modo. Così come qualsiasi altro modo che seleziona un vettore normale tra tutte le varianti...

 
alsu:

Bene, il vettore normale all'unità data può essere costruito più facilmente - basta sostituire qualsiasi delle sue coordinate xi con -sqrt(1-xi^2). Questo equivale in realtà a ruotare di 90 gradi i poli del vettore lontano dall'asse i-esimo (cioè sostituiamo il coseno con il -seno, otteniamo il coseno dell'angolo+pi/2). Dopodiché non resta che normalizzare il risultato.

Ma non è affatto detto che si possa ottenere un vettore normale a tutti gli altri dell'insieme in questo modo. Così come qualsiasi altro modo che seleziona un vettore normale tra tutte le varianti...

Esattamente. Non nel caso generale.

--

Sembra che io abbia trovato una soluzione rapida. Quando mi sono seduto a scrivere e mi sono rilassato sull'algoritmo, è saltato fuori.

Quindi, dal vettore generato x1r, basta sottrarre la sua proiezione su x0 (cioè x0*sp(x0,x1r), dove sp() è il prodotto scalare).

In breve la formula è in una riga: x1 = x1r - x0*sp(x0,x1r);

:))

 
In breve la formula in una riga: x1 = x1r - x0*sp(x0,x1r);

:))

Sì, ma bisogna approssimarlo dopo.

Bene comunque in una linea: x1 = norma(x1r - x0*sp(x0,x1r))

 
MetaDriver:

Sembra funzionare per l'immagine piatta. Mi sembra che funzionerà anche per il caso N-dimensionale. Ci sono obiezioni?

Sembra che sia il momento di scrivere uno script e controllare... :)

Non c'è bisogno di scriverlo. Prova:

sX = (a1+b1,a2+b2); dX = (a1-b1,a2-b2);

Poiché i vettori a e b sono vettori unitari, il parallelogramma corrispondente è un rombo e le sue diagonali sono perpendicolari, quindi la somma e la differenza sono ortogonali tra loro. Quindi lo scambio di moduli equivale a girarne uno di 90 gradi a destra e l'altro a sinistra. In coordinate cartesiane possiamo esprimerlo semplicemente riordinando la prima e la seconda coordinata:

sXtr = (a2-b2,a1-b1); dXtr = (a2+b2,a1+b1)

=>

sXtr+dXtr = (2*a2,2*a1) è un vettore con modulo 2 e ovviamente ortogonale al vettore (a1,a2), cioè il vettore a. H.t.c.

 
Non resta che correre in un ciclo. for(i=0; i<InpVectorCount; i++) {....}
 
MetaDriver:
Non resta che correre in un ciclo. for(i=0; i<InpVectorCount; i++) {....}
No, si tratta ancora di selezionare inizialmente il giusto vettore "arbitrario", che alla fine darà l'ortogonalità a tutto l'insieme. Cioè l'arbitrario risulta non essere affatto arbitrario. Ancora una volta torniamo a come calcolare il vettore iniziale richiesto.
 
alsu:
No, si tratta ancora di scegliere inizialmente il giusto vettore "arbitrario", che darà l'ortogonalità a tutto l'insieme. Cioè l'arbitrario non è affatto arbitrario. Ancora una volta torniamo a come calcolare il vettore iniziale richiesto.
Stronzate. Controllo ad ogni passo. Se in qualsiasi passo della trasformazione un vettore diventa contiguo al successivo nell'insieme, generiamo di nuovo un vettore casuale iniziale e ripetiamo la procedura. Poiché questo caso è improbabile (con dimensione finita), è più facile (più economico) che sospettare immediatamente che sia linearmente dipendente (cercando il rango della matrice).
 
MetaDriver:
Stronzate. Solo controlli ad ogni passo. Se in qualsiasi passo della trasformazione un vettore diventa contraddittorio con il vettore successivo nell'insieme, generiamo nuovamente il vettore casuale iniziale e ripetiamo la procedura. Poiché questo caso è improbabile (con dimensione finita), è più facile (più economico) che sospettare immediatamente che sia linearmente dipendente (cercando il rango della matrice).
Può diventare non co-diretto, ma semplicemente ad un angolo indiretto rispetto a tutti o ad alcuni vettori
 
MetaDriver:
Stronzate. Solo controlli ad ogni passo. Se in qualsiasi passo della trasformazione un vettore diventa contraddittorio con il vettore successivo nell'insieme, generiamo nuovamente il vettore casuale iniziale e ripetiamo la procedura. Poiché questo caso è improbabile (con dimensione finita), è più facile (più economico) che sospettare immediatamente che sia linearmente dipendente (cercando il rango della matrice).
Ed è più economico perché il prodotto scalare deve ancora essere calcolato (dall'algoritmo). Se risulta essere uguale a uno, resettiamo all'inizio e ripetiamo il processo. Cioè ad ogni passo, basta controllare se(cp(a,b)! = 1.0) {}