[Mathematica - Maxima] sto sbagliando programma?
ciao, sto usando Maxima (che è la versione free di Mathematica) per fare una piccola simulazione, ma sono decisamente deluso dai tempi di elaborazione del programma, che a volte pure si blocca quando faccio girare la routine, con un incomprensibile errore
"Maxima encountered a Lisp error: Type-error in KERNEL::OBJECT-NOT-TYPE-ERROR-HANDLER: -39.45439552895794 "
(che però non esce sempre!)
Quello che devo fare è in massima parte:
1) calcolare la sigma e la media di una particolare gaussiana, in dipendenza da due particolari parametri z e k (la sigma e la media si calcolano con delle formule di senso fisico, su cui non mi dilungo, ma non sono troppo complesse)
2) divido lo spazio dei parametri z in N passi, calcolo le gaussiane, e plotto la somma di queste N gaussiane, avendo un particolare spettro
3) il passo 3 viene rifatto per diversi valori di un altro parametro discreto, k. sommo tutti gli spettri a diversi k per avere lo spettro finale che mi interessa plottare.
bene, non mi sembra complicato. però dividendo lo spazio dei parametri z in 50 e quello k in 10, il programma spesso esplode (con l'errore riportato sopra), o quando va bene impiega circa 10 minuti (su macbook pro). si tratta di calcolare 500 sigma e 500 medie, e poi fare 50x10 somme, è per questo che esistono i calcolatori. con 30x10 parametri va già meglio, ma per un'altra valutazione sono troppo pochi. e vorrei crescere almeno a 50x30, oltra ad aggiungere un peso specifico sulle gaussiane in dipendenza da [z,k] (altre 500 operazioni, aiuto!)
chiedo troppo da Maxima?
può migliorare la situazione acquisendo Mathematica? (la mia università ha anche la licenza, sono sempre stato solo un po' pigro a procurarmela)
oppure per una cosa del genere è meglio orientarsi su qualcosa di diverso, tipo Matlab o IDL?
grazie dei consigli!
"Maxima encountered a Lisp error: Type-error in KERNEL::OBJECT-NOT-TYPE-ERROR-HANDLER: -39.45439552895794 "
(che però non esce sempre!)
Quello che devo fare è in massima parte:
1) calcolare la sigma e la media di una particolare gaussiana, in dipendenza da due particolari parametri z e k (la sigma e la media si calcolano con delle formule di senso fisico, su cui non mi dilungo, ma non sono troppo complesse)
2) divido lo spazio dei parametri z in N passi, calcolo le gaussiane, e plotto la somma di queste N gaussiane, avendo un particolare spettro
3) il passo 3 viene rifatto per diversi valori di un altro parametro discreto, k. sommo tutti gli spettri a diversi k per avere lo spettro finale che mi interessa plottare.
bene, non mi sembra complicato. però dividendo lo spazio dei parametri z in 50 e quello k in 10, il programma spesso esplode (con l'errore riportato sopra), o quando va bene impiega circa 10 minuti (su macbook pro). si tratta di calcolare 500 sigma e 500 medie, e poi fare 50x10 somme, è per questo che esistono i calcolatori. con 30x10 parametri va già meglio, ma per un'altra valutazione sono troppo pochi. e vorrei crescere almeno a 50x30, oltra ad aggiungere un peso specifico sulle gaussiane in dipendenza da [z,k] (altre 500 operazioni, aiuto!)
chiedo troppo da Maxima?
può migliorare la situazione acquisendo Mathematica? (la mia università ha anche la licenza, sono sempre stato solo un po' pigro a procurarmela)
oppure per una cosa del genere è meglio orientarsi su qualcosa di diverso, tipo Matlab o IDL?
grazie dei consigli!
Risposte
Probabilmente ho inteso male, ma come fai a plottare la prima somma (quella sullo spazio delle $z$)? Puoi farlo solo per un particolare $k$.
Non conosco Maxima, però in Mathematica potresti fare così (per ottenere lo spettro totale):
- salvare in due vettori la discretizzazione dello spazio $z-k$, ad esempio con
- fare la somma e plottare (in una riga di codice!!):
In base alla mia esperienza, Mathematica è "bravo" sia coi calcoli simbolici che con quelli numerici, quindi non dovresti avere problemi, nemmeno aggiungendo il pesaggio. Il tempo impiegato è legato alla complessità computazionale di $mu$(Z[],K[[j]]) e $sigma$(Z[],K[[j]]).
Non conosco Maxima, però in Mathematica potresti fare così (per ottenere lo spettro totale):
- salvare in due vettori la discretizzazione dello spazio $z-k$, ad esempio con
Z = Table [z, {z, zmin, zmax, passo}] K = Table [k, {k, kmin, kmax, passo}]
- fare la somma e plottare (in una riga di codice!!):
plot [ $sum_(j=1)^("dim"K) $ $sum_(i=1)^("dim"Z) $ PDF [ NormalDistribution [ $mu$(Z[[i]],K[[j]]), $sigma$(Z[[i]],K[[j]]) ] , x ] , { x, xmin, xmax } ]
In base alla mia esperienza, Mathematica è "bravo" sia coi calcoli simbolici che con quelli numerici, quindi non dovresti avere problemi, nemmeno aggiungendo il pesaggio. Il tempo impiegato è legato alla complessità computazionale di $mu$(Z[],K[[j]]) e $sigma$(Z[],K[[j]]).
"elgiovo":
Probabilmente ho inteso male, ma come fai a plottare la prima somma (quella sullo spazio delle $z$)? Puoi farlo solo per un particolare $k$.
scusa, mi sono espresso male io. quella somma viene fatta per diversi valori di z, ovviamente.
(l'interesse è avere sia la somma sui k a z fissato e poi l' "integrale" totale su tutti i k e su tutti gli z)
il mio codice è equivalente al tuo, non ho discretizzato lo spazio a priori (MATLAB è più vector oriented, da come ho mi sembra di capire), ma fatto le somma sui k e sugli z in una funzione definita con due sommatorie, però mi sembra lo stesso.
proverò a vedere come funge così su matlab.
grazie a entrambi per i consigli.