Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
PROF. GIORGIO BELLOTTI 19/09/2022
2 ESONERI: NOVEMBRE E DICEMBRE
Un'equazione differenziale semplice (soluzione analitica)
dy/dt = -a.y
y(t) e' reale
t e' reale
a e' reale positivo
la grandezza y dipende dal tempo
variabile dipendente
variabile indipendente
parametro del problema
Quando y→0 la variazione di y nel tempo tende ad essere molto piccola.
Per risolvere l'eq. differenziale, e quindi calcolare la variazione dy, dobbiamo specificare una condizione iniziale:
t=0 y(0)=y0 → condizione iniziale IC
Per questa eq. c'è una soluzione analitica perchè è un'eq. differenziale ordinaria lineare (ODE) ed è:
ya(t) = yf e-a.t → soluzione analitica
Non sempre abbiamo una soluzione analitica.
Tecniche di soluzione numerica
- La soluzione è approssimata (produce un certo errore)
- Le soluzioni numeriche sono funzioni discrete mentre la soluzione analitica è una funzione continua nel tempo.
Cerca la successione di valori: y1, y2, y3, y4, y5 e non cerca per la funzione y(t)
Mi devo riscrivere l'equazione differenziale in funzione dei valori y4, y3, y2, y1, y0.
RHS scritto al livello temporale 3:
RHS scritto al livello temporale 3:2y → -c. y3
LHS scritto al livello temporale 3:
dy = lim (y(t3+Δt)-y(t3)) dt Δt→∞ Δt
= lim (y(t4)-y(t3))Δt→∞ Δt
= lim (y4-y3 ≃ y1-y3)Δt→∞ Δt Δt
Allora dy = -c. y3 si può scrivere in maniera approssimata come: dt
y4-y3 = -c. y3 → abbiamo approssimato e discretizzato Δt
In generale: yi+1-yi = -c. yi → FORMULA ALGEBRICA Δt
La soluzione è: yi+1=yi+Δt (-c. yi) → derivativo di avanzato del tempo→ METODO DI EULERO
Sottraggo i membri di sinistra con quelli di destra tra le 2 equazioni (1 e 2) e ottengo:
Esplicito dy/dx
dy/dx|xi = (g(xi+Δx) – g(xi–Δx)) / 2Δx
– (2/3)Δx2/2 x3i Δx3 / 3!
+ Rxi
Formula differenza approssimata per il calcolo delle derivate derivate
Per calcolare la derivata in xi: considero un punto davanti xi+Δx e un punto dietro xi–Δx. → SCHEMA CENTRATO (DEL 2° ORDINE)
L’errore in questo schema di calcolo approssimato della derivata ha un ordine di Δx2 quindi in questo caso l’errore è più piccolo rispetto al caso precedente (l’errore si annunisce in maniera quadratica).
Per calcolare le derivate seconde devo sommare le 2 equazioni, ma ci ritorneremo più avanti! E.g. Per calcolare salvo le 2 equazioni ottengo:
Esplicito d2y/dx2
d2y/dx2|xi:
(y(xi+Δx)+y(xi–Δx)–2g(xi)) + (x4) / 2!
Δx4/xi4 + Rxi
Non ci sono grandi differenze nella struttura dei 2 problemi, quindi possiamo applicare il Metodo di Eulero anche per il sistema di eq. differenziali che dobbiamo appena risolvere; l'unico problema è che quando avviamo altri nel tempo dobbiamo procedere in avanti nel tempo risolvendo entrambe le equazioni mentre per risolvere le 2a eq. ho bisogno della 1a eq.
Scrivo in forma discreta il sistema di eq. differenziali sfruttando quello che abbiamo studiato precedentemente il calcolo delle derivate in forma approssimata, quindi non cerchiamo la soluzione del problema nella sua dipendenza continua dal tempo ma cerchiamo piuttosto il valore che le funzioni assumono a specifici istanti di calcolo (cioè discretizzo il dominio del tempo in t1, t2, t3, ...).
- Xm(t) → Xm(1), Xm(2), ...
- Um(t) → Um(1), Um(2), ...
Scrivo le 2 eq. in forma discreta sfruttando il calcolo approssimato delle derivate:
dmXm|dt|ti = (Xm(i+1) - Xm(i)) / Δt + ERRORE o(Δt)
(Um(i+1) - Um(i)) / Δt = (-k/m Xm(i) - μ/m Um(i) + S(l)/m) → anula e risolvi algebraica (numerica)
Esplicito Um(i+1).
Um(i+1) = Um(i) + Δt · (-k/m Xm(i) - μ/m Um(i) + S(l)/m)
Faccio la stessa cosa per la 1a eq:
dXm / dt = Um → (Xm(i+1) - Xm(i)) / Δt = Um(i)
MATLAB
script = file di testo con estensione .m
Poco scrivere uno script da 0: New script -> save -> "Primo script"
Cose prime cosa pulisco la memoria: clear -> clc -> close
dt = 0.1;
a = 2.1;
tf = 4.0;
Le dico Run mando in esecuzione lo script oppure posso scrivere sul Command Window il nome della script "Primo script"
Costruisco un vettore t che va da 0, ogni dt, fino a 10.
tf = 10;
t = 0 : dt : tf; -> vettore riga
Preferisco lavorare con un vettore colonna:
t = t' -> vettore colonna
CICLO FOR
for ii = [3,5]
disp (ii)
end
ii = variabile ausiliaria contatore per il ciclo che assume i valori 3 e 5
Quindi ciclo sarà ripeto 2 volte e c'è l'ombre si eseguono i valori 3 e 5
Ad ogni iterazione del ciclo sarà eseguita istruzione che prevede di far vedere e disploy (nella Command window) il valore di ii
Mando in esecuzione e beppo 3 e 5 sulla command window
for ii = t
disp(ii)
end .. -> ottengo i valori del vettore t
Se metto uno smorzamento piccolo l’ampiezza delle oscillazioni rimane quasi costante e crea un cerchio nel piano delle forze dove si conserva l’energia.
Se metto μ = 0 ad esempio che il sistema conservi energia e che nel piano delle forze ho una circonferenza, invece essendo che lo stato del sistema si adatta, ho una spirale che diverge all’infinito e le oscillazioni aumentano nel tempo.
Che metto μ = 0.1 e dt = 0.05 e inserisco una forza esterna che varia nel tempo, ad esempio una forzante armonica.
f(t) = Δ・sen(ωt), dove ω = 2π/T
ω ≈ frequenza o frequenza angolare
2π/T ≈ periodo delle oscillazioni
Δ=1;
f=Δ・sin(ωexc・t);
Y = zeros(2, Nt)
Y(:, 1) → caricare le coord. iniziali
estraggo la -esima colonna della matrice Y
Y₂ → Y(:, 2)
Yi → Y(:, it)
Xt+1 → Y(:, it+1)
m → H = [1 0, 0, m]
oppure: comando "diag"
k → k = [0, -1, k, μ]
F → F
matrice con 2 righe e Nt colonne
f → F = zeros(2, Nt)
trasposta
F(1, iⱼ) = fj
inizializzo
Ciclo di avanzamento nel tempo
Y(1, 1) = Xmi; Y(2, 1) = Vmi
for i