You are on page 1of 16

Laborator #3

Metoda Substitutiei inapoi 1) creati un m-file numit subs_inapoi.m

si puneti in el liniile de cod

--------------------------------------------------------function z=subs_inapoi(a,b) %metoda substitutiei inapoi, a este matricea sistemului % b este termenul liber n=length(b); z=zeros(n,1); z(n)=b(n)/a(n,n); for(i=n-1:-1:1) s=a(i,i+1:n)*z(i+1:n); z(i)=mmmmmmmmmmmmmm; end -------------------------------------------------------Intrebari: 1)care e rostul liniei de cod 'z=zeros(n,1);' ?

2) Inlocuiti linia mmmmmmmmmmmmm din codul de mai sus cu lina de cod potrivita pentru implementarea algoritmului de substitutie inapoi. 3) verificati ca acest cod merge tiparind la linia de comanda

> a=[1,2,3;0,1,2;0,0,3]; > b=[1;2;3]; >z=subs_inapoi(a,b) >a*z-b alternativ, pentru debug puteti introduce in cod la sfarsit de tot linia de cod norm(a*z-b) care evalueaza norma euclidiana a vectorului a*z-b

Metoda lui Gauss fara pivotare: Problema 2: 1) creati un m-file numit gauss-lu.m si puneti in el liniile de cod

-----------------------------------------------------------

function z=gauss_lu(a,b) %metoda lui Gauss fara pivotare, %a este matricea sistemului % b este termenul liber %se cauta x asa ca Ax=b aext=[a,b]; n=length(b); z=zeros(n,1); for(i=1:n-1) for(j=i+1:n) m=aext(j,i)/aext(i,i); %m este multiplicatorul aext(j,i:n+1)=mmmmmmmmmmmmmmmmm; end end z=subs_inapoi(aext(:,1:n),aext(:,n+1)); norm(a*z-b) ----------------------------------------------------1) ce credeti ca reprezinta variabila aext? Dar aext(i,j:n)? Indicatie: definiti o matrice a=[1,2,3;4,5,6;7,8,9] si apoi execuati a(1,2:3). 2) Inlocuiti in codul de mai sus linia mmmmmmmmmmmmmmmmmmmmmmm cu codul corespunzator pentru implementarea metodei lui Gauss fara pivotare. 3) verificati codul tiparind la linia de comanda >a=[1,2,3; 3,2,1;1,7,1]; >b=[1;2,3]; >z=gauss_lu(a,b); >a*z-b o alta verificare >a=randn(100,100); >b=randn(100,1); >tic;gauss_lu(a,b);toc Explicatie: randn(100,100) genereaza in mod aleator o matrice 100x100. ce face randn(100,1)?

punand tic inainte si toc dupa apelul functiei va calcula timpul de executie a codului.

Puneti outputul in raspunsul dumneavoastra.

Factorizarea LU: Problema 3: creati un m-file numit lu.m . Puneti in el liniile de cod --------------------------------------------function [l,u]=lu(a) %descompunerea lu %a este matrice % a=l*u %l inferior triunghiulara cu 1 pe diagonala, u superior triunghiulara ainit=a; n=length(a(1,:)); z=zeros(n,1); l=eye(n); for(i=1:n-1) for(j=i+1:n) l(j,i)=mmmmmmmmmm; a(j,i:n)=nnnnnnnnnnnnnnnnnn; end end u=a; %verificare norm(ainit-l*u) --------------------------------------------1) Inlocuiti in codul de mai sus mmmmmmmmmmm si nnnnnnnnnnnn cu instructiunile corespunzatoare. mmmmmmmmmmmmm este? nnnnnnnnnnnnnnnnnnn este?

2) care e rostul instructiunii ainit=a de sus? puteam pune pur si simplu la sfarsit norm(a-l*u) in loc de norm(ainit-l*u)? 3) Pentru verificare, executati in matlab > l=[1 0 0; 4 1 0; 2 3 1]; >u=[2 3 5;0 2 1;0 0 9]; >a=l*u; >[l,u]=lu(a); Asigurati-va ca ultima comanda produce

l=[1 0 0; 4 1 0; 2 3 1]; u=[2 3 5;0 2 1;0 0 9]; 4) Pentru a= [1 2 3; 2 6 7; 3 10 15] cat este l, cat este u? Metoda lui Gauss cu pivotare: Adaugati in fisierul gauss_lu.m liniile de cod %-------------------------------[M,k]=max(abs(aext(i:n,i))); k=k+i-1; temp=aext(i,i:n+1); aext(i,i:n+1)=aext(k,i:n+1); aext(k,i:n+1)=temp; %-------------------------------exact dupa instructiunea for(i=1:n-1) Modificati deasemenea numele functiei de sus in gauss_plu si apoi salvati fisierul sub numele gauss_plu.m. 1) Care e rostul liniei de cod [M,k]=max(abs(aext(i:n,i))); ? 2) Care e rostul liniei de cod k=k+i-1;? 3) Care e rostul liniilor de cod temp=aext(i,i:n+1); aext(i,i:n+1)=aext(k,i:n+1); aext(k,i:n+1)=temp; ?

4) Verificati codul cu comenzile >a=randn(100,100); >b=randn(100,1); >tic;gauss_plu(a,b);toc 5) Rezolvati sistemul cu matrice a=[0 1 2;1 2 3; 2 -1 1] si termen liber b=[8;14,3] cu gauss_lu si gauss_plu. Puneti solutiile obtinute mai jos. De ce credeti ca gauss_lu va returna o slutie eronata?

5)Factorizarea PLU Salvati fisierul lu.m cu numele plu.m. Modoficati corespunzator antetul fisierului. El trebuie sa arate asa function [p,l,u]=plu(a) 1) Sub linia de cod l=eye(n); adaugati p=eye(n); Care e semnificatia acestei linii. 2) Dupa linia de cod for(i=1:n-1) adaugati %----------------------------------[M,k]=max(abs(a(i:n,i))); k=k+i-1; temp=a(i,i:n); a(i,i:n)=a(k,i:n); a(k,i:n)=temp; temp=p(i,:); p(i,:)=p(k,:); p(k,:)=temp; %----------------------------------Care e rostul ultimelor 3 linii din codul de mai sus? 3)verificati codul cu comenzile a=randn(4,4); [p,l,u]=plu(a); norm(a-p*l*u) Puneti aici outputul 4) executati comenzile a=[0 1 2; 1 2 3; 1 2 -1]; [l,u]=lu(a); [p1, l1,u1]=plu(a); Explicati de ce in acest caz lu nu factorizeaza corect. celor 3 comenzi de mai sus.

Laborator #2 -----------------------------------------------------------------REZOLVARI DE ECUATII NELINIARE Metoda lui Newton Metoda lui Newton utilizeaza derivata unei functii pentru calcularea iteratiei. Pentru aceasta modificam fisierele tanx.m si poly.m pentru a returna deasemenea si derivata, nu numai functia. stergeti tot din fisierul tanx.m si il inlocuiti cu ----------------------------------------function [z,zprime] = tanx(x) % z este tan(x)-2x, zprime e derivata lui tan(x)-2x % data z=tan(x)-2*x; zprime= 1/cos(x).^2 -2; ----------------------------------------salvati tot. observati modificarile care au fost efectuate. acum un apel de tipul [z,z1]=feval(tanx,1) va returna in z valoarea lui tanx in 1 si valoarea derivatei in z1. faceti acelasi lucru cu fisierul poly.m . Urmarim sa aplicam metoda lui Newton pentru a calcula solutiile.

Creati un fisier newton.m in care scrieti liniile de cod -----------------------------------------function [x,numIts,increment]=newton(f,x) % [x,numIts,increment]=newton(f,x) % f numele functiei [y,yprime]=f(x) care defineste ec f=0 % x din input este prima iteratie % x din output este solutia aproximanta % numIts este ??? % increment este ??? % Newton's method este folosita pt a calcula solutia lui f(x)=0 % numele tau si data EPSILON = 1.0e-6; MAXITS = 500; for numIts=1:MAXITS

[z,zprime]=feval(f,x); increment=................. x = x - increment; % instructiune pentru afisare disp(strcat('pas ',num2str(numIts), ' x=', num2str(x), ' increment=', ... num2str(increment) )); if abs(increment)<EPSILON break; end end ------------------------------------------------1) In codul de mai sus inlocuiti punctele si semnele de intrebare cu codul corespunzator. 2) care este acum conditia de oprire a codului? 3)scrieti la linia de comanda > newton('tanx',1.0) cu alte cuvinte, se rezolva ecuatia tanx(x)=0 cu metoda lui Newton cu iteratie initiala x_0=1.0. cate iteratii sunt necesare pentru atingerea tolerantei EPSILON? 4) scrieti > newton('poly',1.4) faceti un tabel cu e_n=|1-solutie_aprox_n| la fiecare iteratie n. Si apoi un tabel cu e_(n+1)/e_n^2 . ce va spune caest tabel de spre rata de convergenta a metodei lui Newton? Explicati rezultatul comenzii newton('tan_example',-100) ---------------------------------------------------------------------REZOLVARI DE ECUATII NELINIARE Metoda secantei este in principiu cam la fel ca metoda lui Newton numai ca derivata se calculeaza numeric.

x_(n+1)=x_n-f(x_n)/a unde fprim=(f(x_n)-f(x_(n-1))/(x_n-x_(n-1))

Creati un fisier secant.m si scrieti in el liniile de cod ---------------------------------function [x,numIts,increment]=secant(f,a,b) % [x,numIts,increment]=newton(f,a,b) % a=x_0,b=x_1 EPSILON = 1.0e-6; MAXITS = 500; fa=feval(f,a); fb=feval(f,b); fprime=(fb-fa)/(b-a); x=b; fx=fb; for numIts=1:MAXITS xold=x; fxold=fx; x = xold - ..........; fx=feval(f,x); fprime=(fx-fxold)/(x-xold); disp(strcat('pas ',num2str(numIts), ' x=', num2str(x), ' increment=', ... num2str(abs(x-xold)) )); if abs(x-xold)<EPSILON break; end end ---------------------------------------1) In codul de mai sus inlocuiti punctele cu codul corespunzator. 2) care este acum conditia de oprire a codului? 3)scrieti la linia de comanda > secant('tanx',1.0) cu alte cuvinte, se rezolva ecuatia tanx(x)=0 cu metoda Secantei cu iteratie initiala x_0=1.0. cate iteratii sunt necesare pentru atingerea tolerantei EPSILON? 4) gasiti un exemplu de functie si iteratii initiale

asa ca metoda secantei sa nu convearga.

Interpolare polinomiala metoda directa. 1. Copiati textul de mai jos in intr-un fisier numit vandermonde.m -----------------------------------function z=vandermonde(xdata,ydata,xval) % xdata valorile pe care se interpoleaza % ydata valorile ce se interpoleaza % xval valoarea unde se evalueaza polinomul interpolant % z polinomului interpolant la xval n=length(xdata); a=zeros(n,n); %construim matricea Vandermonde for i=1:n for j=1:n a(i,j)=mmmmmmmmmmm; end; end; b=a\ydata; d=0; for i=1:n d+=nnnnnnnnnnn; end z=d; ----------------------------------2. Codul de mai sus implementeaza metoda directa de calcul a coeficientilor polinomului interpolant corespunzator vectorilor xdata, ydata. Inlocuiti mmmmmmmm si nnnnnnnnnn mai sus cu codul corespunzator. 3. Efectuati comanda vandermonde([0,1,2]',[0,1,2],3) scrieti mai jos ce ati obtinut. 4. Efectuati comanda vandermonde([0,1,2]',[0,1,4],3) scrieti mai jos ce ati obtinut. 5. Efectuati comanda vandermonde([0,1,2]',[0,1,8],3) scrieti mai jos ce ati obtinut.

Interpolare cu polinoame Lagrange.

1. Construiti o functie lpoly.m care sa evalueze in x polinomul Lagrange corespunzator nodului i, xdata(i), din vectorul xdata. lpoly ar trebui sa arate cam asa: ------------------------------------------function pval = lpoly( i , xdata, x ) pval = 1;n=length(xdata); for j = 1 : n if j ~= i pval = pval .*mmmmmmmmmm; end end -----------------------------------------2. inlocuiti mmmmmmmmm mai sus cu codul corespunzator. 3. Care e sensul notatiei pval .* ?

4. Codul de mai sus lpoly evalueaza in x polinomul Lagrange corespunzator nodului i, xdata(i), din vectorul xdata. Pentru a evalua polinomul lui Lagrange ce interpoleaza datele din xdata, ydata trebuie evaluat fiecare din polinoamele lpoly, inmultite cu ydata(i) corespunzator si apoi sumate. completati cu codul corespunzator algoritmul de mai jos: --------------------------------------------------function pval = lagrange ( xdata, ydata, x ) pval=0;n=length(xdata); for i=1:n pval=pval+ydata(i)*mmmmmmmmmmmmm; end; -------------------------------------------------5. Efectuati comanda lagrange([0,1,2]',[0,1,2],3) scrieti mai jos ce ati obtinut. 6. Efectuati comanda lagrange([0,1,2]',[0,1,4],3) scrieti mai jos ce ati obtinut. 7. Efectuati comanda lagrange([0,1,2]',[0,1,8],3) scrieti mai jos ce ati obtinut.

Interpolare cu diferente divizate

Sa presupunem ca vectorul ydata=[y0,y1,...,yn] contine valorile functiei f pe nodurile xdata=[x0,x1,x2,...,xn]. Se doreste a se calcula diferentele divizate f[x0],f[x0,x1],f[x0,x1,x2],...,f[x0,x1,x2,...,xn] ce sunt necesare pentru calculul polinomului interpolant al lui Newton cu diferente divizate.

1. Sa se modifice codul ddif.m de mai jos ca sa implementeze algoritmul de calcul al diferentelor divizate --------------------------------------function d=ddif(x,y) %x,y vectori n=length(x)-1; d=y; for k=1:n for j=n:-1:k d(j+1)=mmmmmmmmmmmmmm; end; end; -------------------------------------2. Alegeti x=[0,1,2,3],y=[0,3,12,33]. Cat este ddif(x,y)? 3. Utilizam acum Schema lui Horner pentru a evalua polinomul interpolant al lui Newton in x. Sa se completeze algoritmul de mai jos cu codul corespunzator: --------------------------------------------function pval = newton( xdata,ydata, x) %valoarea polinomului interpolant evaluat cu schema lui Horner la x n=length(xdata)-1; d=ddif(xdata,ydata); pval=d(n+1); for i=(n-1):-1:0 pval=mmmmmmmmmm; end; ---------------------------------------------4. Efectuati comanda lagrange([0,1,2]',[0,1,2],3) scrieti mai jos ce ati obtinut. 5. Efectuati comanda lagrange([0,1,2]',[0,1,4],3) scrieti mai jos ce ati obtinut. 6. Efectuati comanda lagrange([0,1,2]',[0,1,8],3) scrieti mai jos ce ati obtinut.

Formula de cuadratura a trapezului: 1) Creati un fisier trapez.m care sa implementeze formula de quadratura a trapezului pe un interval dat [a,b]. Reamintesc ca formula de cuadratura pentru aproximarea integralei functiei f pe [a,b] este (b-a)*(f(b)+f(a))/2. Fisierul trebuie sa contina ---------------------------------------function z=trapez(f,a,b) z=........; ----------------------------------------

2) Cu ce ati inlocuit ............ mai sus? 3) Aproximati cu formula trapezului integrala lui f(x)=x+1 pe [0,1]. Cat este eroarea in aceasta aproximare. Explicati rezultatul. 3) Aproximati cu formula trapezului integrala lui f(x)=x^2 +1 pe [0,1].

Formula de cuadratura a lui Simpson 1) Creati un fisier simpson.m care sa implementeze formula de quadratura a lui Simpson pe un interval dat [a,b]. Reamintesc ca formula de cuadratura pentru aproximarea integralei functiei f pe [a,b] este (b-a)*(f(b)+f(a)+4f((a+b)/2))/6. Fisierul trebuie sa contina ---------------------------------------function z=simpson(f,a,b) z=........; ----------------------------------------

2) Cu ce ati inlocuit ............ mai sus? 3) Aproximati cu formula lui Simpson integrala lui f(x)=x^3+1 pe [0,1]. Cat este eroarea in aceasta aproximare? Explicati rezultatul. 3) Aproximati cu formula trapezului integrala lui f(x)=x^4 +1 pe [0,1].

Formule sumate: Formula sumata a trapezului: 1) Creati un fisier trapezsumat.m care sa implementeze formula sumata a trapezului pe un interval dat [a,b]. Reamintesc ca formula sumata a trapezului pentru aproximarea integralei functiei f pe [a,b] corespunzatoare a n subintervale presupune aplicarea formulei trapezului pe fiecare subinterval si apoi sumarea numerelor obtinute. Fisierul trebuie sa contina ---------------------------------------function integrala=trapezsumat(f,a,b,n) %f functia ce rumeaza a fi integrata %a,b capetele intervalului pe care se integreaza %n numarul de subintervale dx=(b-a)/n; %x_i=a+i*dx; integrala=0; for(i=0:n-1) integrala+= mmmmmmmmm*dx/2; end ----------------------------------------

2) Inlocuiti mmmmmmmmmmmm cu codul corespunzator pentru implementarea formulei sumate a trapezului. 3) Verificati codul aproximand trebui sa obtineti 0. De ce? integrala lui f(x)=x pe [1,1]. Ar

3) Aproximati cu formula sumata a trapezului cu 2 subintervale integrala lui f(x)=e^x pe [0,1]. Cat este eroarea in aceasta aproximare? 4) Repetati testul din 3) cu 4,8,16,32 subintervale. Ce puteti spune despre eroarea in aprximarea integralei?

Formule sumate: Formula sumata a lui Simpson: 1) Creati un fisier simpsonsumat.m care sa implementeze formula sumata a trapezului pe un interval dat [a,b]. Reamintesc ca formula sumata a trapezului pentru aproximarea integralei functiei f pe [a,b] corespunzatoare a n subintervale presupune aplicarea formulei trapezului pe fiecare subinterval si apoi sumarea numerelor obtinute. Fisierul trebuie sa contina ---------------------------------------function integrala=simpsonsumat(f,a,b,n) %f functia ce urmeaza a fi integrata %a,b capetele intervalului pe care se integreaza %n numarul de subintervale dx=(b-a)/n; %x_i=a+i*dx; integrala=0; for(i=0:n-1) integrala+= mmmmmmmmm*dx/6; end ----------------------------------------

2) Inlocuiti mmmmmmmmmmmm cu codul corespunzator pentru implementarea formulei sumate a lui Simpson. 3) Verificati codul aproximand trebui sa obtineti 0. De ce? integrala lui f(x)=x^3 pe [1,1]. Ar

3) Aproximati cu formula sumata a trapezului cu 2 subintervale integrala lui f(x)=e^x pe [0,1]. Cat este eroarea in aceasta aproximare?

4) Repetati testul din 3) cu 4,8,16,32 subintervale. Ce puteti spune despre eroarea in aproximarea integralei?

Laborator #8 1)Descarcati fisierul ponderi.m de la www.matbin.ro/numerica/ponderi.m Acest fisier returneaza nodurile x_i si ponderile W_i pentru formula de cuadratura a lui Gauss-Legendre. ////////////////////////////////////////////////////////////////////

2)Scrieti o rutina care sa contina:

gl.m

function int_approx = gl( f, a, b, n ). [x, w] = ponderi ( a, b, n ); fx = mmmmmmmm; int_approx = w*fx'; Cu ce inlocuim mmmmmmmm mai sus?

3. Verificati-va rutina prin calcularea integralei polinomului x^2 pe [0,3] utilizand n=2 si n=5. Pentru apelul inline al functiei x^2 putem utiliza comanda. n=2;gl(inline('x.^2'),0,3,n); //////////////////////////////////////////////////////////////////// 4. Urmarim a verifica faptul ca metoda Gauss-Legendre cu n noduri e exacta pe polinoame de grad 2n-1. Pentru aceasta, evaluam succesiv gl(inline('n*x.^(n-1)'),0,3,2)-3^n; unde n ia valorile 2,3,4,5,6,7,8. Remarcam ca aceasta e eroarea in aproximarea integralei lui n*x^(n-1) pe [0,3] cu metoda Gauss-Legendre cu 2 noduri. Care e primul n pentru care eroarea e diferita de 0?

Formula de cuadratura Gauss-Legendre sumata Se imparte intervalul de integrare in subintervale de lungime egala si se aplica formula de cuadratura Gauss-Legendre pe fiecare subinterval. 1) Scrieti o functie numita gls.m care sa implementeze formula de cuadratura Gauss-Legendre sumata. Fisierul gls.m ar trebui sa contina function int_aprox = gls( f, a, b, n, subs) %n- numarul de noduri in metoda Gauss-Legendre %subs numarul de subintervale pe care se face sumarea int_aprox=0; dx=(b-a)/subs; for(i=1:subs) int_aprox+=mmmmmmmm; end //////////////////////////////////////////////////////////////////// 2. Care este expresia lui mmmmmm?

3. Verificati ca atunci cand subs=1 gls si gl returneaza acelasi rezultat, de pilda pentru functia x^3, cu n=2. //////////////////////////////////////////////////////////////////// 4. Utilizam 2 noduri pentru formula de cuadratura Gauss-Legendre pe fiecare subinterval. Calculam succesiv gls(f, -5,5,2, subs) cu f(x)=1/(1+x^2) si subs=40,80,160,320. Valoarea exacta a integralei este 5*arctan(5). Inspectati raportul erorilor consecutive si estimati ordinul de convergenta al metodei Gauss-Legendre sumate

You might also like