Prova Pratica di CALCOLO NUMERICO
05 novembre 2019
Esercizio 1
Si consideri il sistema lineare , con:
ed il vettore tale che la soluzione del sistema sia
N=5;a=3;
d=[-[Link]-14];
E=a*tril(ones(N),-1)
E = 5×5
0 0 0 0 0
3 0 0 0 0
3 3 0 0 0
3 3 3 0 0
3 3 3 3 0
F=E'
F = 5×5
0 3 3 3 3
0 0 3 3 3
0 0 0 3 3
0 0 0 0 3
0 0 0 0 0
D=diag(d)
D = 5×5
-30 0 0 0 0
0 -26 0 0 0
0 0 -22 0 0
0 0 0 -18 0
0 0 0 0 -14
A=D+E+F
A = 5×5
-30 3 3 3 3
3 -26 3 3 3
3 3 -22 3 3
3 3 3 -18 3
3 3 3 3 -14
alpha=ones(N,1);
1
b=A*alpha;
• Si stabilisca teoricamente, motivando la risposta, se i metodi di Jacobi e Gauss-Seidel risultano
convergenti e si dica, utilizzando il Matlab, quale dei due metodi risulta più veloce.
Per rispondere alla prima parte della domanda si può sfruttare la diagonale dominanza, per la seconda:
B_GS=eye(N)-inv(D+E)*A;%matrice di iterazione B_GS del met.
rho_GS=max(abs(eig(B_GS)))
rho_GS = 0.3515
B_J=eye(N)-inv(D)*A; %matrice di iterazione B_J del metodo
rho_J=max(abs(eig(B_J)))
rho_J = 0.5773
• Si costruisca un file Matlab: Cognome_studente_matricola.m che, una volta avviato:
• faccia visualizzare una schermata con i dati personali ed una breve descrizione del problema;
• contenga le istruzioni relative alla costruzione della matrice A utilizzando i comandi Matlab diag, ones
e tril;
• risolva numericamente il sistema utilizzando il metodo che fornisca la convergenza migliore
utilizzando: , , nmax= 50;
• si calcoli l’errore assoluto ad ogni iterazione in norma infinito;
• si costruisca una tabella in cui compaiano l’intestazione e i corrispondenti valori presi ogni 3:
• iter soluzione errore
• dove iter è il vettore delle iterazioni, soluzione e errore sono rispettivamente la matrice delle soluzioni
approssimate e l’errore assoluto corrispondenti.
Si utilizzino i seguenti formati:
2 cifre intere per iter;
12 cifre decimali e formato virgola fissa per soluzione;
1 cifre decimali e formato esponenziale per errore.
nmax=50; toll=1e-12;
x0=zeros(N,1);omega=1;
[x,iter,residuo,rho]=Gauss_Seidel_ril(A,b,x0,omega,nmax,toll);
for i=1:iter+1
err(i,1)=norm(x(i,:)-alpha',inf)/norm(alpha,inf);
end
tab=[[0:iter]' x err ];tab=[tab([Link]nd,:)];
fprintf(' n \t\t soluzione \t\t\t\t\t\t\t errore \n')
n soluzione errore
2
fprintf('%2d %15.12f %15.12f %15.12f %15.12f %15.12f %10.1e \n', tab')
0 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 1.0e+00
3 0.948429162765 0.950765425587 0.953288926804 0.955939437869 0.958947775648 5.2e-02
6 0.997763120672 0.997862598637 0.997970086995 0.998087546474 0.998217861310 2.2e-03
9 0.999902880681 0.999907198945 0.999911865720 0.999916965907 0.999922623840 9.7e-05
12 0.999995783310 0.999995970799 0.999996173419 0.999996394857 0.999996640511 4.2e-06
15 0.999999816921 0.999999825062 0.999999833859 0.999999843473 0.999999854139 1.8e-07
18 0.999999992051 0.999999992405 0.999999992787 0.999999993204 0.999999993667 7.9e-09
21 0.999999999655 0.999999999670 0.999999999687 0.999999999705 0.999999999725 3.5e-10
24 0.999999999985 0.999999999986 0.999999999986 0.999999999987 0.999999999988 1.5e-11
27 0.999999999999 0.999999999999 0.999999999999 0.999999999999 0.999999999999 6.5e-13
Sia data l’equazione:
• Dopo aver individuato il dominio della funzione , determinare gli intervalli/o di separazione delle
soluzioni/e dell’equazione data.
polinomio di grado tre max 3 radici.
posso usare anche rooots per determinare i valori approssimati delle radici e quindi scegliere gli intervalli
C=[1 -3 1 1];
sol=roots(C)
sol = 3×1
2.4142
1.0000
-0.4142
La funzione ha 3 soluzioni reali alfa1= -0.4142 in [-1 0],alfa2=1 in %
[0.5,1.5];alfa3=2.4142 in [2,3].
f=@(x)[x.^3-3*x.^2+x+1 0.*x];
figure(1)
IC=[-1,3];
fplot(f,IC),grid
title('funzione f in [-1,3]')
3
•
Stabilire se il metodo iterativo con è convergente alla prima soluzione
positiva.
I=[0.5,1.5];
g=@(x)[sqrt((x.^3+x+1)./3) x];
dg=@(x)(3*x.^2+1).*sqrt(3./(x.^3+x+1))./6;
figure(2)
subplot(121),fplot(g,I),grid
title('y=g(x) e y=x in I')
subplot(122),fplot(dg,I),grid
title('g'' in I')
4
Lo studente verifichi che tale metodo non sarà convergente per determinare la seconda soluzione
• Si costruisca un file MATLAB che:
• riporti le istruzioni Matlab utilizzate per rispondere ai punti b) e c);
• applichi il metodo per approssimare la prima radice positiva, con , e ;
• si costruisca una tabella, prendendo i valori 1 ogni 5, che riporti l’intestazione:
it soluzione fx err
dove it è il vettore delle iterazioni, soluzione indica la soluzione approssimata corrispondente, fx il modulo del
residuo ed err l’errore assoluto, con formati opportuni.
x0= 0.8;nmax=50;toll=1e-9;
f='x.^3-3*x.^2+x+1';
g='sqrt((x.^3+x+1)./3)';
[xvectF,xdiffF,fxF,itF,pF,cF]=Punto_fisso(x0,nmax,toll,f,g);
Numero di Iterazioni : 45
Radice calcolata : 9.9999999811606166e-01
Ordine stimato : 0.9999997416148657
Fattore di riduzione : 0.6666632088822753
errore= abs(xvectF-1);
tabF=[(0:itF)' xvectF fxF errore];tabrid=tabF([Link]nd,:);
5
fprintf('iterF xF fxF errore\n')
iterF xF fxF errore
fprintf('%2d %18.14f %10.2e %10.2e\n', tabrid')
0 0.80000000000000 3.92e-01 2.00e-01
5 0.97860819160896 4.28e-02 2.14e-02
10 0.99724733291479 5.51e-03 2.75e-03
15 0.99963858962959 7.23e-04 3.61e-04
20 0.99995242552913 9.51e-05 4.76e-05
25 0.99999373537259 1.25e-05 6.26e-06
30 0.99999917503410 1.65e-06 8.25e-07
35 0.99999989136261 2.17e-07 1.09e-07
40 0.99999998569384 2.86e-08 1.43e-08
45 0.99999999811606 3.77e-09 1.88e-09