Mathematica, estrarre soluzione equazione algebrica.
Salve,
sto cercando di estrarre la soluzione di un'equazione cubica in w e memorizzarla in una variabile w1.
Cerco di spiegarmi meglio:
Ho un'equazione cubica in w, es. $w^3 -w^2 * wb - [w0^2 n0^2 + [wf(t)]^2]w + w0^2 wb n0^2$.
Risolvenda, dopo aver specificato la dipendenza dal tempo di wf(t), con il comando Solve[eq==0, w] ottengo 3 soluzioni simboliche che sono funzione del tempo e dei parametri w0, n0 e wb.
Di queste soluzioni devo estrarne una (la seconda) e memorizzarla in una variabile da chiamare w1.
Ho provato con il seguente codice:
Ma non funziona (nella soluzione compare effettivamente la w1 che desidero, ma non la sostituisce come valore effettivo ma la lascia come w tendente a).
Qualcuno mi può aiutare? Grazie mille.
Saluti
sto cercando di estrarre la soluzione di un'equazione cubica in w e memorizzarla in una variabile w1.
Cerco di spiegarmi meglio:
Ho un'equazione cubica in w, es. $w^3 -w^2 * wb - [w0^2 n0^2 + [wf(t)]^2]w + w0^2 wb n0^2$.
Risolvenda, dopo aver specificato la dipendenza dal tempo di wf(t), con il comando Solve[eq==0, w] ottengo 3 soluzioni simboliche che sono funzione del tempo e dei parametri w0, n0 e wb.
Di queste soluzioni devo estrarne una (la seconda) e memorizzarla in una variabile da chiamare w1.
Ho provato con il seguente codice:
eq = (w)^3 - (w)^2 wb - ((w0)^2 (n0)^2 + (wf)^2)w + (w0)^2 (wb) (n0)^2;
wf = (wp0)^2 Exp[-b*t];
Soluzioni = Solve[eq == 0, w] // Flatten
w1 = Soluzioni[[1]]
Ma non funziona (nella soluzione compare effettivamente la w1 che desidero, ma non la sostituisce come valore effettivo ma la lascia come w tendente a).
Qualcuno mi può aiutare? Grazie mille.
Saluti
Risposte
Quella freccia non vuol dire che la soluzione tende a quello che è scritto dopo, ma è una regola di sostituzione.
Praticamente è un'espressione che puoi applicare ad un'altra espressione ottenendo come risultato la sostituzione di w con la soluzione che hai trovato.
Quindi se vuoi ottenere la funzione che puoi graficare devi usare l'operatore di sostituzione /. in questo modo:
oppure se hai definito una funzione di w chiamata ad esempio f:
Allo stesso modo se vuoi assegnare i parametri senza dover sostituire a mano basta fare:
e così via.
Praticamente è un'espressione che puoi applicare ad un'altra espressione ottenendo come risultato la sostituzione di w con la soluzione che hai trovato.
Quindi se vuoi ottenere la funzione che puoi graficare devi usare l'operatore di sostituzione /. in questo modo:
sol=w/.w1
oppure se hai definito una funzione di w chiamata ad esempio f:
sol=f[w]/.w1
Allo stesso modo se vuoi assegnare i parametri senza dover sostituire a mano basta fare:
g=sol/.wb->0.3
e così via.
Grazie mille della risposta, ma purtroppo ancora non sono riuscito a risolvere.
Ho risolto l'equazione in w, e ho trovato 3 soluzioni. La prima l'ho attribuita ad una variabile w1. Questa variabile l'ho inserita all'interno di una funzione chiamata RapportoCampiElettrici.
Ho attribuito dei valori a tutti i parametri che compaiono nell'espressione (e ho anche specificato l'istante di tempo in cui mi interessa il calcolo numerico della funzione), ma purtroppo la soluzione ancora ha qualche problema.
Ora, nella output, anzichè esserci la soluzione in cui compare "w-->15.02", c'è la soluzione in cui compare "15.02-->15.02".
Metto uno screenshot, così forse riesco a spiegare meglio il mio problema (nell'immagine, ho eliminato l'attribuzione dei valori ai parametri).

Grazie ancora della disponibilità
Ho risolto l'equazione in w, e ho trovato 3 soluzioni. La prima l'ho attribuita ad una variabile w1. Questa variabile l'ho inserita all'interno di una funzione chiamata RapportoCampiElettrici.
Ho attribuito dei valori a tutti i parametri che compaiono nell'espressione (e ho anche specificato l'istante di tempo in cui mi interessa il calcolo numerico della funzione), ma purtroppo la soluzione ancora ha qualche problema.
Ora, nella output, anzichè esserci la soluzione in cui compare "w-->15.02", c'è la soluzione in cui compare "15.02-->15.02".
Metto uno screenshot, così forse riesco a spiegare meglio il mio problema (nell'immagine, ho eliminato l'attribuzione dei valori ai parametri).

Grazie ancora della disponibilità
C'è qualche problema di sostituzioni, anche se al momento non riesco chiaramente a vedere dove.
Se metti online il notebook dove fai questi conti posso darci un'occhiata e vedere se riesco a risolvere.
Se metti online il notebook dove fai questi conti posso darci un'occhiata e vedere se riesco a risolvere.
eredir, hai mp.
Grazie
Grazie
Mi sembra che il problema sorga dal fatto che nella regola di sostituzione la variabile da rimpiazzare è w, mentre nella tua espressione quello che vorresti rimpiazzare è w1.
Quindi basta sostituire w1 con w:
Questa espressione ritorna correttamente un valore numerico.
Quindi basta sostituire w1 con w:
RappCampiElettrici = (wb - w)/(wb - w0) w/w0 Sqrt[((wb (w0)^2 (n0)^2 + wb (w0)^2 - 2 (w0)^3))/((wb (w0)^2 (n0)^2 + wb (w)^2 - 2 (w)^3))] //. {w1, wb -> 1, wp0 -> 1.5, w0 -> 2, b -> 1, t -> 3}
Questa espressione ritorna correttamente un valore numerico.
Perfetto, ora torna anche a me.
Grazie ancora dell'aiuto e della disponibilità.
Grazie ancora dell'aiuto e della disponibilità.
Visto la tua competenza e gentilezza, mi permetto di proporre un altro problema attinente al precedente.
Una volta fissati i valori dei parametri numerici (w0 = 1, wb = 100, wp0 = 150, b = 0.01), ottengo due diversi valori per il rapporto tra campi elettrici all'istante t=1000, se scrivo:
O se scrivo:
Nel secondo caso ottengo la soluzione numerica riportata nel libro da dove ho preso le formule (ossia $9.96$), mentre nel primo caso ottengo un numero complesso ($-11.6045 - 6.81759*(10)^(-15)i$)
Il problema è che graficando l'andamento di RappCampiElettrici in funzione del tempo (che è quello che mi interessa), ottengo un andamento simile al grafico riportato nel libro, ma con i valori numerici sballati. Ad esempio, per t=1000 sul grafico c'è un valore negativo, quando io mi aspetto che debba valere 9.96.
Lo stesso identico problema lo ottengo nel caso del rapporto tra campi magnetici e nel rapporto tra densità di potenze.
Dove sbaglio?
Grazie mille
Saluti
p.s. Ho un po' modificato il file .nb; se ti dovesse servire l'ultima versione la uppo su rapidshare.
Una volta fissati i valori dei parametri numerici (w0 = 1, wb = 100, wp0 = 150, b = 0.01), ottengo due diversi valori per il rapporto tra campi elettrici all'istante t=1000, se scrivo:
RappCampiElettrici//.t->1000
O se scrivo:
t=1000;
RappCampiElettrici
Nel secondo caso ottengo la soluzione numerica riportata nel libro da dove ho preso le formule (ossia $9.96$), mentre nel primo caso ottengo un numero complesso ($-11.6045 - 6.81759*(10)^(-15)i$)
Il problema è che graficando l'andamento di RappCampiElettrici in funzione del tempo (che è quello che mi interessa), ottengo un andamento simile al grafico riportato nel libro, ma con i valori numerici sballati. Ad esempio, per t=1000 sul grafico c'è un valore negativo, quando io mi aspetto che debba valere 9.96.
Lo stesso identico problema lo ottengo nel caso del rapporto tra campi magnetici e nel rapporto tra densità di potenze.
Dove sbaglio?
Grazie mille
Saluti
p.s. Ho un po' modificato il file .nb; se ti dovesse servire l'ultima versione la uppo su rapidshare.
Il problema è sicuramente dovuto al fatto che nel fare i conti il kernel non assume che le variabili in gioco siano reali, quindi si porta dietro una piccola parte complessa che rappresenta un possibile errore di approssimazione.
Purtroppo al momento non ricordo come si ovvia a questo problema, ci penso un po' e se mi viene in mente qualcosa te lo farò senz'altro sapere.
Più che altro non ottengo i tuoi risultati con i due metodi.
Ho utilizzato questo codice, forse ho trascritto qualcosa male:
Ho inserito il tutto in un modulo, poichè ripetendo il conto rimanevano assegnazioni precendenti che creavano problemi.
Ottengo in entrambi i casi il risultato $1.09922*10^(-15)-0.00165175 i$.
Purtroppo al momento non ricordo come si ovvia a questo problema, ci penso un po' e se mi viene in mente qualcosa te lo farò senz'altro sapere.
Più che altro non ottengo i tuoi risultati con i due metodi.
Ho utilizzato questo codice, forse ho trascritto qualcosa male:
Module[{eq, wf, sol, n0, t}, eq = (w)^3 - (w)^2 wb - ((w0)^2 (n0)^2 + (wf)^2) w + (w0)^2 (wb) (n0)^2; wf = (wp0)^2 Exp[-b*t]; sol = Solve[eq == 0, w] // Flatten; w1 = sol[[1]]; n0 = Sqrt[1 - (wp0)^2/(w0)^2/(1 - wb/w0)]; RappCampiElettrici = (wb - w)/(wb - w0) w/w0 Sqrt[((wb (w0)^2 (n0)^2 + wb (w0)^2 - 2 (w0)^3))/((wb (w0)^2 (n0)^2 + wb (w)^2 - 2 (w)^3))] //. {w1, w0 -> 1, wb -> 100, wp0 -> 150, b -> 0.01, t -> 1000} ]
Ho inserito il tutto in un modulo, poichè ripetendo il conto rimanevano assegnazioni precendenti che creavano problemi.
Ottengo in entrambi i casi il risultato $1.09922*10^(-15)-0.00165175 i$.
Allora, il codice l'ho corretto perchè avevo fatto degli errori.
wf è uguale alla radice quadrata di quell'espressione.
La soluzione da estrarre è la 2, ossia sol[[2]].
Comunque ti uppo e ti mando il link del file .nb aggiornato.
Grazie ancora per la pazienza.
Saluti
wf = (wp0)^2 Exp[-b*t];
wf è uguale alla radice quadrata di quell'espressione.
w1 = sol[[1]];
La soluzione da estrarre è la 2, ossia sol[[2]].
Comunque ti uppo e ti mando il link del file .nb aggiornato.
Grazie ancora per la pazienza.
Saluti
Con queste correzioni ottengo il tuo risultato (lo stesso in entrambi i modi).
Tuttavia ho notato che utilizzando la sol[[3]] si ottiene $9.96213+2.10975*10^(-14)i$, sicuro che non sia quella giusta?
Una soluzione rudimentale ma efficace può essere aggiungere un "RappCampiElettrici = Re[RappCampiElettrici]" alla fine.
Tuttavia ho notato che utilizzando la sol[[3]] si ottiene $9.96213+2.10975*10^(-14)i$, sicuro che non sia quella giusta?
Una soluzione rudimentale ma efficace può essere aggiungere un "RappCampiElettrici = Re[RappCampiElettrici]" alla fine.