ODE IV_02
function [t,t xmf, Vmf] = funzione
end
ODE IV_06
function [t, y] = ode (dt, t0, y0)t = 0:dt:tf; t = t'; NT = length(t);y = zeros (NT,1);y(1) = y0;for it = 2:NT y(it) = y(it-1) + dt * ( ... )end
end
METODO DI HEUN
Metodo più accurato del Metodo di EuleroFino ad ora abbiamo studiato problemi in questa forma.dy/dt = e(y, t) es. * dy/dt = -alpha-y
- dxm/dt = ...
- dvm/dt = -k/m...
Con il Metodo di Eulero sviluppiamo il seguente algoritmo:...
Questa algoritmo si porta a fare degli errori: O(1)
L'interpretazione geometrica del metodo di Eulero è:
L'errore è dato dal fatto che ci immaginiamo su una retta che ha pendenza che è quella iniziale della funzione.
Per ridurre l'errore devo ridurre il Δt.
Altri metodi sono quelli di Runge-Kutta e Adam Bashforth.
Uno dei più semplici della categoria dei metodi di Runge-Kutta è il METODO DI HEUN.
L'idea dei metodi di Runge-Kutta è quello di fare un passo in avanti usando un punto "migliorato" e non quello iniziale (come invece facevamo con il Metodo di Eulero).
METODO DI HEUN:
Uso, cioè, una pendenza media (che ai primi non sapevamo), quindi si usa prima la pendenza di partenza e calcolo un yint che è in colore vi Tantòra yintE (questo è l'errore per calcolare).
yh(it) = yh(it-1) + dt * 1/2 * (RHS_iulz + RHS_fil)
tempo Heun = toc
% % Disegno dei vettori
figure
plot(y,e,'c'); ...
hold on
plot(, y, quadrico,'b')
plot( + yh,'k')
title('Prima eq. differenziale')
legend('...','...', 'soluzione con metodo di Heun')
t(ic) -> lo parte lineare
(tempo-toc) -> funzione lineare e on da il calcolo del tempo
L'accuratezza del metodo di Heun è più che il doppio rispetto al metodo di Eulero.
save "dove_stepHeun_terodix_03"
% Integrazione nel tempo con metodo di Heun
t(ic)
yh(1) = yj;
for it = 2: Nt
RHS_iul = -a * yh(it-1);
correzione
ypredittore = yh(t':+1) + dt * RHS_iulz; % se ora si chiama predittore
for i=1:2
RHS_fiu = -o * ypredittore;
ypredittore = yh(it-1) + dt * 1/2 (RHS_iuln + RHS_fin)
end
yh(it) = ypredittore;
end
Il sistema del 1o ordine lo posso scrivere come:
M d2x/dt2 + Ddx/dt + Kx = {ß}
Il sistema del 1o ordine, invece, è:
m dy/dt + Ky = F
Quindi, possiamo dire che:
m = [2x3][4x4][2+3][4+3](I OO M) e K = (O IK D)
ESEMPIO:
ODE-IV.09 - Edificio multipiano, Metodo di Eulero
31/10/2022
sistema di 3 ODE del 1o ordine lineare
d2x1/dt2 = -k4/m1x1 + k3/m1(x2 - x1)
d2x2/dt2 = k2/m2(x1 - x2) + k3/m2(x3 - x2)
d2x3/dt2 = k3/m3(x2 - x3)
X = (x1x2x3)
Devo scrivere il sistema del 1o ordine. Introduco il vettore delle incognite:
M d2x/dt2 + Ddx/dt + Kx = {∫∫}
Metodo dell'attraversamento dello zero
ALGORITMO 1°
x(1) ? x(2)
x(2) ? x(3)
...
x(N-1) ? x(N)
- for ie = 1 : N - 1
- Confronto tra x(ie) e x(ie+1)
- se cambio segno → memorizzo ie
end
Tra x(ie) e x(ie+1) c'è un cambio segno?
- if (x(ie) < 0 ∧ x(ie+1) >= 0) → cambio!
- if (x(ie) >= 0 ∧ x(ie+1) < 0) → cambio!
Operatore relazionale
- > 0 se x(ie) e x(ie+1) hanno stesso segno
- <= 0 se x(ie) e x(ie+1) hanno segno diverso, ossia tra di loro c'è un punto e' zero
if x(ie) * x(ie+1) cambio!
se cambio segno memorizzo ie in icambio
ncambio = 0
for ie = 1 : N - 1
- if x(ie) * x(ie+1) <= 0
- ncambio = ncambio + 1 → aumenta ncambi di 1
- icambio(ncambio) = ie
end
function [G]= prepara_matrice(v)
N= length(v)-1;
G= zeros(N);
G(1,1)= v(1)+v(2);
G(1,2)= -v(2);
G(N,N)= v(N)+v(N+1);
G(N,N-1)= -v(N);
for ic=2:N-1
G(ic, ic-1)= -v(ic);
G(ic, ic)= v(ic)+v(ic+1);
G(ic, ic+1)= -v(ic+1);
end
end
%% Preparazione matrice MM e kk
MM= [eye(N), zeros(N), zeros(N), M];
kk= [zeros(N), -eye(N), k, D];
%% preparazione variabili
t=0:dt:Tf; t=t'; Nt=length(t);
Y= zeros(2*N,Nt); F= zeros(2*,Nt);
%% Integrazione nel Tempo (metodo di Eulero)
Y(1:N,1)= x0;
for it=1:Nt-1
Y(:,it+1)= Y(:,it)+dt * inv(MM) * (-kk*Y(:,it)+F(:,it));
end
disp(' Finito')
%% Disegno dei risultati
figure, plot(t,Y(1:N,:));
end
t(s)
- 0
- 5
- 9
- 11
- 15
- tf = 30
Φ(t)
- 0
- 5
- 0
- 5
- 0
- 0
tp = [0, 5, 9, 11, 15, tf]
Φp = [0, 5, 0, 5, 0, 0]
Funzione di Matlab utile:
- Interp1(tp, Φp, t)
- perché Φ dipende solo da t
Metodo di Eulero
dxdt = ucosα → xm+1 = xm + Δt ⋅ (νm ⋅ cos(σm))
dydt = usenα → ym+1 = ym + Δt ⋅ (νm ⋅ sen(σm))
dσdt = uTαρ → σm+1 = σm + Δt ⋅ (νm ⋅ tg(Φm) / L)
In Matlab:
- sim(x)
- cos(x) => x in rad
- sinα(x)
- cosd(x) => x in gradi
MATLAB:
- Save "Veicolo"
- Clear all;
- V = 10; L = 4;
- xo = 0; yo = 0; tel0 = 0;
- Δt = 0.1; tf = 30;
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.
-
Appunti completi di Metodi numerici - Parte 2
-
Appunti di Metodi numerici
-
Appunti Metodi numerici completi
-
Appunti completi di Metodi numerici - Parte 3