Università di Foggia
Dipartimento di Scienze Biomediche
Prof. Crescenzio Gallo
c.gallo@unifg.it
Introduzione a Mathematica
Introduzione generale
In questa breve introduzione vedremo come interagire con Mathematica a livello base per eseguire alcuni semplici calcoli.
Mathematica come calcolatrice
Mathematica è in grado di eseguire le semplici operazioni aritmetiche di addizione, sottrazione, moltiplicazione e divisione. Ad es. per sommare 2+2 basta inserire il comando seguente e premere Enter (che si ottiene premendo contemporaneamente Shift+Invio):
Mathematica è costituito di due distinti componenti, il Front End ed il Kernel. L’input, l’output e la formattazione del testo sono gestiti dal front end. I calcoli sono effettuati nel kernel, che è un’applicazione separata. Alla prima esecuzione (anche di un semplice comando come 2+2) si potrebbe notare un leggero ritardo dovuto al tempo di attivazione del kernel; successivamente, i tempi di risposta dipendono esclusivamente dalla complessità dei calcoli richiesti al kernel.
E’ possibile inserire anche commenti, racchiudendoli tra (* e *).
Si osservi che abbiamo ottenuto come risultato una frazione. Mathematica è in grado di effettuare calcoli esatti, piuttosto che approssimazioni decimali, quando possibile. E’ comunque sempre possibile ottenere un risultato approssimato mediante la funzione N (“numerical”). Nel seguente esempio, % si riferisce al risultato precedente e // N passa il risultato alla funzione N:
La capacità di Mathematica di effettuare calcoli esatti è davvero impressionante.
Mathematica conosce anche le usuali funzioni matematiche. Nota: i nomi degli “oggetti” nativi iniziano sempre per lettera maiuscola e gli argomenti delle funzioni sono racchiusi tra parentesi quadre.
Qui viene nuovamente utilizzata la funzione N con un secondo argomento per ottenere la precisione desiderata per π:
Esercizio. Provare ad ottenere le prime 10 cifre decimali di e.
Parentesi tonde, quadre e graffe
Le parentesi hanno vari scopi in Mathematica. Le parentesi quadre [] sono usate per racchiudere gli argomenti di una funzione come in:
Le parentesi tonde () servono a raggruppare espressioni matematiche come:
Le parentesi graffe servono per le liste, che rivestono un importante ruolo in Mathematica essendo una struttura dati fondamentale. Molte funzioni possono operare su liste:
Alcune funzioni restituiscono liste:
Ed alcune funzioni manipolano liste in modi interessanti. Cosa fa la seguente funzione?
Se si desiderano ulteriori dettagli sulla funzione Tally basta digitare il seguente comando:
Esercizio.
(a) Quante cifre ha il numero ? (Suggerimento: utilizzare il comando Length insieme a IntegerDigits).
(b) Qual è la frequenza della cifra meno ripetuta in ?
Algebra
Mathematica può fare molto più che semplici calcoli. Può manipolare espressioni algebriche, risolvere equazioni, calcolare derivate ed integrali e molto di più. E’ anche possibile assegnare complicate espressioni a variabili per un loro successivo utilizzo. Ecco un esempio.
Si osservi che Solve trova soluzioni esatte. Per ottenere un’approssimazione numerica è possibile utilizzare la funzione NSolve:
Esercizio. Sia
(a) Trovare le soluzioni dell’equazione p(x)=0
(b) Scomporre (fattorizzare) p(x)
(c) Trovare la forma espansa di
Che relazione esiste tra (a) e (b)?
Definizione di polinomi
Con Mathematica possiamo facilmente esaminare alcune funzioni che altrimenti non vorremmo proprio trattare. Vediamo un esempio. Consideriano la funzione polinominale f di grado 19 il cui coefficiente di è il k-esimo numero primo: che possiamo anche abbreviare in , dove denota il k-esimo numero primo.
Dalla precedente definizione si deduce che la sintassi generale per la dichiarazione di una funzione è f[x_]:=... Il trattino di sottolineatura (x_) indica un pattern. Il comando Prime restituisce semplicemente il corrispondente numero primo; così, Prime[1]=2, Prime[2]=3 etc. Il comando Sum è un po’ più complesso. Osserviamo che Sum[a[k], {k, inizio, fine}] in Mathematica equivale a: .
Ora che abbiamo definito la funzione, possiamo utilizzarla:
Calcoliamone la derivata prima:
Possiamo elevarla alla quarta potenza e svilupparla:
Esercizio. Consideriamo la funzione: dove i coefficienti sono potenze di 2.
(a) Fattorizzare f(x)
(b) Sviluppare (trovare l’espansione di)
Si osservi che il termine costante non è nullo; ciò vuol dire che il comando Sum avrà un diverso punto di partenza.
Analisi
Mathematica può calcolare derivate, integrali ed essenzialmente fare tutte le manipolazioni formali richieste per completare i calcoli richiesti nell’analisi. Per calcolare le derivate si utilizza il comando D.
Se definiamo una funzione f possiamo usare la notazione f'(x), f''(x).
Naturalmente, Mathematica può calcolare derivate più complesse.
Possiamo integrare questo risultato per riottenere la funzione originaria applicando il comando Integrate.
L’integrazione è naturalmente un’attività un po’ più complessa. Vi sono integrali che non possono essere espressi in forma chiusa:
Quando Integrate non dà un risultato, come in questo caso, vuol dire che Mathematica non ha potuto calcolare l’integrale. La versione numerica può però venirci incontro per calcolare l’integrale definito:
Esercizio. Valutare i seguenti integrali:
(a)
(b)
Esercizio. Trovare i punti critici della funzione . Cioé, trovare le radici dell’equazione f'(x)=0.
Grafici di funzioni
Lo strumento principale per disegnare grafici di funzioni è il comando Plot.
Possiamo “plottare” più di una funzione contemporaneamente mediante una lista di funzioni. Ad esempio, il seguente comando illustra la soluzione dell’equazione cos(x)=x.
Questo comando illustra un primo uso di un’opzione, cioé PlotStyle->{Red,Blue} in modo da poter distinguere i grafici. Vi sono molte opzioni grafiche e molti comandi grafici. Esaminiamo ad esempio il comando ListPlot, un comando per grafica discreta. Data una lista di numeri, ListPlot ne traccia il grafico rispetto alla loro posizione nella lista. Ad esempio, generiamo i primi numeri della successione di Fibonacci:
Esercizio. Data tracciare i grafici di f(x) ed f'(x) sugli stessi assi.
La notazione
Mathematica è un enorme programma ed apprenderlo tutto può essere un’impresa ardua. Comunque, un aspetto positivo di Mathematica è la consistenza del suo progetto. Consideriamo il seguente insieme di comandi, tutti validi.
Osserviamo che i comandi su esposti (ed altri oggetti predefiniti) obbediscono allo stesso schema. Inoltre, ciascun comando ha la stessa forma: Comando[espressione, iteratore]. Mantenere questa consistenza rende alla lunga il linguaggio più semplice da apprendere e da utilizzare.
Calcolo numerico e simbolico
La prima versione di Mathematica fu chiamata “un sistema per fare matematica con il computer”. Come tale, il calcolo numerico e simbolico è alla sua base. Per calcolo numerico di solito intendiamo semplici operazioni aritmetiche. Ad esempio:
Come vedremo, vi è una distinzione importante tra questi due esempi a dispetto della loro (apparente) semplicità.
Alcuni concetti fondamentali
Tipi di numeri: 1 e 1.0
Mathematica può effettuare due principali tipi di calcolo numerico: esatto ed approssimato. Interi, frazioni e costanti matematiche come π ed e sono numeri esatti. Quando si eseguono calcolo con numeri esatti, Mathematica restituisce risultati esatti. Ad esempio:
Si osservi che il risultato è 2/3. Sulla maggior parte delle calcolatrici ci si aspetterebbe 0.666667. Ogni volta che Mathematica esegue un calcolo, lo fa alla massima precisione possibile. I numeri esatti effettivamente hanno una precisione infinita. L’approssimazione decimale ha la precisione della macchina; il seguente calcolo è più da “calcolatrice”:
Ha senso? La massima precisione possibile è stata limitata dal numero in rappresentazione decimale approssimata (formato macchina) 3.0. Ecco una lista di esempi simili.
Al comando N può essere passato qualsiasi numero o lista di numeri per generare un’approssimazione numerica:
Possiamo anche utilizzare il secondo argomento opzionale di N per ottenere la precisione desiderata.
Perché le coppie di risultati non sono più le stesse?
Manipolazione algebrica
Mathematica può eseguire ben più che semplici calcoli con numeri; può anche manipolare simboli ed espressioni più complesse. Ecco un semplice esempio:
Questa capacità di eseguire manipolazioni simboliche è in realtà la chiave per l’aritmetica esatta. Lo si può capire meglio dal seguente esempio:
Il senso dovrebbe essere chiaro... La controparte di Expand è Factor.
Probabilmente la manipolazione algebrica più importante è quella realizzata dal comando Simplify. Per illustrarlo, produciamo prima un’orribile espressione attraverso il comando TrigExpand.
Simplify, in questo caso, ritorna all’espressione compatta:
Occasionalmente, può essere più utile semplificare un’espressione con il comando FullSimplify:
Quindi la manipolazione algebrica può risultare complicata, anche con un sistema di algebra computazionale su computer. Avere un tale sistema a disposizione semplicemente innalza il livello dei problemi che tendiamo ad affrontare. Ecco un esempio (un po’ surreale, per la verità):
Cosa potrebbe rappresentare questo “mostro”? Controlliamone il valore numerico:
Vi è un forte indizio che il risultato potrebbe essere 1/2. Controlliamo con una maggiore precisione:
Non è così facile da provare, comunque. Infatti:
Per questo particolare problema la semplificazione può essere tentata dopo aver provato con la sostituzione esplicita ArcSinh[2]→3*ArcCsch[2]. Verifichiamo prima che la sostituzione ipotizzata sia valida:
Ora possiamo utilizzare una regola per effettuare la sostituzione e quindi eseguire la semplificazione.
Esercizio. può essere espresso come un numero intero di 18 cifre. Verificarlo mediante N.
Esercizio. Provare a semplificare la seguente espressione:
Suggerimento: utilizzare FullSimplify insieme a TrigToExp (leggere l’help, se necessario).
Risoluzione algebrica e numerica di equazioni
Abbiamo già esaminato brevemente i comandi Solve ed NSolve. Ora li approfondiremo, insieme al comando FindRoot ad essi correlato.
Solve è un comando puramente algebrico che trova soluzioni di un limitato insieme di equazioni. Funziona molto bene su polinomi di grado basso.
Le soluzioni vengono restituite in termini di regole. Una regola è della forma variabile → sostituzione. Una regola può essere applicata ad un’espressione mediante l’operatore di sostituzione (/.). Ad esempio:
Strano: il risultato dovrebbe essere zero, essendo le radici del polinomio! Semplifichiamo:
Ok. Proviamo ora un’equazione cubica:
Il risultato è abbastanza complesso, come può spesso capitare anche per semplici espressioni algebriche. In questi casi è meglio provare con il comando NSolve, che utilizza una combinazione di funzioni numeriche ed algebriche per trovare approssimazioni numeriche alle soluzioni dell’equazione.
Ora il risultato è decisamente più leggibile. Non sempre però questa strada è praticabile. Ad esempio:
Provare con NSolve non cambia la situazione:
E’ però facile vedere che c’è una soluzione dal semplice esame del grafico seguente:
Il punto di intersezione indica una soluzione, poco più grande di 0.7. In questa situazione, la funzione puramente numerica FindRoot può essere di aiuto.
La sintassi è FindRoot[eq, {var, init}], dove eq è l’equazione nella variabile var rispetto alla quale risolvere. Il parametro init è un valore iniziale che dovrebbe essere vicino alla soluzione; tipicamente tale valore viene trovato mediante un grafico come quello visto. FindRoot utilizza quindi il metodo di Newton/Raphson per arrivare alla soluzione. Ad esempio:
Questa è una procedura completamente numerica, quindi il risultato sarà sempre fornito in forma decimale approssimata.
Esercizio. Si consideri l’equazione .
(a) Disegnare il grafico di entrambe le funzioni sull’intervallo . Si dovrebbero osservare 6 punti di intersezione.
(b) Utilizzare FindRoot con i valori iniziali ottenuti dal grafico precedente per trovare buone approssimazioni decimali alle tre più piccole soluzioni positive dell’equazione.
Ancora un po’ di analisi
Ricordiamo che è possibile definire una funzione, differenziarla e trovarne i punti critici:
Queste dovrebbero essere le ascisse dei due estremi, che possiamo visualizzare come segue:
Esercizio. Utilizzare una combinazione di tecniche grafiche ed algebriche per trovare i due più piccoli valori positivi di . Procedere osservando il grafico della funzione e determinare (possibilmente in forma approssimata) dove la derivata della funzione è nulla.
Nota: Avrai probabilmente bisogno di usare FindRoot per questo problema, dato che l’equazione risultante non può essere risolta per via algebrica. Avrai quindi necessità di tracciare prima il grafico con il comando Plot per ottenere il valore iniziale.
Le liste
In questa sezione tratteremo la manipolazione di liste, la struttura dati composta fondamentale. Iniziamo con un breve sguardo ad alcune interessanti applicazioni che si possono realizzare con le liste.
Generazione e manipolazione di liste
Generare liste
Anche se è possibile scrivere una lista utilizzando le parentesi graffe nella forma {a,...}, è certamente più efficiente generare una lunga lista per mezzo di comandi. Il più utile è Table, che ha la seguente sintassi: . Calcoliamo ad esempio i primi 100 quadrati:
Se invece vogliamo solo i quadrati dei numeri dispari utilizzeremo un passo 2:
Osserviamo che gli elementi della lista possono a loro volta essere delle liste o espressioni più complesse. Inoltre, il passo non deve necessariamente essere un numero intero. In quest’altro esempio generiamo una lista di 41 punti sul grafico di e passiamo il risultato a ListPlot.
Per vedere la linea che congiunge i punti, si può utilizzare ListLinePlot:
Funzioni che operano su liste
Andremo ora ad eseguire alcuni esercizi operando sulla seguente lista:
Molte funzioni accettano una lista come argomento. La statistica è piena di queste funzioni. Ad esempio, potremmo voler calcolare la media della lista:
Analogamente per i comandi Median, Variance e StandardDeviation:
E' anche semplice sommare o invertire gli elementi della lista:
Utilizzo di funzioni pure con Map e Select
Molte funzioni operano naturalmente su liste piuttosto che numeri. Ad esempio, per calcolare i quadrati degli elementi della lista possiamo semplicemente scrivere:
Anche funzioni molto più complesse operano allo stesso modo. Ad esempio, la funzione EvenQ restituisce il valore True (vero) o False (falso) a seconda se il numero in input è pari o dispari. Se l’input è una lista di numeri, EvenQ restituisce una lista di valori logici:
E se invece abbiamo una funzione più complessa che non si applica automaticamente alla lista? Consideriamo la seguente funzione:
f divide un numero pari per 2 e lo trasforma in 3n+1 se è dispari. Se proviamo f[lista] non produce alcun risultato sensato:
Possiamo invece “mappare” la funzione sulla lista attraverso l’operatore Map (/@). Vi sono due forme equivalenti: Map[f,lista] e f/@lista. Proviamo:
Talvolta è utile mappare una funzione su una lista senza creare esplicitamente una nuova funzione. Allo scopo si utilizzano le cosiddette funzioni pure (o anonime). Una funzione pura ha la forma corpo&, dove corpo è un’espressione contenente il simbolo # e & indica che quest’espressione è una funzione. Ad esempio, #^2& rappresenta la funzione quadrato:
Può sembrare criptico, ma è spesso utile. Possiamo quindi calcolare i quadrati degli elementi della nostra listra semplicemente con:
oppure con:
o equivalentemente:
Anche la precedente funzione f può essere trasformata allo stesso modo:
Le funzioni pure sono anche convenienti quando occorre selezionare gli elementi di una lista che soddisfano determinati criteri. La funzione Select ha la forma Select[lista,test] dove test rappresenta una funzione booleana che descrive i criteri da soddisfare. Ecco come selezionare gli elementi pari della nostra lista:
Nel caso che la funzione-criterio non sia già disponibile è sempre possibile costruirne una al volo. Vediamo ad esempio come selezionare gli elementi della lista divisibili per tre:
Possiamo contare quanti sono con la funzione Length:
Un esempio più complesso
Si supponga di voler trovare la somma di tutti i multipli di 3 o 5 inferiori a 1000. Elenchiamo prima i numeri che ci interessano (senza farli visualizzare):
Poi selezioniamo solo quelli che sono divisibili per 3 o per 5 (l’operatore || sta per “oppure”):
Ed infine li sommiamo:
Spesso risulta più utile combinare tutti i passi in uno solo:
Esercizio. Trovare la somma di tutti i termini di valore pari della successione di Fibonacci che non superi 4000000. Utilizzare allo scopo la funzione Fibonacci[n] per ottenere l’n-mo termine della successione.
Esercizio. Un palindromo è un numero le cui cifre si leggono allo stesso modo da entrambi i lati. Ad esempio, 101 e 29792 sono palindromi, mentre 42 non lo è. Si utilizzino le funzioni IntegerDigits e Reverse per scrivere una funzione che controlli se un numero è palindromo. Quanti palindromi vi sono tra 42 e 42000?
Grafici “a ragnatela”
Ancora sulla manipolazione di liste
Utilizziamo ancora la lista:
Il comando Partition suddivide una lista in parti di uguale lunghezza. Ad esempio:
Il comando Flatten fa il contrario, nel senso che rimuove tutte le sotto-liste:
Possiamo rimescolare il tutto mediante il comando Transpose:
Le funzioni *List
Si provi a digitare ?*List:
Il comando genera un elenco di funzioni, molte delle quali generano liste. CoefficientList ad esempio genera la lista dei coefficienti di un polinomio:
Costruzione di un grafico “a ragnatela”
Iniziamo l’esercizio con la definzione di una funzione f e la visualizzazione del suo grafico insieme a quello della retta y=x.
Ora utilizziamo il comando NestList per generare la traiettoria. Genereremo solo alcuni termini per osservarne il comportamento.
La traiettoria generata comprende i singoli punti, ma abbiamo bisogno della sequenza . Si osservi che occorrono quattro copie di ciascun termine tranne il primo. Abbiamo allora bisogno di partizionare la lista in sottoliste lunghe 2.
Prima di tutto, quadruplichiamo ciascun termine mediante il mapping di una funzione pura:
Ora rimuoviamo le sottoliste:
Cancelliamo il primo termine:
E infine partizioniamo a coppie il risultato:
Questa sequenza di punti forma la linea che dobbiamo tracciare per generare il grafico “a ragnatela”. Prima di questo, combiniamo il tutto in un unico comando e generiamo tutti i dati.
Infine visualizziamo il tutto:
Esercizio. In questo esercizio tracceremo alcuni punti generati con una procedura iterativa nel piano complesso. Per fare ciò abbiamo bisogno di estrarre da un numero complesso a+b i la coppia dei suoi termini reali (a,b). Le funzioni Re e Im estraggono la parte reale ed immaginaria. Ad esempio:
(a) Utilizzare Re e Im per scrivere una funzione che trasformi un numero complesso in una coppia di numeri reali. Mappare quindi la funzione sulla lista {1,i,1-i} per verificarne il funzionamento. Il risultato dovrebbe essere {{1,0},{0,1},{1,-1}}.
(b) Ora, sia e si generi la traiettoria ottenuta iterando f 500 volte partendo da (Mathematica eseguirà tutti i calcoli necessari!).
(c) Mappare la funzione del punto (a) sulla traiettoria del punto (b) e passare il risultato a ListLinePlot. Il risultato finale dovrebbe essere piacevole da osservare...
Importazione, esportazione, consultazione di dati
Molte applicazioni matematiche, statistiche e scientifiche in genere richiedono analisi di dati. Senza la capacità di leggere e scrivere dati da e verso l’esterno, gli strumenti di Mathematica sarebbero inutili per l’analisi dei dati. Come ogni buon linguaggio di programmazione, naturalmente, Mathematica possiede una varietà di strumenti per questo scopo.
Importazione
Importare dati da Internet
Il comando Import è un utile strumento ad alto livello per introdurre dati nell’ambiente Mathematica. Vediamo ad esempio come importare una immagine JPEG da Internet:
Il primo argomento è una stringa contenente l’indirizzo web del file da importare. Il secondo argomento specifica il formato del file (nel nostro caso, un’immagine GIF).
Importare fogli elettronici
Un tipico “contenitore” di dati da analizzare è il foglio elettronico. In Mathematica vi è una cartella chiamata ExampleData, nella quale vi è una raccolta di file di vari formati utili per illustrare l’importazione di dati. Uno di questi file si chiama mountains.sxc (un foglio elettronico OpenOffice). Possiamo importare il foglio in una lista di liste (una matrice) e visualizzarlo in forma tabellare:
Rank | Name | Height | First | Ascend |
1 | Mount Everest | 8848 | 1953 | |
2 | K2 | 8611 | 1954 | |
3 | Kangchenjunga | 8586 | 1955 | |
4 | Lhotse | 8516 | 1956 | |
5 | Makalu | 8485 | 1955 | |
6 | Cho Oyu | 8188 | 1954 | |
7 | Dhaulagiri | 8167 | 1960 | |
8 | Manaslu | 8163 | 1956 | |
9 | Nanga Parbat | 8125 | 1953 | |
10 | Annapurna I | 8091 | 1950 |
Possiamo naturalmente analizzare i dati importati. Ad esempio, troviamo l’altezza media delle 10 montagne più alte:
Ecco in dettaglio i singoli comandi, da cui si comprende la procedura di caoclo seguita:
Esportazione
Esportare dati da Mathematica è altrettanto importante che importarli. Export è la funzione ad alto livello che viene utilizzata.
Esportare in
ExportString è simile a Export; differisce semplicemente nel fatto che manda il suo output ad una stringa, che può essere successivamente utilizzata. Esiste anche il complementare comando ImportString.
Un formato particolarmente utile in ambito scientifico è il . Di solito risulta comodo preparare una serie di calcoli in Mathematica e poi esportare il risultato in . Vediamo un esempio:
Le funzioni Data
Esaminiamo ora le funzioni Data. Wolfram Research gestisce una serie di server che forniscono accesso ad una enorme mole di dati accessibili tramite Mathematica. Vi sono dati matematici, geografici, finanziari, linguistici, scientifici etc. Vedremo alcuni esempi, il cui funzionamento si osservi richiede una connessione Internet funzionante.
Dati chimici
Diamo un’occhiata al set di dati ChemicalData. Il seguente comando potrebbe durare un po’; esso restituisce la lista di informazioni chimiche disponibili attraverso la funzione ChemicalData:
Quali proprietà chimiche possiamo esaminare? Questo ce lo dirà il seguente comando:
Ecco un elemento chimico di una certa importanza:
Ecco come ottenere il punto di ebollizione dell’acqua:
Meno frequente è sicuramente la richiesta di conoscere il punto di fusione della digitonina (un glicoside digitalico che viene principalmente sfruttato per il suo potere tensioattivo):
Le complesse molecole di questo gruppo di sostanze sono caratterizzate da una struttura complessa che possiamo esaminare:
Dati finanziari
Ed ora esaminiamo il data set FinancialData. Elenchiamo nuovamente tutte le entità disponibili nel data set in esame:
Elenchiamo le proprietà finanziarie che Mathematica conosce:
Per controllare le quotazioni di borsa abbiamo bisogno di conoscere le sigle ufficiali delle aziende quotate. Ecco i valori attuali di due società ben note in campo informatico:
Esaminiamo l’andamento dei titoli Apple. Microsoft e Google dal 2000 ad oggi:
Equazioni differenziali
Anche se Mathematica può trattare un’enormità di dati ed argomenti scientifici, il suo scopo primario è “fare” matematica: le equazioni differenziali sono un argomento che trae notevole beneficio dall’uso della potenza computazionale. Nel seguito utilizzeremo la terminologia tipica anglosassone, con DE per Differential Equation ed IVP per Initial Value Problem.
Concetti fondamentali
Alcune definizioni
Un’equazione differenziale ordinaria del primo ordine ha la forma y'(t) = f(y,t). Una soluzione dell’equazione differenziale è una funzione y(t) che soddisfa l’equazione. L’esempio più semplice è dato da f(y,t)=y; quindi la DE è y'=y. Una soluzione è data da .
Più in generale, qualsiasi funzione della forma soddisfa y'=y; diciamo che è la soluzione generale di y'=y. Possiamo specificare la soluzione mediante una condizione iniziale. Ad esempio, y(0)=2 insieme a y'=y implica che . Per trovarla, dobbiamo prima scrivere e poi utilizzare la condizione iniziale y(0)=2 per trovare che c=2. La coppia di equazioni y'=y, y(0)=2 viene chiamata “problema del valore iniziale” (IVP, initial value problem).
DSolve
Quando risolviamo una normale equazione facciamo uso dei comandi Solve (risolutore esatto di equazioni algebriche) ed NSolve (risolutore numerico approssimato). Vi sono due comandi analoghi a questi per le equazioni differenziali, cioé DSolve e NDSolve.
DSolve tenta di trovare una soluzione esatta di un’equazione differenziale o di un sistema di equazioni differenziali. La sintassi è DSolve[eqs, funcs, var], dove eqs è la lista delle equazioni da risolvere, funcs sono le funzioni non note e var è la variabile della funzione non nota. ecco alcuni esempi.
L’esempio più semplice:
Possiamo aggiungere una condizione iniziale:
Ed ecco un esempio un po’ più complesso. E’ bene “ripulire” la funzione prima di procedere, per evitare qualsiasi problema di sovrapposizione con oggetti definiti in precedenza.
Un altro esempio, dove abbiamo una famiglia di soluzioni dipendenti dalla costante C[1].
Possiamo ad esempio ottenere diverse soluzioni per valori di C[1] tra -500 e 500 in incrementi di 50:
Abbiamo ora una lista di 21 funzioni, ciascuna soluzione dell’equazione differenziale e ciascuna corrispondente ad un diverso valore numerico di C[1]. Tracciamo il grafico delle soluzioni sugli stessi assi:
NDSolve
Utilizziamo NDSolve in situazioni dove DSolve non è in grado di fornire una soluzione algebrica esatta o nessuna soluzione! E’ necessario specificare anche una condizione iniziale ed un iteratore per l’intervallo numerico:
Possiamo anche tabularne alcuni valori: