Maxima 1/...

Da CdM_unimore.

Introduzione al manipolatore algebrico Maxima

Maxima è un programma opensource che permette di manipolare formule algebriche mantenendole parametriche, ovvero senza passare al numerico.

E' utilizzabile come un vero e proprio linguaggio di programmazione interpretato (non compilato come ad es. "il C"). Dietro l'interfaccia grafica che noi vediamo, vi è un server che riceve i comandi,li interpreta, li esegue e li elabora uno alla volta restituendo un risultato. Nei linguaggi compilati invece, l'intero comando sarebbe stato tradotto in blocco in linguaggio macchina e risolto in blocco.

Per scaricare e utilizzare il software Maxima sul proprio pc occorre andare nella sezione download del sito http://maxima.sourceforge.net/ e scegliere la versione adatta al proprio sistema operativo. Nel suddetto sito si consiglia, per eventuali chiarimenti o approfondimenti, di consultare la sezione Documentation, in particolare Maxima by Example (http://www.csulb.edu/~woollett/) e Minimal Maxima (http://maxima.sourceforge.net/docs/tutorial/en/minimal-maxima.pdf).

Avviare maxima sulle postazioni dei laboratori - BACKUP NEL CASO NON FUNZIONI IN LOCALE

Aprire un terminale.

Collegarsi via secure shell al server di appoggio,
zauker.ing.unimo.it
con forwarding del protocollo grafico.

Utilizzare le credenziali di accesso di ateneo (LDAP ateneo); il nome utente viene passato al server in forma implicita.

ssh -X zauker.ing.unimo.it

Inserire quindi la password di posta/esse3 di ateneo. Si apre un terminale sul server remoto, con possibilita di avviare programmi. Nello specifico, avviamo il manipolatore algebrico MAXIMA battendo:

wxmaxima &
ove
&
indica l'esecuzione del programma in background, ossia liberando il terminale in modo che possa accogliere successivi comandi.

NOTA BENE: Non chiudere il terminale con cui si è avviato Maxima; tale terminale infatti risulta 'padre' del processo Maxima, e nei sistemi unix 'uccidendo' il processo padre si uccidono in cascata tutti i processi 'figli'. Se Maxima si blocca, in alto nel menù a tendina c'è maxima > restart maxima e non perdi niente di quello che hai fatto.

Per aprire contestualmente al maxima un browser remoto - utile ad esempio per scaricare file da processare sulla macchina remota - battere al terminale

iceweasel &
Le cartelle personali sul server
zauker.ing.unimo.it
sono sostanzialmente permanenti e non verranno resettate al logout.

In alternativa i file sono raggiungibili sulla macchina remota aprendo Applications->system_tools->file_browser

battere ctrl-L

e inserire
sftp://zauker/homel/n123456

dove 123456 va sostituito con il proprio numero di tessera.

Inizializzazione di un programma Maxima

Quando si apre un nuovo terminale, il primo comando da battere è :


kill(all);


che esegue la pulizia della memoria (il server mantiene la memoria dei lanci precedenti). Questo è necessario perché nella memoria vengono tenute tutte le variabili utilizzate ed il sistema non viene riavviato ogni volta che effettuiamo un comando. Con kill(all) andiamo a lavorare in un ambiente vergine.

Tutte le righe di Maxima sono terminate o con ';' o con '$'. L'unica differenza è che con il '$' viene omesso l'output della cella considerata, ad esempio per l'istruzione kill(all)$ viene omesso il 'done' a video. Per eseguire una riga al termine (cioè per eseguire una cella) è necessaria la combinazione di tasti SHIFT+INVIO oppure, nel menu a tendina alla voce cell, Evaluate cell, mentre per rieseguire l'intero programma si preme CTRL+R oppure Evaluate all cells. Premendo SHIFT+INVIO i comandi scritti sull'interfaccia grafica vengono inviati al server che li elabora e restituisce una risposta visualizzata ancora sull'interfaccia grafica. Per inserire una riga di commento, che quindi non verrà valutata, premere CTRL+1 , oppure cliccare Insert text cell sempre nel menu cell.

Se vogliamo cancellare una riga del nostro programma dobbiamo selezionarla e premere il tasto canc.

Valutazione di una riga --> E' una operazione implicita del Maxima, che processa ('valuta') ogni riga secondo le sue regole interne. Posso però chiedere di valutare una determinata espressione in un certo modo aggiungendo delle opzioni o delle ipotesi, ad esempio: OCCHIO: Maxima utilizza le funzioni con dicitura inglese per cui la funzione seno è sin e non sen. Di fianco a ogni cosa che scrivi c'è una parentesi del tipo (%i2), se lo scrivi come comando su una riga vuota punto e virgola shift invio, Maxima ti riscrive quello che c'è in quella riga.

sin(%pi/8) , numer ; 


introducendo l'opzione numer, chiedo di valutare esplicitamente il valore numerico dell'espressione.

Il segno % serve per "richiamare le costanti" implicitamente note all'interno di Maxima. Nel caso sopra considerato %pi richiama la costante algebrica (e non numerica) pi greco. Il simbolo %e richiama il numero di Nepero.

La funzione logaritmo log(argomento) identifica un logaritmo in base e.

Nel caso in cui una funzione richieda più parametri, questi vengono inseriti separati da virgole (ad esempio sin(%pi/2,2,3,..ecc). Va ricordato che all'interno della parentesi si possono inserire spazi o invii senza che venga modificata l'esecuzione dell'istruzione, l'importante è rispettare la sintassi.E' infatti molto comodo utilizzare 'spazio' e 'invio' per dare chiarezza al programma, per fare cioè in modo che tutte le operazioni siano ordinate e leggibili rapidamente.


Nota Bene: Maxima valuta una volta sola. Se si vuole effettuare più di una valutazione, è indispensabile per ognuna di queste, richiedere a Maxima un'ulteriore valutazione.Ad esempio:


ev ( sin(%pi/8) , numer ) ; 


Una variabile non definita in Maxima rimane parametrica, ovvero viene valutata in se stessa. Digitando ad esempio sin(pippo/4) otterrò in uscita di nuovo sin(pippo/4). E' possibile, comunque, definire una variabile a posteriori.

sin ( pippo/4 ) ;

Nota bene: il Maxima possiede in memoria un numero molto elevato di formule matematiche. Tuttavia nel caso si debba calcolare qualcosa che non è presente in memoria, il manipolatore algebrico non restituisce risultato.

ev  (% , pippo = %pi ); 


Il % come primo termine, sta ad indicare la richiesta di valutazione dell'espressione 'di cui sopra' , nel caso in cui la variabile pippo valga pi greco (nel nostro caso il 'di cui sopra' è sin (pippo/4). Ciò però NON significa assegnare a pippo il valore pi greco; infatti se successivamente si chiede al programma cos'è pippo (attraverso la semplice istruzione pippo;), lui mi risponderà: pippo. Di seguito si riporta uno screenshot che chiarirà quanto detto.

Screenshot lez2(1).gif

NOTA : Il comando % 'di cui sopra' sta ad indicare l'ultima operazione eseguita!! Di norma, in una scrittura lineare del programma, è quella immediatamente sopra, ma può capitare che modificando le ultime righe del programma, tornando all'inizio di questo e chiedendo di valutare l'espressione 'di cui sopra',venga valutata l'ultima operazione che è stata eseguita. Per non incorrere in questo errore è consigliabile chiedere al Maxima di rieseguire l'intero programma dall'inizio tramite la combinazione di tasti ctrl+R.

Per eseguire una doppia valutazione si scrive
 ev ( ev (pippo) ); 
oppure
  ev ( pippo , eval); 

Il comando "eval" come argomento in una chiamata del tipo ev(espr, eval) provoca una valutazione extra di espr. Si possono fare anche infinite valutazioni finché il programma non confronta due valori uguali e si ferma.

ev(pippo, infeval); 

Tale comando è tanto comodo quanto pericoloso, infatti può capitare che Maxima si 'blocchi' poiché il programma continua ad effettuare valutazioni fino a che non trova due valutazioni successive uguali e nel caso queste non si trovino mai, il programma si inceppa; per 'bloccare il problema' e tornare a scrivere il codice, è necessario entrare nel menu a tendina in Maxima -> Restart Maxima.


Il comando di "assegnazione" di una variabile in Maxima è il ':' (due punti).

pippo : %pi;

Il programma valuta quello che c'è a destra dei ':' e lo assegna a quello che c'è a sinistra. In questo modo il programma identificherà sempre la variabile con quel particolare valore. Non è necessario definire a priori le variabili, nemmeno le funzioni. Per eliminare una variabile posso utilizzare il comando kill(pippo).

Operazioni con le equazioni

Per definire una equazione chiamata eq si scrive:

eq : ( 3*x +1 )^2 =0;

Il comando "expand(espressione)",serve ad espandere l'espressione che si considera al suo interno. Prodotti di somme e somme elevate a potenza si moltiplicano fuori, numeratori delle espressioni razionali che sono somme sono suddivise nei rispettivi termini, e la moltiplicazione (commutativa e non commutativa) sono distribuiti su oltre a tutti i livelli di espr. Per polinomi si dovrebbe utilizzare il "ratexpand" che utilizza un algoritmo più efficiente.

expand(%); 

La funzione inversa dell'expand è il fullratsimp, che riduce a denominatore comune:

fullratsimp(%);

Il comando

denom(%);

valuta il denominatore del 'di cui sopra' (è utile ad esempio quando vogliamo valutare la singolarità dell'espressione), mentre il comando

num(%);

valuta il numeratore.

Per valutare l'espressione "di cui sopra" nell'ipotesi che x assuma il valore -1/3 si procede come segue:

ev ( % , x=-1/3);

Per risolvere un'equazione lineare in una determinata incognita si utilizza il comando linsolve

linsolve (3*x +1 =0 , x);

oppure

linsolve (eq , x);

La sintassi generale del comando linsolve è linsolve ([equazione 1,equazione 2,...,equazione N] , [variabile 1, variabile 2, ..., variabile M]); ovvero si scrivono all'interno delle parentesi tonde prima la lista di equazioni lineari da risolvere separate da una virgola e poi la lista delle incognite. Entrambe le liste vanno racchiuse tra parentesi quadre e separate da una virgola. In alternativa si possono definire le liste in precedenza e utilizzare queste all'interno del comando linsolve. Ad esempio:

eqns : [equazione 1,equazione 2,...,equazione N];
var : [variabile 1, variabile 2, ..., variabile M];
linsolve ( eqns , var );

Si ricorda di nuovo che risolvere l'equazione nella sua incognita, NON coincide col sostituire ad x il valore ottenuto! (c'è infatti x= e non x :). Se si vuole che l'incognita assuma il valore ricavato dalla soluzione dell'equazione bisogna aggiungere l'ipotesi globalsolve=true scrivendo

linsolve (3*x +1 =0 , x), globalsolve = true;

Nota bene: Linsolve si utilizza solo nel caso in cui il l'equazione sia lineare. Nel caso in cui non sia lineare si utilizza il comando solve al posto di linsolve, mantenendo però inalterata la sintassi del resto dell'istruzione.

- Operazione di differenziazione -> comando diff ( espressione da derivare, variabile di derivazione , ordine di derivazione ) . Ad esempio:

diff ( sin(x)/x , x , 2 );

deriva l'espressione due volte rispetto ad x

diff ( sin(x)/(x+y) , x , 1 , y , 1 ); 

deriva l'espressione una volta in x e una volta in y.

Se non si specifica l'ordine di derivazione si sottintende ordine 1.

Per conservare l'espressione della derivata le si può assegnare un nome, attraverso la sintassi dell'assegnazione "classica"

derivatamista : diff ( sin(x)/x , x , 2 );

- Operazione di integrazione -> comando integrate (espressione , variabile di integrazione , estremi di integrazione)

integrate (sin(x)/x , x , 0 , %pi/4 );

Per calcolare un integrale indefinito non è necessario specificare gli estremi di integrazione:

integrate (sin(x)/x , x );

Se l'integrale è indefinito occorre ricordare personalmente la presenza della costante di integrazione in quanto non viene mostrata da Maxima. Tenere a mente inoltre che, a differenza dell'operazione di derivazione, l'integrazione non è un processo automatico e non è sempre applicabile. Infine, se, per esempio, si integra inserendo come estremi a e b dopo il comando di esecuzione Maxima restituisce un'istruzione del tipo:

is b-a positive,negative or zero? 

inserendo p si definisce l'intervallo come positivo. Alternativamente prima del comando integrate si scrive l'istruzione:

assume (b-a>0);

che definisce l'intervallo in questione positivo, evitando la domanda di Maxima.

In Maxima è possibile utilizzare liste e vettori: mentre la lista non ha limiti di dimensioni e tipo, il vettore è una sequenza di oggetti omogenei,cioè che occupano lo stesso spazio in memoria. Un vettore non si può allungare o accorciare se non creando un vettore uguale, ma più lungo o più corto. Una lista invece è molto più flessibile, anche se l'accessibilità è più lenta. Un esempio di lista è

specificovalore : [x=4,y=5] ;

Se si scrive:

specificovalore[1];

come output si ha x=4.

E' possibile modificare un elemento della lista. Ad esempio con il comando

specificovalore[2] : y = %pi + sin(%pi/4)

modifico l'elemento di posto 2 della lista assegnandogli un nuovo valore. Questa operazione non sarebbe possibile con un vettore.

E' possibile inserire nuovi elementi a una lista effettuando una concatenazione attraverso il comando append:

specificovalore: append(specificovalore, [z=%pi]);

che ha il significato di "aggiungi alla lista specificovalore (già esistente) la componente z=%pi"

Applicazioni del teorema di Castigliano utilizzando il manipolatore algebrico Maxima

Teorema di Castigliano

Il teorema di Castigliano recita che la derivata parziale dell'energia totale elastica (espressa in termini di forze o coppie esterne, e non di spostamenti) rispetto ad una forza (coppia) esterna è uguale allo spostamento (rotazione) del punto di applicazione della forza (coppia), nella direzione e nel verso della forza (coppia) stessa.

Trave incastrata

Si riporta un semplice esercizio nel quale si richiede il calcolo della freccia all'estremità di una trave a sbalzo lunga L, di rigidezza flessionale EJ, soggetta ad un carico concentrato P all'estremità.

Trave incastrata.svg


Per determinare la freccia si utilizza il teorema di Castigliano che prevede dapprima il calcolo del momento flettente, dal quale si ricava attraverso integrazione l'energia potenziale elastica e, successivamente, tramite derivazione è possibile ottenere la freccia. Indicando con x la coordinata orizzontale avente lo zero nel punto di applicazione del carico e diretta verso l'incastro, il momento flettente in un generico punto della trave può essere espresso come:



L'energia potenziale elastica della struttura è definita come:


E e J non li hai definiti ma sono parametri. Possiamo calcolare lo spostamento desiderato differenziando l'energia U rispetto al carico P:



Il listato di istruzione Maxima è il seguente:


Screenshot lez2(2).gif

Trave incastrata iperstatica

Si vuole risolvere il problema iperstatico riportato di seguito:
Data la trave di lunghezza 2L e rigidezza flessionale EJ, incastrata ad un estremo, vincolata in mezzeria tramite un carrello ad asse verticale e caricata dalla forza P all'estremo libero, si determinino la reazione vincolare del carrello e la freccia in punta.


Castigliano 1 iperstatica 1.png


La struttura risulterà una volta iperstatica. Sostituiamo al carrello la reazione incognita R; per calcolare la reazione incognita R è necessario ricondursi ad una struttura isostatica corrispondente, sostituendo il vincolo in mezzeria con la sua reazione vincolare R incognita, che verrà trattata come forza esterna.


Rappresentazione dell'isostaticizzazione della struttura


Visto che sulla struttura agiscono due forze concentrate (sotto forma di forze attive e vincolari), il taglio presenterà tre discontinuità, mentre negli altri punti della trave manterrà un valore costante. Tutto ciò genera un andamento lineare a tratti del momento flettente (in quanto esso costituisce la derivata del taglio rispetto all'ascissa curvilinea definita sull'asse della trave), con un massimo in mezzeria (di valore P*L) ed un valore non nullo in corrispondenza dell'estremità incastrata. In questo punto, infatti, agisce una coppia concentrata dovuta al vincolo.


Grafico del momento flettente sulla trave


Tratto 1

Nel primo tratto si definisce un'ascissa curvilinea x avente origine nell'estremità libera ( x compresa tra 0 ed L). Il taglio lungo il tratto varrà P, mentre l'andamento del momento flettente nel tratto considerato (prima della discontinuità causata dalla reazione vincolare) varrà P*x con il massimo nel punto di applicazione della forza.


Grafico del momento flettente in funzione dell'ascissa curvilinea y




Si utilizza adesso il manipolatore algebrico Maxima per il calcolo dell'energia interna del primo tratto di trave secondo la teoria dell'elasticità:


U 1.png


Tratto 2

Si applica lo stesso ragionamento fatto in precedenza per il tratto successivo, identificato dall'ascissa curvilinea y avente origine nel punto di applicazione della reazione R. L'ascissa curvilinea y risulterà anch'essa compresa tra 0 e L.
In questo secondo tratto il taglio registrerà una discontinuità, riducendosi al valore P-R, mentre il momento flettente presenterà l'andamento mostrato in figura.


Grafico del momento flettente in funzione dell'ascissa curvilinea y




Utilizzando Maxima calcolo l'energia interna nel secondo tratto:

U 2.png

Energia potenziale elastica totale e reazione vincolare R

Sommando i valori di energia interna trovati per i due tratti considerati si ricava il valore dell'energia potenziale elastica totale U posseduta dalla trave nelle condizioni considerate.

Per il calcolo del valore della reazione vincolare R si utilizza quindi il teorema di Castigliano.
Prima si calcola il valore della freccia nel punto di applicazione del vincolo derivando U rispetto a R e poi si risolve l'equazione ottenuta imponendo il valore della freccia trovata uguale a 0 in R, incognita del sistema.

N.B. E' necessario introdurre un vincolo cinematico per sostituire correttamente al carrello la sua reazione vincolare, imponendo l'abbassamento nullo della trave nel punto di applicazione di R.




U tot.png

Visto che da questo momento in poi non è utile che R assuma valori diversi da 5/2P , è possibile definire l'incognita univocamente tramite un nuovo comando:

R: ev (R,%);

Il quale va letto come ridefinizione di R nella valutazione di se stesso nell'ipotesi di cui sopra (%).

Un'altra possibilità valida sarebbe stata quella di usare usare il comando linsolve, che associa direttamente il valore alla variabile ricavata

linsolve (frecciaR=0,R), globalsolve= true;

Un ERRORE da non compiere mai è il seguente:

R : linsolve(frecciaR=0,R);

perché in questo modo assegniamo ad R l'eguaglianza R=5*P/2, invece si vuole assegnare ad R la forma 5*P/2 (senza R=...) che è soluzione dell'equazione.

Freccia all'estremità

Utilizzando nuovamente il teorema di Castigliano, è possibile ricavare il valore della freccia del punto della trave in cui è applicato il carico P. Il valore di tale spostamento si ottiene derivando l'energia potenziale elastica totale rispetto alla variabile P.



FrecciaP.png

si noti che anche in questo caso l'assegnazione dell'espressione trovata al nome "frecciaP" si può effettuare con almeno due tipi di istruzioni


frecciaP: diff(U,P);

seguito da

frecciaP: ev(frecciaP);


oppure la singola riga

frecciaP: diff(ev(U),P);

Calcolo del momento flettente massimo della struttura

Non si conosce a priori il punto in cui il momento flettente è massimo, però si sa che l'andamento di Mf è bilineare e che all'estremità libera Mf per definizione vale zero, di conseguenza i punti possibili per la localizzazione di Mf massimo sono quello intermedio e quello all'incastro.

Mf max.png

Si noti che alla sezione intermedia si è calcolato Mf utilizzando la definizione di Mf1, ma analogamente si poteva utilizzare quella di Mf2 nel seguente modo

Mf_mezzeria: ev(Mf2,y=0);

Si noti inoltre che nella definizione di Mf all'incastro non è presente R, questo potrebbe far pensare ad un errore, in realtà essendo stata eseguita questa valutazione in seguito all'assegnazione del valore di R alla riga di comando (%i8), questo valore viene già sostituito e processato nella valutazione. All'incastro ho Mf con segno opposto rispetto alla mezzeria. Questo vuol dire che il momento flettente cambia segno lungo la trave (si ha un flesso).


Inserimento di un dimensionamento specifico

Si può utilizzare il programma per simulare un caso reale inserendo valori specifici di dimensionamento.
E' necessario fare attenzione all'utilizzo di unità di misura coerenti. In meccanica si usa solitamente un sistema che prevede le unità mm , N , tonnellata, s. In alternativa, per evitare errori di conversione si utilizzano le unità del SI, ma esse risultano scomode visto che bisognerà introdurre fattori moltiplicativi.


Viene quindi definita un'ipotesi di dimensionamento creando una lista:

caso1: [ l=400 , E=70000 , nu=0.3 , J= b*h^3/12 , Rs=110 , b=10 , h=20 , P=200 ];

N.B. Nel caso in cui si volesse aggiungere un nuovo elemento alla lista precedentemente definita (come ad esempio il modulo di resistenza a flessione W) è possibile usare il comando append come segue:

caso1: append(caso1,[W= b*h^2/6]);

Naturalmente l'utilizzo di questa funzione ha senso nel caso in cui ci si accorge alla fine del programma che manca un elemento alla lista utilizzata (vedi Appendice di gestione Liste).


Inserendo la condizione caso1 all'interno delle valutazioni dei vari parametri da osservare è possibile ricavare i valori numerici di:


  • Momento flettente in mezzeria (Mf massimo):
ev(Mf_mezzeria,caso1);
  • Tensione flessionale massima:
ev(M_mezzeria/W,caso1,infeval);
  • Freccia sotto al carico:
ev(frecciaP,caso1,infeval);


Si riporta l'elaborazione completa tramite manipolatore:


Caso1.png

Dimensionamento a sicurezza

Consideriamo un caso simile al precedente in cui però il termine h viene lasciato incognito, mentre si impone il coefficiente di sicurezza N=2. Ovvero, ci si chiede quale sia il dimensionamento della trave tale per cui nel punto di massima tensione ci sia un coefficiente di sicurezza pari a 2.



Definisco un caso 2 ad h libero:

caso2: [ l=400 , E=70000 , nu=0.3 , J= b*h^3/12 , Rs=110 , W= b*h^2/6 , b=10 , P=200 , N=2 ];

Impostazione dell'equazione sullo stato tensionale:

ev(Rs/N= Mf_mezzeria/w, caso2, infeval);
solve (%,h);
h_opt:ev(h,%[2]);

Come soluzione h_opt si prende solo il valore di h positivo. Si è utilizzata una nuova variabile h_opt in modo da mantenere l''h libera per eventuali operazioni successive senza assegnargli un valore preciso.

Ora si valuta la freccia sotto il carico P nell'ipotesi di h ottimale e caso2 per sollecitazione flessionale. Se questa assume valori non accettabili dovremo cambiare ipotesi aumentando la sezione resistente e quindi h :

ev(frecciaP,h=h_opt,caso2,infeval);
ev[%,numer]

Caso 2.png

Programma completo

Il programma completo, comprensivo dei due dimensionamenti, risulta essere:


kill(all)$
Mf1: P*x;
U1: integrate(Mf1^2/E/E/J,x,0,l);
Mf2 : P*l-(R-P)*y;
U2: integrate(Mf2^2/E/E/J,y,0,l);
U: U1+U2;
frecciaR: diff(U,R);
linsolve (frecciaR = 0, R);
R: ev (R,%);
frecciaP : diff(U,P);
frecciaP : ev (frecciaP);
Mf_mezzeria: ev(Mf1, x=l);
Mf_incastro: ev(Mf2, y=l);
caso1:[l=400, E=70000, nu=0.3,  J= b*h^3/12,  Rs=110, w= b*h^2/6,  b=10, h=20, P=200];
ev(Mf_mezzeria,caso1);
ev(Mf_mezzeria/w,caso1,infeval);
ev(frecciaP,caso1,infeval);
caso2:[l=400, E=70000, nu=0.3,  J= b*h^3/12,  Rs=110, w= b*h^2/6,  b=10, P=200, N=2];
ev(Rs/N= Mf_mezzeria/w, caso2, infeval);
solve (%,h);
h_opt:ev(h,%[2]);
ev(frecciaP,h=h_opt,caso2,infeval);
ev(%,numer);

Appendice gestione Liste

Vediamo ora come gestire le "liste" in Maxima.

Utilizziamo come esempio la lista "caso1" usata in precedenza per la risoluzione della trave incastrata iperstatica:

Lista1.png

Per richiamare l'elemento di una lista, e per ridefinire un singolo elemento:

Lista2.png

Posso sostituire ad un elemento di una lista, una secondo lista, oppure tramite il comando "append" posso aggiungere uno o più elementi ad una lista:

Lista3.png

Programma completo

Kill (all);
caso1 := [l=400, E=70000, nu=0,3, J=b*h^3/12, Rs=110, w=b*h^2/6, b=10, h=20, p=200];
caso1 [3];
caso1 [3]:0.5;
caso1;
caso1 [3]: [pippo,pluto];  Commento:[pippo,pluto] è una lista dentro un'altra lista genitore.
caso1;
caso1 [3] [2];
caso1: append(caso1, [aggiunta]);

RIFERIMENTI CON GUIDE UTILI ALLA COMPRENSIONE DEL MAXIMA

  1. RINVIA [[1]]
  1. RINVIA [[2]]
  1. RINVIA [[3]]

Bibliografia

1. Antonio Strozzi, Costruzione di Macchine, Pitagora Editrice, 1998, Bologna.
2. Antonio Strozzi, Dispensa del corso: Progettazione Assistita di Strutture Meccaniche.
3. Michele Capurso, Scienza delle costruzioni, Pitagora editrice, 1971, Bologna.