Lezioni del 13 e 20 aprile 2007¶
Metodi Numerici per l’equazione del trasporto lineare
Vari dati iniziali: Funzione di Heaviside:
File h0.m
:open:
1%
2% Funzione di Heaviside (rovesciata)
3%
4% -----+
5% |
6% +---------------
7%
8function y=h0(x)
9%
10% se x`e' uno scalare si puo' scrivere cosi:
11%
12% if (x > 0)
13% y = 0;
14% else
15% y = 1;
16% end
17%
18% nel caso vettoriale bisogna fare un ciclo sulle componenti di x
19%
20 y = zeros(size(x)) ;
21 [n,m] = size(x) ;
22 for i=1:n
23 for j=1:m
24 if ( x(i,j) < 0 )
25 y(i,j) = 1;
26 end
27 end
28 end
29end
Onda sinusuidale modulata con una campana:
File p0.m
:open:
1%
2% onda sinusuidale modulata con una campana
3%
4% sin(x) / (1+x^2)
5%
6function y=p0(x)
7 y = sin(x) ./ (1+x.^2 );
8end
Funzione scalino in \([-1,1]\):
File q0.m
:open:
1%
2% Funzione scalino in [-1,1]
3%
4% +-----+
5% | |
6% ----------+ +---------------
7%
8function y=q0(x)
9%
10% se x`e' uno scalare si puo' scrivere cosi:
11%
12% if (x < -1)
13% y = 0;
14% else if ( x > 1 )
15% y = 0;
16% else
17% y = 1;
18% end
19%
20% nel caso vettoriale bisogna fare un ciclo sulle componenti di x
21%
22 y = zeros(size(x)) ;
23 [n,m] = size(x) ;
24 for i=1:n
25 for j=1:m
26 if ( x(i,j) > -1 && x(i,j) < 1 )
27 y(i,j) = 1;
28 end
29 end
30 end
31end
Il seguente programma costruisce la soluzione esatta del problema (con dato iniziale p0.m):
File p.m
:open:
1%
2% Soluzione esatta del problema
3%
4% q (x,t) - x t q (x,t) = 0 dato iniziale q(x,0) = q0(x)
5% t x
6%
7%
8% q(x,t) = q0(x e^(t^2/2) )
9%
10function y=p(x,t)
11 y = p0( x .* exp(t^2/2) ) ;
12end
\[q_t(x,t)-xtq(x,t)=0\]
Il seguente programma costruisce la soluzione esatta del problema (con dato iniziale q0.m):
File q.m
:open:
1%
2% Soluzione esatta del problema
3%
4% q (x,t) - x t q (x,t) = 0 dato iniziale q(x,0) = q0(x)
5% t x
6%
7%
8% q(x,t) = q0(x e^(t^2/2) )
9%
10function y=q(x,t)
11 y = q0( x .* exp(t^2/2) ) ;
12end
Programmi <B>driver</B> per verificare varie soluzioni:
File test.m
:open:
1hold off ;
2x = [-2:0.01:2] ;
3plot(x,q0(x),'.-b','LineWidth',1.5) ; hold on ;
4plot(x,q(x,1),'+-r') ; hold on ;
5plot(x,q(x,2),'o-y') ; hold on ;
6plot(x,q(x,3),'.-m') ; hold on ;
7plot(x,q(x,4),'.-g') ; hold on ;
8
9legend('q0','t=1','t=2','t=3','t=4');
10axis([-2,2,-0.1,1.1]);
File test1.m
:open:
1hold off ;
2x = [-2:0.01:2] ;
3plot(x,p0(x),'.-b','LineWidth',1.5) ; hold on ;
4plot(x,p(x,1),'+-r') ; hold on ;
5plot(x,p(x,2),'o-y') ; hold on ;
6plot(x,p(x,3),'.-m') ; hold on ;
7plot(x,p(x,4),'.-g') ; hold on ;
8
9legend('p0','t=1','t=2','t=3','t=4');
10axis([-2,2,-0.5,0.5]);
File test2.m
:open:
1hold off ;
2beta = -0.5 ;
3x = [-2:0.01:2] ;
4plot(x,q0(x),'.-b','LineWidth',1.5) ; hold on ;
5plot(x,esatta(x,1,beta,@q0),'+-r') ; hold on ;
6plot(x,esatta(x,2,beta,@q0),'o-y') ; hold on ;
7plot(x,esatta(x,3,beta,@q0),'.-m') ; hold on ;
8plot(x,esatta(x,4,beta,@q0),'.-g') ; hold on ;
9
10legend('p0','t=1','t=2','t=3','t=4');
11axis([-2,2,-0.1,1.1]);
File test3.m
:open:
1hold off ;
2alpha = 0.5 ;
3x = [-5:0.01:5] ;
4plot(x,h0(x),'.-b','LineWidth',1.5) ; hold on ;
5plot(x,trasporto(x,1,alpha,@h0),'+-r') ; hold on ;
6plot(x,trasporto(x,2,alpha,@h0),'o-y') ; hold on ;
7plot(x,trasporto(x,3,alpha,@h0),'.-m') ; hold on ;
8plot(x,trasporto(x,4,alpha,@h0),'.-g') ; hold on ;
9
10legend('p0','t=1','t=2','t=3','t=4');
11axis([-5,5,-0.1,1.1]);
Programma driver che permette di generare la soluzione esatta dato un profilo iniziale:
File trasporto.m
:open:
1%
2% Soluzione esatta del problema
3%
4% q (x,t) + alpha q (x,t) = 0 dato iniziale q(x,0) = q0(x)
5% t x
6%
7%
8% q(x,t) = q0(x - alpha * t )
9%
10function y=trasporto(x,t,alpha,q0)
11 y = q0( x - alpha .* t ) ;
12end