Maxima restarted
un prompt di input: %i1 [al contrario gli eventuali output
saranno preceduti da %ox] attendente i nostri comandi [sul
sito leggo che in realtà le label per i prompt prima dell'ultima
versione erano Cx e Dx ma non mi pare
importante, comunque è possibile impostare i prompt tramite
inchar:label_voluta; e outchar:label_voluta;]. Maxima funziona sia da calcolatrice che da "calcolatore simbolico", ma procediamo per gradi.
NUMER: variabile booleana che obbliga alcune funzioni [il manuale non dice quali]
con argomenti numerici ad essere esplicitate numericamente [tranne l'esponenziale].
stringout(PATH,INIZIO,FINE)
Per caricarlo invece
batch(PATH);
+ - * / [prossimamente tabella con priorità operatori] oltre che i meno conosciuti [?]
%PI ed il numero di nepero indicato
con %E
makelist(espressione,variabile,valore di partenza, valore finale);
per esempio calcoliamoci il numero di Nepero:
e[n]:=(1+1/n)^n$
Nepero: makelist([x,e[x]],x,1,100),numer$
OPENPLOT_CURVES ([["{plotpoints 1}"], Nepero]);
exp( )
e viene rappresentata internamente da %E^x;
le variabili utili per il suo utilizzo sono DEMOIVRE:
che permette di passare ad una rappresentazione trigonometrica
della parte immaginaria di un esponenziale [%E^(%I*b)=COS(b)+%I*SIN(b)],
%ENUMER che insieme ad NUMER
obbliga maxima a esplicitare il valore numerico della espressione
coinvolgente gli esponenziali.
Esiste inoltre %EMODE che permette di semplificare
espressioni del tipo %E^(%I*%PI*X)
vect e poi si possono
effettuare le seguenti operazioni:
A: [a,b,c];
B: [d,e,f];
C: A~B;
express(C);
[b F - c e, c d - a F, a e - b d]
altrimenti come il sottoscritto vagherete per ore senza meta nel manuale per scoprire il perché.
(%i7) e1: x^2+y^2-1;
2 2
(%o7) y + x - 1
(%i8) e2: y-x;
(%o8) y - x
(%i9) ALGSYS ([e1,e2],[x,y]);
1 1 1 1
(%o9) [[x = - -------, y = - -------], [x = -------, y = -------]]
SQRT(2) SQRT(2) SQRT(2) SQRT(2)
limit(funzione,variabile,valore,direzione);
diff(espressione,variabile 1,numero di derivate di variabile 1,..., variabile n, numero derivate variabile n);
(%i5) eq:'diff(x,t,2)+a^2*x=0;
2
d x 2
(%o5) --- + a x = 0
2
dt
(%i6) ode2(eq,x,t);
Is a zero or nonzero?
nonzero;
(%o6) x = %K1 SIN(a t) + %K2 COS(a t)
(%i14) ic2(%o6,t=0,x=0,diff(x,t)=A);
A SIN(a t)
(%o14) x = ----------
a
si può vedere l'utilizzo di ic2 che serve per settare
le condizioni iniziali a variabile indipendente fissata
per la variabile dipendente e la sua derivata prima e avere restituiata
la soluzione appropriata (esiste anche ic1 utile per le equazioni di primo ordine).
SET_PLOT_OPTION ([PLOT_FORMAT, MGNUPLOT]);
come potete vedrere dall'immagine
set size square oppure set yrange [ymin:ymax]
per ottenere (bisogna usarli assieme pero`!) un grafico con le proporzioni
uguali (utile per grafici polari).
plot3d(exp(-x^2-y^2),[x,-5,5],[y,-5,5],[gnuplot_pm3d,true],[gnuplot_preamble,"set hidden3d;set palette gray"]);
PLOT2D([JACOBI_SN(x,0),JACOBI_SN(x,0.5),JACOBI_SN(x,1),JACOBI_SN(x,1.5),JACOBI_SN(x,2)],
[x,(-2)*%PI,2*%PI],[GNUPLOT_TERM,PS],[GNUPLOT_OUT_FILE,"/tmp/Maxima_plot.ps"],[GNUPLOT_PREAMBLE,"set xtics ('-2{/Symbol p}' -6.283, '0' 0, '2{/Symbol p}' 6.283, '{/Symbol p}' 3.14 , '-{/Symbol p}' -3.14);set xzeroaxis;set xtics axis;unset border"]);
plot2d([x^5,x,x^2,x^101],[x,-2,2],[gnuplot_preamble,"set grid ;set size square;set yrange [-2:2];set xzeroaxis;set title 'Grafico Funzioni Potenza'"]);
Siccome è ancora sotto sviluppo può succedere che i comandi vadano un pó per i fatti loro, eventualmente provate a dare i comandi in maiuscolo
Trovandomi a dover fare spesso calcoli con metriche varie e spazi non banali, risulta utile per me e i miei colleghi avere strumenti a disposizione per avere risultati certi in pocco tempo e Maxima permette tutto ció; il pacchetti ctensor e itensor aggiornati recentemente da Viktor Toth agiscono in cotal senso e permettono di calcolare (una volta data la metrica) tutti i tensori derivanti da essa secondo due filosofie di calcolo: il primo con un lavoro di componenti e il secondo a livello di indici;
(i1%) load(ctensor);
(o1%) /path/to/home/.maxima/ctensor.mac
nel caso non sia presente nel vostro sistema scaricatelo da Sourceforge; poi si puó immettere una metrica tramite
(%i2) csetup ();
Enter the dimension of the coordinate system:
2;
Do you wish to change the coordinate names?
n;
Do you want to
1. Enter a new metric?
2. Enter a metric from a file?
3. Approximate a metric with a Taylor series?
volete inserire a mano la metrica della sfera (attenzione che di default lui usa x e y come nomi di coordinate)
e quindi rispondete:
1;
Is the matrix 1. Diagonal 2. Symmetric 3. Antisymmetric 4. General
Answer 1, 2, 3 or 4 :
1;
Row 1 Column 1:
R^2;
Row 2 Column 2:
R^2*sin(x)^2;
Matrix entered.
Enter functional dependencies with DEPENDS or 'N' if none
n;
Do you wish to see the metric?
y;
[ 2 ]
[ R 0 ]
[ ]
[ 2 2 ]
[ 0 R SIN (y) ]
(%o2) DONE
Adesso che abbiamo la metrica possiamo sbizzarirci con tutti quei tensori che sognamo la notte: metrica inversa
(%i4) cmetric (all); Do you wish to see the metric inverse? y; [ 1 ] [ -- 0 ] [ 2 ] [ R ] (%t4) [ ] [ 1 ] [ 0 ---------- ] [ 2 2 ] [ R SIN (y) ] (%o4) DONEL'elenco dei tensori:
(%i26) depends(f,[x,y]);
(%o26) [f(x, y)]
(%i28) contragrad (f,g); (%o28) DONE (%i29) LISTARRAY (g); f f x y (%o29) [--, ----------] 2 2 2 x x SIN (y)
e lcs[i,j,k]=
ma si puó anche tentare di calcolare quelli covarianti tramite lriemann(dis)=
oppure uriemann()
:
(%i3) lriemann(all);
2
(%t3) lriem = SIN (y)
2, 2, 1, 1
(%o3) DONE
(%i4) riemann(all);
1
(%t4) riem = - --
1, 2, 1, 2 2
x
2
SIN (y)
(%t5) riem = -------
2, 2, 1, 1 2
x
(%o5) DONE
(%i13) ENTERTENSOR ()$ Enter tensor name: n; Enter a list of the covariant indices: [i]; Enter a list of the contravariant indices: [a,b]; Enter a list of the derivative indices: [h]; a b (%t13) n i,he` possibile avere già dei tensori fatti
tentex() (da usare avendo caricato preventivamente
il pacchetto omonimo).
for VARIABILE: VALORE_INIZIALE step INCREMENT thru LIMIT do BODY
for VARIABILE:
da cui prendiamo subito un esempio che ci fa capire la situazione:
(%i1) for i:0 step 1 thru 10 do print("la fattorizzazione di ",i," e` ",factor(i));
che restituisce
la fattorizzazione di 0 e` 0
la fattorizzazione di 1 e` 1
la fattorizzazione di 2 e` 2
la fattorizzazione di 3 e` 3
2
la fattorizzazione di 4 e` 2
la fattorizzazione di 5 e` 5
la fattorizzazione di 6 e` 2 3
la fattorizzazione di 7 e` 7
3
la fattorizzazione di 8 e` 2
2
la fattorizzazione di 9 e` 3
la fattorizzazione di 10 e` 2 5
(%o1) DONE
Ovviamente nulla serveirebbe se non fosse possibile interagire con il sistema:
è possibile richidere di inserire dati da console tramite la direttiva read(expr1,...,expr n) e readonly(expr1,...,exprn)
che aspettano per una immissione di dati da parte dell'utente
come si puó provare con questo script:
limite: read("Inserisci il valore limite della fattorizzazione");
FOR i FROM 0 THRU limite DO PRINT("la fattorizzazione di ",i,"e` ",FACTOR(i))$