PROBLEMA DI MATHEMATICA CON I VETTORI

PRINCIPIANTE2008
Supponete di dover risolvere un'equazione con determinati coefficienti (a1, a2, a3,...an) con il comando findroot di mathematica per trovare la variabile xa. Ipotizzate di dover calcolare anche xb, xc, xd,... xm in modo automatico ovvero senza dover ogni volta sostituire i valori accanto alle variabili a1,... ,an con quelle di b1, ...,bn per il calcolo della variabile xb e via di seguito fino a xm. Quale tipo di listato potrebbe avere questo programma?

Come posso implementare questo calcolo in excel e matlab?

Ciao e grazie

P.S.: Ho gia postato una domanda simile nella sezione UNIVERITA' ma non mi ha risposto nessuno quindi ho deciso di riprovare qui. :roll:

:(

Risposte
Eredir
Con Mathematica puoi fare così:
Module[{c, f, n, m},
 n = 3; m = 4;
 c = {{2, 1, 8}, {2, 1, 1}, {6, 3, 1}, {7, 9, 2}};
 For[i = 1, i <= m, i++,
  f = (#1 x^7 + #2 x + #3) & @@ c[[i]];
  Print["Soluzione ", i, ": ", FindRoot[f == 0, {x, 0}]]
  ]
 ]


Ho inserito il tutto in un modulo per non dare impiccio ad eventuali variabili in uso.
Il costrutto f = (#1 x^7 + #2 x + #3) & @@ c[]; semplicemente crea una funzione pura del tipo $ax^7+bx+c$, a cui poi applica i coefficienti che si trovano nella i-esima posizione del vettore c.

In Excel e Matlab non ti saprei dire, anche se con un po' di impegno immagino sia possibile.

PRINCIPIANTE2008
GRAZIE MILLE! HO ADATTATO IL TUO LISTATO AL MIO CASO E FUNZIONA VERAMENTE ALLA GRANDE!

Ho solo un ultimo problema che definirei marginale ma ugualmente importante. Ho aggiunto al listato le seguenti espressioni:

", AccuracyGoal -> 30, WorkingPrecision -> 30, MaxIterations -> 30"

però fra alcune delle soluzioni mi compare il seguente messaggio:

FindRoot::"cvnwt": "Newton's method failed to converge to the prescribed \
accuracy after \!\(30\) iterations."


oppure quest'altro:

FindRoot::"cvnwt": "Newton's method failed to converge to the prescribed \
accuracy after \!\(30\) iterations."
General::"stop": "Further output of \!\(FindRoot :: \"cvnwt\"\) will be \
suppressed during this calculation."


Dunque faccio salire il valore 30 a 300, poi a 3000 ma il problema persiste.

Potresti darmi una breve descrizione che mi permetta di scegliere in modo opportuno i 3 valori relativi alla precisione del calcolo?

A presto

SPETTACOLARE IL SITO, STUPENDE LE PERSONE CHE LO USANO E SEMPLICEMENTE MERAVIGLIOSO AVERLO TROVATO... :-D

Eredir
Credo che anche aumentando il numero di iterazioni non ce la faccia poichè il numero di cifre con cui lavora è troppo basso, dovresti alzare WorkingPrecision per migliorarne la bontà.
In generale non ti saprei dire come scegliere i tre parametri in maniera da ottimizzare il risultato, forse puoi trovare qualcosa nella documentazione presente sul sito della Wolfram, ma in ogni caso non credo sia una questione semplice da affrontare.

PRINCIPIANTE2008
Ci deve essere un metodo semplice per togliere quegli errori e aumentare la precisione di default! :( Usando solo il comando WorkingPrecision non risolvo il problema. Ho però delle altre domande su mathematica da farti:

1) Come si fa a catalogare la soluzione? Ti faccio un esempio:

Supponi che con il comando Solve (non é lo stesso problema di sopra purtroppo) io ottenga 8 soluzioni differenti:
6 complesse
1 reale positiva
1 reale negativa
Come faccio a dire a Mathematica di buttare via tutte le soluzioni complesse e di tenere solo quella reale positiva? (Con "tenere" intendo "visualizzare".)

2) Ci sono differenze sostanziali tra la mia versione (4.0) e l'ultima?

Ciao e grazie

Eredir
"PRINCIPIANTE2008":
Ci deve essere un metodo semplice per togliere quegli errori e aumentare la precisione di default! :( Usando solo il comando WorkingPrecision non risolvo il problema.


Ti consiglio di vedere sulla documentazione, ci sono diversi esempi da cui prendere spunto.

"PRINCIPIANTE2008":
1) Come si fa a catalogare la soluzione? Ti faccio un esempio:

Supponi che con il comando Solve (non é lo stesso problema di sopra purtroppo) io ottenga 8 soluzioni differenti:
6 complesse
1 reale positiva
1 reale negativa
Come faccio a dire a Mathematica di buttare via tutte le soluzioni complesse e di tenere solo quella reale positiva? (Con "tenere" intendo "visualizzare".)


Non mi pare ci siano opzioni esplicite per farlo, ma basta un po' di codice per risolvere:
Module[{sol},
 sol = Solve[x^3 - x^2 - x + 2 == 0, x];
 For[i = 1, i <= 3, i++,
  If[Im[x /. sol[[i]]] == 0 && Re[x /. sol[[i]]] > 0,
   Print[x /. sol[[i]]]
  ]
 ]
]


La variabile sol contiene le regole di sostituzione con le soluzioni, mentre il ciclo va da 1 fino al numero di soluzioni dell'equazione.
Il primo check controlla che il numero non sia complesso mentre il secondo che sia positivo.
Infine stampa la soluzione che supera i controlli, qui ovviamente ti conviene modificare in base a quello che ti interessa fare, come ad esempio creare una nuova regola di sostituzione da applicare a qualche espressione.

"PRINCIPIANTE2008":
2) Ci sono differenze sostanziali tra la mia versione (4.0) e l'ultima?


Ti conviene darti un'occhiata alla presentazione della versione 6.
Chiaramente c'è un bel po' di roba nuova, ma dipende in ogni caso da cosa ti interessa farci.

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