Il 0% ha trovato utile questo documento (0 voti)
25 visualizzazioni6 pagine

Compito 05 11 2019

Il documento descrive un esercizio di calcolo numerico che prevede la risoluzione di un sistema lineare tramite i metodi di Jacobi e Gauss-Seidel. Vengono fornite indicazioni per stabilire quale metodo è più veloce e per scrivere un file MATLAB che risolva numericamente il sistema.

Caricato da

Giacomo Reale
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
25 visualizzazioni6 pagine

Compito 05 11 2019

Il documento descrive un esercizio di calcolo numerico che prevede la risoluzione di un sistema lineare tramite i metodi di Jacobi e Gauss-Seidel. Vengono fornite indicazioni per stabilire quale metodo è più veloce e per scrivere un file MATLAB che risolva numericamente il sistema.

Caricato da

Giacomo Reale
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

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

Potrebbero piacerti anche