Trasforma la formula matematica in codice (intersezione linea-linea)

3

Sto attraversando un periodo difficile per trasformare una formula matematica in codice. Posso risolverlo facilmente sulla carta, ma è difficile per me portarlo in forma di codice. È generalmente possibile portare una formula matematica direttamente in un programma o, in caso contrario, come può essere trasferita?

Prendendo, per esempio, il Teorema di Pitagora: a² + b² = c² . Avendo a e b definiti nel codice, è semplice applicare questa formula.

c = sqrt(pow(a, 2) + pow(b, 2))

Attualmente, sto attraversando un periodo difficile con l'intersezione della linea, che ho risolto su carta, nel mio programma. Supponendo che una linea sia definita come L: O + a * D , si può trovare l'intersezione di due linee impostandole come uguali.

L1: O1 + a * D1
L2: O2 + b * D2

=> O1 + a * D1 = O2 + b * D2

Usando una penna, avrei già definito i valori e posso risolvere l'equazione suddividendo l'equazione in tre sottoequazioni e applicando una semplice sostituzione (spero che tu possa leggere la mia scrittura a mano):

Il mio problema reale

... è che la sostituzione non può essere applicata algoritmicamente, o non so come fare. L'equazione L1 = L2 deve essere trasformata in una formula generalizzata che può essere tradotta direttamente in codice (come a² + b² = c² ), ma non so come.

Speravo in una spiegazione passo a passo (sia come risposta o collegamento) su come arrivare alla formula / algoritmo che sto cercando. So che ci sono molti siti web che descrivono l'intersezione di due linee, ma mi piacerebbe capire come trovare l'algoritmo da un punto di partenza matematico .

    
posta Niklas Rosenstein 26.04.2013 - 00:17
fonte

2 risposte

4

Come già suggerito nella tua domanda, c'è una grande differenza tra l'implementazione di una formula e l'implementazione di una routine di calcolo. La tua soluzione cartacea è una routine, non una formula.

  • Avevi bisogno di carta per scrivere numeri come risultati intermedi. Il tuo algoritmo avrà bisogno di qualcosa di simile. Gli algoritmi per risolvere sistemi di equazioni tipicamente manipolano una matrice (array 2D) di numeri. Metti i tuoi fattori di equazione in un array 2D e prova a descrivere le sottostazioni come un'operazione su quella matrice.

  • Quando risolvi questo problema sulla carta, prendi decisioni lungo il percorso. Per esempio. Scegli di combinare la prima e la terza equazione e risolvila verso R. Poi hai usato la seconda equazione per risolvere p. Questo non funzionerà sempre se ci sono alcuni fattori 0 nella tua equazione. Potrebbe essere necessario risolvere verso un'altra variabile o combinare le equazioni in un ordine diverso. L'algoritmo deve tenere conto di tutti questi scenari.

  • Il tuo problema è "sovradeterminato": in generale, 2 linee in 3D non si intersecano. Richiederà un "colpo fortunato" (caso speciale) affinché si incrocino. Il tuo esempio di carta capita di avere una soluzione. E capita di essere numeri rotondi: facile da controllare. Cosa accadrebbe se la prima soluzione per P fosse 1.0 e la seconda soluzione fosse 0.9999999? Sarebbe un errore di arrotondamento dell'algoritmo o il problema non avrebbe soluzione?

risposta data 26.04.2013 - 08:34
fonte
1

Probabilmente suggerirei di prendere un paio delle sotto-equazioni e vedere se esiste una soluzione unica che può essere usata per la terza linea. Ci sono alcuni casi speciali da gestire algoritmicamente:

  1. Se le due linee sono di fatto la stessa linea. Questo potrebbe essere facilmente risolto vedendo che D1 è un multiplo di D2. Nota che in questo caso, tutti i punti della linea sono l'intersezione.

  2. Caso standard: prendi la coppia superiore di equazioni per ottenere un sistema di 2 equazioni in 2 incognite che potrebbero essere risolte tramite l'aritmetica Matrix. È possibile calcolare un inverso di una matrice 2 x 2 e quindi ciò fornisce una soluzione se il determinante non è zero. Questo viene quindi applicato alle altre dimensioni per verificare che la soluzione sia effettivamente valida e, in tal caso, sia effettivamente una soluzione.

  3. Se le linee non si intersecano. Considera la linea 1 che attraversa (0,0,1) e ha pendenza (0,1,0) e la linea 2 che attraversa (1,0,0) e ha pendenza (0,0,1). Queste linee non si intersecano affatto poiché tutti i punti della prima riga hanno una coordinata x di 0 e la seconda linea ha una coordinata x di 1.

Almeno, questo è come gestirlo in modo programmatico. Potresti considerare la linea 1 che attraversa (a, b, c) con pendenza (d, e, f) e la linea 2 che attraversa (g, h, i) e con pendenza (j, k, l) e considera l'algebra per genera le formule per farlo nel codice.

    
risposta data 26.04.2013 - 00:37
fonte

Leggi altre domande sui tag