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
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;