Sunteți pe pagina 1din 38

Portofoliu Metode Numerice

Coordonator:Prof.Univ.Dr.Ing.Bogdan Sebacher

Nume:Std.Cap. Ilcenco Remus-Teodor

Grupa:E222

METODE DIRECTE PENTRU REZOLVAREA SISTEMELOR DE ECUATII


LINIARE

1.1 Metoda lui Cramer

Se considera sistemul:

5a+7b+3c=3

4a+6b+3c=4

3a+6b+3c=2
1.2 Metoda de eliminare a lui Gauss
Se considera sistemul:

a+5b+3c=6
5a+3b+7c=4
8a+4b+6c=6

function [sol] = Eliminare_Gauss(A,b)


n=size(A,1);
i=1;
while i<n
j=i;
while j<=n && A(j,i)==0
j=j+1;
end
if j>n
error('Determinat zero. Sistemul nu are solutie
unica sau nu are solutie');
end
if j~=i
aux=A(i,i:n);
A(i,i:n)=A(j,i:n);
A(j,i:n)=aux;
aux=b(i);
b(i)=b(j);
b(j)=aux;
end
for j=i+1:n
b(j)=b(j)-A(j,i)/A(i,i)*b(i);
A(j,i:n)=A(j,i:n)-A(j,i)/A(i,i)*A(i,i:n);
end
i=i+1;
end
if A(n,n)==0
error('Determinat zero. Sistemul nu are solutie unica
sau nu are solutie');
end
sol=zeros(n,1);
sol(n)=b(n)/A(n,n);
for i=n-1:-1:1
sol(i)=(b(i)-A(i,i+1:n)*sol(i+1:n))/A(i,i);
end
end
1.3 Metoda de factorizare L.U

Se considera sistemul:

a+3b+2c=4

2a+4b+7c=2

a+b+3c=1
L =

0.5000 1.0000 0
1.0000 0 0
0.5000 -1.0000 1.0000

U =

2.0000 4.0000 7.0000


0 1.0000 -1.5000
0 0 -2.0000
solutia1 =

4.7500
0.7500
-1.5000

solutia2 =

4.7500
0.7500
-1.5000

>>

1.4 Timpi de executie


n=1000;
A=randn(n);
b=randn(n,1);

tic
sol1=linsolve(A,b);
toc

tic
sol2=A^(-1)*b;
toc

tic
sol3=Cramer(A,b);
toc

tic
sol4=Eliminare_Gauss(A,b);
toc
Elapsed time is 0.014195 seconds.-SOL1
Elapsed time is 0.035349 seconds.-SOL2
Elapsed time is 20.075823 seconds.-SOL3
Elapsed time is 3.849522 seconds.-SOL4

Se poate observa faptul ca timpul de executie pentru metoda


rezolvarii cu linsolve este cel mai mic.

METODE INDIRECTE PENTRU REZOLVAREA SISTEMELOR DE ECUATII


LINIARE
Se considera sistemul:
3a+2b+6c=4
4a+3b+7c=4
6a+3b+2c=8

A=[3 2 6;4 3 7;6 3 2];


b=[4;4;8];
sol=linsolve(A,b)

sol =

2.7692
-3.0769
0.3077

2.1 Metoda Jacobi


function [sol_aprox, nr_iter] = Jacobi(A,b,eps,maxiter)
% Input
% A ---> este matricea sistemului
% b ---> este coloana termenilor liberi
% eps ---> este eroarea cu care gasim solutia aproximativa
% maxiter ---> este un numar maxim de iteratii pentru
metoda
% Output
% sol_aprox ---> este solutia aproximativa a sistemului
Ax=b
% nr_iter ---> este numde iteratii efectuat de metoda lui
Jacobi pentru a
% gasi sol_aprox cu eroarea eps
n=size(A,1);B=zeros(n);c=zeros(n,1);
for i=1:n
if A(i,i)==0
error('Matricea A are elemente nule pe diagonala
principala. Metoda lui Jacobi nu functioneaza')
end
B(i,:)=-A(i,:)/A(i,i);B(i,i)=0;
c(i)=b(i)/A(i,i);
end
if Norm_inf(B)>=1
error('Matricea sistemului nu este tare diagonal
dominanta. Metoda Jacobi nu functioneaza')
else
X0=zeros(n,1); % initializarea ---> primul termen din
sirul care converge la solutie
nr_iter=1;
X1=B*X0+c; % facem prima iteratie si il calculam pe X1
while max(abs(X1-X0)) > eps && nr_iter<=maxiter
nr_iter=nr_iter+1;% trec la urmatoarea iteratie,
incrementez numarul de iteratii
X0=X1; % reinitializez procedura
X1=B*X0+c;% fac iteratia, calculez un nou termen al
sirului
end
sol_aprox=X1;
if nr_iter>maxiter
error('Numarul maxim de iteratii a fost atins.
Verifica solutia');
end
end
end

>>A=[9 3 5;2 7 3;4 3 8]

A =

9 3 5

2 7 3

4 3 8

>> b=[2;8;3]

b =

>> [sol1,it1]=Jacobi(A,b,10^(-4),1000)

sol1 =

-0.1861
1.1860
0.0232

it1 = 48

2.2 Metoda Gauss-Seidel

function [sol_aprox, nr_iter] =


Gauss_Seidel(A,b,eps,maxiter)
% Input
% A ---> este matricea sistemului
% b ---> este coloana termenilor liberi
% eps ---> este eroarea cu care gasim solutia aproximativa
% maxiter ---> este un numar maxim de iteratii pentru metoda
Jacobi
% Output
% sol_aprox ---> este solutia aproximativa a sistemului Ax=b
% nr_iter ---> este numarul de iteratii efectuat de metoda
lui Jacobi pentru a
% gasi sol_aprox cu eroarea eps
n=size(A,1);B=zeros(n);c=zeros(n,1);
for i=1:n
if A(i,i)==0
error('Matricea A are elemente nule pe diagonala
principala. Metoda lui Gauss-Seidel nu functioneaza')
end
B(i,:)=-A(i,:)/A(i,i);B(i,i)=0;
c(i)=b(i)/A(i,i);
end

if Norm_inf(B)>=1
b=A'*b;
A=A'*A;
for i=1:n
B(i,:)=-A(i,:)/A(i,i);B(i,i)=0;
c(i)=b(i)/A(i,i);
end
X0=zeros(n,1); X1=zeros(n,1);% initializarea --->
primul termen din sirul care converge la solutie
nr_iter=1;
for i=1:n
X1(i)= B(i,1:i-1)*X1(1:i-1)+B(i,i+1:n)*X0(i+1:n)+c(i);
%facem prima iteratie si il calculam pe X1
end
while max(abs(X1-X0)) > eps && nr_iter<=maxiter
nr_iter=nr_iter+1;% trec la urmatoarea iteratie,
incrementez numarul de iteratii
X0=X1; % reinitializez procedura
for i=1:n
X1(i)=B(i,1:i-1)*X1(1:i-1)+B(i,i+1:n)*X0(i+1:n)+c(i);
%facem o noua iteratie si il calculam pe X1
end
end
sol_aprox=X1;
if nr_iter>maxiter
error('Numarul maxim de iteratii a fost atins.
Verifica solutia');
end

else
X0=zeros(n,1); X1=zeros(n,1);% initializarea --->
primul termen din sirul care converge la solutie
nr_iter=1;
for i=1:n
X1(i)= B(i,1:i-1)*X1(1:i-1)+B(i,i+1:n)*X0(i+1:n)+c(i);
%facem prima iteratie si il calculam pe X1
end
while max(abs(X1-X0)) > eps && nr_iter<=maxiter
nr_iter=nr_iter+1;% trec la urmatoarea iteratie,
incrementez numarul de iteratii
X0=X1; % reinitializez procedura
for i=1:n
X1(i)=B(i,1:i-1)*X1(1:i-1)+B(i,i+1:n)*X0(i+1:n)+c(i);
%facem o noua iteratie si il calculam pe X1
end
end
sol_aprox=X1;
if nr_iter>maxiter
error('Numarul maxim de iteratii a fost atins.
Verifica solutia');
end
end
end

>> clear
>> A=[3 4 5;1 2 3;2 3 4];
>> b=[2;3;4];
>>
>> [sol2,it2]=Gauss_Seidel(A,b,10^(-2),2000)

sol2 =

-3.2485
2.0597
0.8239

it2 =
97

2.3 Metoda Gauss-Seidel2

function [sol_aprox, nr_iter] =


Gauss_Seidel(A,b,eps,maxiter)
% Input
% A ---> este matricea sistemului
% b ---> este coloana termenilor liberi
% eps ---> este eroarea cu care gasim solutia aproximativa
% maxiter ---> este un numar maxim de iteratii pentru metoda
Jacobi
% Output
% sol_aprox ---> este solutia aproximativa a sistemului Ax=b
% nr_iter ---> este numarul de iteratii efectuat de metoda
lui Jacobi pentru a
% gasi sol_aprox cu eroarea eps
n=size(A,1);B=zeros(n);c=zeros(n,1);
for i=1:n
if A(i,i)==0
error('Matricea A are elemente nule pe diagonala
principala. Metoda lui Gauss-Seidel nu functioneaza')
end
B(i,:)=-A(i,:)/A(i,i);B(i,i)=0;
c(i)=b(i)/A(i,i);
end
if Norm_inf(B)>=1
error('Matricea sistemului nu este tare diagonal
dominanta. Metoda Gauss Seidel nu functioneaza')
else
X0=zeros(n,1); X1=zeros(n,1);% initializarea --->
primul termen din sirul care converge la solutie
nr_iter=1;
for i=1:n
X1(i)= B(i,1:i-1)*X1(1:i-1)+B(i,i+1:n)*X0(i+1:n)+c(i);
%facem prima iteratie si il calculam pe X1
end
while max(abs(X1-X0)) > eps && nr_iter<=maxiter
nr_iter=nr_iter+1;% trec la urmatoarea iteratie,
incrementez numarul de iteratii
X0=X1; % reinitializez procedura
for i=1:n
X1(i)=B(i,1:i-1)*X1(1:i-1)+B(i,i+1:n)*X0(i+1:n)+c(i);
%facem o noua iteratie si il calculam pe X1
end
end
sol_aprox=X1;
if nr_iter>maxiter
error('Numarul maxim de iteratii a fost atins.
Verifica solutia');
end
end
end

>> clear
>> A=[4 1 2;1 4 2;1 2 5];
>> b=[1;2;3];
>> [sol2,it2]=Gauss_Seidel2(A,b,10^(-2),1000)

sol2 =

-0.0704
0.2638
0.5086

it2 =

>>

2.4 Norm_inf

function [ normainf ] = Norm_inf( A )

normainf=max(sum(abs(A')));

end

>> A=[4 5 6;1 2 3;4 0 6];


>> Norm_inf(A)

2.5 Timpi de executie


n=10000;
A=randn(n);
for i=1:n
A(i,i)=n;
end

b=randn(n,1);

tic
sol=linsolve(A,b);
toc

tic
[sol1,it1]=Jacobi(A,b,10^(-4),1000);
toc

% tic
% [sol2,it2]=Gauss_Seidel(A,b,10^(-2),1000);
% toc

>> timpi_executie

Elapsed time is 7.835573 seconds.


Elapsed time is 2.512873 seconds.
Elapsed time is 5.596875 seconds.

Se observa ca metoda Gauss-Seidel este cea mai eficienta din punctul


de vedere al timpului de executie (timp de executie 2.512873
secunde).
Desi rezolvarea cu metoda LINSOLVE este mai rapida decat celelalte
metode directe, ea este mai lenta decat metodele indirecte.

METODE NUMERICE PENTRU REZOLVAREA SISTEMELOR DE ECUATII


NELINIARE

3.1 Newton Rahpson

function [sol, nriter]=Newton_Rahpson(X0,eps,maxiter)


syms x y z
F(x,y,z)=[sin(2*x*y)+exp(x*y*x)-x^2+y*z-z^2-2;...
x^2*y-x+z^3-5;...
exp(y)-exp(x*z^2)+y-6]
J_F=jacobian(F)
nriter=0;
fid=fopen('Newton_Rahpson.txt','w');
fprintf(fid,' Iteratia x y z f1(x,y,z) f2(x,y,z) f3(x,y,z) \
n');
fprintf(fid,' %8.0d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter, X0', double(F(X0(1),X0(2),X0(3)))');
nriter=nriter+1;
X1=X0-double(subs(J_F,[x y z],[X0(1) X0(2) X0(3)]))^(-
1)*double(F(X0(1),X0(2),X0(3)));
fprintf(fid,' %8.0d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(F(X1(1),X1(2),X1(3)))');
while max(abs(X1-X0))>=eps && nriter<=maxiter
nriter=nriter+1;
X0=X1;
X1=X0-double(subs(J_F,[x y z],[X0(1) X0(2) X0(3)]))^(-
1)*double(F(X0(1),X0(2),X0(3)));
fprintf(fid,' %8.0d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1', double(F(X1(1),X1(2),X1(3)))');
end
sol=X1;
if nriter>maxiter
error('Numarul maxim de iteratii a fost atins. Verifica
solutia')
end
fclose(fid);
end

>> [sol,nriter]=Newton_Rahpson([1;1;2],10^(-3),100)

F(x, y, z) =

exp(x^2*y) + sin(2*x*y) + y*z - x^2 - z^2 - 2


y*x^2 - x + z^3 - 5
y - exp(x*z^2) + exp(y) - 6

J_F(x, y, z) =

[2*y*cos(2*x*y) - 2*x + 2*x*y*exp(x^2*y), z + x^2*exp(x^2*y) +


2*x*cos(2*x*y), y - 2*z]
[ 2*x*y - 1,
x^2, 3*z^2]
[ -z^2*exp(x*z^2),
exp(y) + 1, -2*x*z*exp(x*z^2)]

sol =

0.2404
1.8275
1.7252

nriter =

3.2 Newton Rahpson 2

function [sol, nriter]=Newton_Rahpson2(X0,eps,maxiter)


syms x y z
F(x,y,z)=[((2*x-1)^2+(y-3)^2+(z-2)^2)^(1/6)-((x+1)^2+
(y+2)^2+(z-3)^2)+sqrt(6)+sqrt(23);...
((x+y+1)^2+(y-1+x)^2+(z*y+2)^2)^(1/2)-((x-1)^2+
(y+2)^2+(z*x-3)^2)^(1/2)-3*sqrt(2)+sqrt(3);...
((x-1-y^2)^2+(y+1)^2+(z-2)^2)^(1/3)-((x-1)^2+
(y+2)^2+(z-3)^2)^(1/2)-sqrt(7)+sqrt(23)];
J_F=jacobian(F);

nriter=0;
fid=fopen('Newton_Rahpson2.txt','w');
fprintf(fid,' Iteratia x y z
f1(x,y,z) f2(x,y,z) f3(x,y,z) \n');
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter, X0', double(F(X0(1),X0(2),X0(3)))');
nriter=nriter+1;
X1=X0-double(subs(J_F,[x y z],[X0(1) X0(2) X0(3)]))^(-
1)*double(F(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(F(X1(1),X1(2),X1(3)))');

while max(abs(X1-X0))>=eps && nriter<=maxiter


nriter=nriter+1;
X0=X1;
X1=X0-pinv(double(subs(J_F,[x y z],[X0(1) X0(2)
X0(3)])))*double(F(X0(1),X0(2),X0(3)));
%X1=X0-double(subs(J_F,[x y z],[X0(1) X0(2)
X0(3)]))^(-1)*double(F(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f %8.6f
%8.6f \n ',nriter,X1', double(F(X1(1),X1(2),X1(3)))');
end
sol=X1;
if nriter>maxiter
fprintf('Numarul maxim de iteratii a fost atins.
Verifica solutia \n')
end
fclose(fid);
end

>> [sol,nriter]=Newton_Rahpson2([3;1;2],10^(-3),200)
Numarul maxim de iteratii a fost atins. Verifica solutia

sol =

-2.3350
-0.6002
-0.4337

nriter =

201

3.3 Newton Rahpson 3

function [sol, nriter]=Newton_Rahpson3(X0,eps,maxiter)


er=0.1*randn(1,3);
syms x y z
F(x,y,z)=[((x-7)^2+(y-3)^2+(z-2)^2)^(1/2)-((x-15)^2+(y+2)^2+
(z-3)^2)^(1/7)-sqrt(6)+sqrt(4)+er(1);...
((x+2)^2+(y-1)^2+(z+2)^2)^(1/26)-((x-13)^2+
(y+2)^2+(z+3)^2))-12*sqrt(2)+sqrt(3)+er(2);...
((x-3)^2+(y*z*X+1)^2+(z+x*4)^2)^(1/2*x)-((x-12)^2+
(y+12)^2+(z+8)^2)^(1/2)-sqrt(7)+sqrt(3)+er(3)];
J_F=jacobian(F);
nriter=0;
fid=fopen('Newton_Rahpson2.txt','w');
fprintf(fid,' Iteratia x y z
f1(x,y,z) f2(x,y,z) f3(x,y,z) \n');
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter, X0', double(F(X0(1),X0(2),X0(3)))');
nriter=nriter+1;
X1=X0-double(subs(J_F,[x y z],[X0(1) X0(2) X0(3)]))^(-
1)*double(F(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(F(X1(1),X1(2),X1(3)))');

while max(abs(X1-X0))>=eps && nriter<=maxiter


nriter=nriter+1;
X0=X1;
X1=X0-pinv(double(subs(J_F,[x y z],[X0(1) X0(2)
X0(3)])))*double(F(X0(1),X0(2),X0(3)));
%X1=X0-double(subs(J_F,[x y z],[X0(1) X0(2)
X0(3)]))^(-1)*double(F(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f %8.6f
%8.6f \n ',nriter,X1', double(F(X1(1),X1(2),X1(3)))');
end
sol=X1;
if nriter>maxiter
fprintf('Numarul maxim de iteratii a fost atins.
Verifica solutia \n')
end
fclose(fid);
end

>> clear
>> [sol,nriter]=Newton_Rahpson2([4;1;2],10^(-2),100)

Numarul maxim de iteratii a fost atins. Verifica solutia

sol =

8.2602
2.4252
-3.6923

nriter =
101

METODE NUMERICE PENTRU OPTIMIZAREA FUNCTIILOR

4.1 Metoda gradientului descendent 1

function [sol, nriter]=Gradient_Descent(X0,alfa,eps,maxiter)


syms x y z
f(x,y,z)=(((x-1)^2+(y-4)^2+(z-2)^2)^(1/2)-((x-1)^2+(y+2)^2+
(z-3)^2)^(1/2)-sqrt(6)+sqrt(13))^2+...
(((x+2)^2+(y-1)^2+(z+2)^2)^(1/2)-((x-1)^2+(y+2)^2+(z-
3)^2)^(1/2)-3*sqrt(2)+sqrt(14))^2+...
(((x-1)^2+(y+1)^2+(z-5)^2)^(1/3)-((x-1)^2+(y+2)^2+(z-
2)^2)^(1/2)-sqrt(14)+sqrt(14))^2;
Grad_f=gradient(f);
nriter=0;
fid=fopen('GradientDescent.txt','w');
fprintf(fid,' Iteratia x y z f(x,y,z) \n');
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f \n ',nriter, X0',
double(f(X0(1),X0(2),X0(3)))');
nriter=nriter+1;
X1=X0-alfa*double(Grad_f(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(f(X1(1),X1(2),X1(3)))');
while max(abs(X1-X0))>=eps && nriter<=maxiter
nriter=nriter+1
X0=X1;
X1=X0-alfa*double(Grad_f(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(f(X1(1),X1(2),X1(3)))');
end
sol=X1;
if nriter>maxiter
fprintf('Numarul maxim de iteratii a fost atins. Verifica
solutia \n')
end
fclose(fid);

[sol,nriter]=Gradient_Descent([1;3;2],10^(-3),10^(-2),2000)
sol =

1.0019
2.4873
2.0058

nriter =

42

4.2 Metoda gradientului descendent 2

function [sol,
nriter]=Gradient_Descent2(X0,alfa,eps,maxiter)
syms x y z
f(x,y,z)=abs(((x-6)^2+(y-3)^2+(z-4)^2)^(1/2)-((x-1)^2+
(y+2)^2+(z-3)^2)^(1/2)-sqrt(3)+sqrt(13))+...
abs(((x+2)^2+(y-1)^2+(z+1)^2)^(1/7)-((x-1)^2+(y+11)^2+(z-
3)^2)^(1/2)-3*sqrt(6)+sqrt(12))+...
abs(((x-3)^2+(y+1)^2+(z-2)^2)^(1/2)-((x-1)^2+(y+2)^2+(z-
1)^2)^(1/5)-sqrt(18)+sqrt(17));
Grad_f=gradient(f);
nriter=0;
fid=fopen('GradientDescent2.txt','w');
fprintf(fid,' Iteratia x y z f(x,y,z) \n');
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f \n ',nriter, X0',
double(f(X0(1),X0(2),X0(3))));
nriter=nriter+1;
X1=X0-alfa*double(Grad_f(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(f(X1(1),X1(2),X1(3))));
while max(abs(X1-X0))>=eps && nriter<=maxiter
nriter=nriter+1
X0=X1;
X1=X0-alfa*double(Grad_f(X0(1),X0(2),X0(3)));
fprintf(fid,' %8d %8.6f %8.6f %8.6f %8.6f \n
',nriter,X1',double(f(X1(1),X1(2),X1(3))));
end
sol=X1;
if nriter>maxiter
fprintf('Numarul maxim de iteratii a fost atins. Verifica
solutia \n')
end
fclose(fid);

[sol,nriter]=Gradient_Descent2([2;2;1],10^(-2),10^(-3),2000)

sol =

5.3373
0.2237
3.0292

nriter =

786

INTERPOLARE

5.1 Lagrange
function [X, lag]=lagrange(x,y)
n=length(x);
m=length(y);
lag=0;
if m~=n
error('Date incorecte; lungimi de vectori diferite');
else
syms X
for i=1:n
pp=1;
for j=1:n
if j~=i
pp=pp*(X-x(j))/(x(i)-x(j));
end
end
lag=lag+y(i)*pp;
end
m=300;
u=linspace(min(x),max(x),m);
v=zeros(1,m);
for i=1:m
v(i)=subs(lag,X,u(i));
end
lag=simplify(lag);
figure

plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',8);
hold on
plot(u,v,'r','Linewidth',2)
legend('Noduri','Polinom Lagrange')
title('Polinomul de interpolare Lagrange')
end
end

>> x=[22;52;16;55;79]

y=[26;71;42;66;32]

[X,lag]=lagrange(x,y)

lag =

- (109*X^4)/29160 + (607*X^3)/2916 - (8137*X^2)/1944 +


(100183*X)/2916 - 232622/3645
5.2 Interpolare liniara

function f=interp_liniara(x,y,alfa)
n=length(x);
m=length(y);
if m~=n
display('Date incorecte; lungimi de vectori diferite')
else
if alfa>=x(1) && alfa<=x(n)
i=1;
while alfa>=x(i)
i=i+1;
end
f=y(i-1)+(alfa-x(i-1))/(x(i)-x(i-1))*(y(i)-y(i-1));
end
if alfa<x(1);
f=y(1)+(alfa-x(1))/(x(2)-x(1))*(y(2)-y(1));
end
if alfa>x(n)
f=y(n-1)+(alfa-x(n-1))/(x(n)-x(n-1))*(y(n)-y(n-1));
end
figure

plot(x,y,'o','Linewidth',2,'MarkerEdgeColor','k','MarkerFace
Color','g','MarkerSize',10);
hold on

plot(alfa,f,'o','Linewidth',2,'MarkerEdgeColor','k','MarkerF
aceColor','m','MarkerSize',10);
plot(x,y,'--')
end
end

>> x=[5,6,9,4];
>> y=[2,6,8,12];
>> f=interp_liniara(x,y,0.01)

f =

-17.9600
5.3 Script Lagrange

n=13;
x=linspace(-pi,pi,n);
y=abs(x).*exp(cos(x))+atan(x)./(x.^3+4);
[X,lag]=lagrange(x,y)
xx=linspace(-pi,pi,200);
yy=abs(xx).*exp(sin(xx))+acos(xx)./(xx.^3+1);
hold on
plot(xx,yy,'k','Linewidth',2);
legend('noduri','Pol Lagrange','f(x)')
x0=linspace(-2*pi,2*pi,300);
y0=abs(x0).*exp(sin(x0))+atan(x0)./(x0.^3+1);
figure
plot(x0,y0,'k','Linewidth',2);
y_pol=zeros(1,300);
for i=1:300
y_pol(i)=subs(lag,X,x0(i));
end
hold on
plot(x0,y_pol,'r','Linewidth',2);
plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',8);
legend('f(x)','Pol Lagrange','noduri')

lag =

(X*(853284438859913621319168*X^11 -
820439095568840332756416*X^10*pi -
1722591861511671660508416*X^9*pi^2 +
1864990155956081963331600*X^8*pi^3 +
984145707088043416085664*X^7*pi^4 -
1426504881950966624021028*X^6*pi^5 -
45329647057510717997568*X^5*pi^6 +
419575166009098003351755*X^4*pi^7 -
80810969330889998103332*X^3*pi^8 -
38549748872807568496331*X^2*pi^9 +
11551416071256262108784*X*pi^10 +
927292884435466133720*pi^11))/(208066302784516915200*pi^12)

5.4 Script Lagrange 2


n=40;
x=linspace(-3*pi,3*pi,n);
y=sin(x);
[X,lag]=lagrange(x,y)
xx=linspace(-4*pi,2*pi,200);
yy=sin(xx);
hold on
plot(xx,yy,'k','Linewidth',2);
legend('noduri','Pol Lagrange','sin(x)')

lag =

(X*(33709355848748263226896085721890732496221632497077606047
3632015067*X^38 -
212362525142523491402680311443000986673635252643574619608796
35056701*X^36*pi^2 +
608613651948951822357511383631721991473961191595007673274952
631828769*X^34*pi^4 -
105188907041193209744214307252553139329707053773485802817032
98180194223*X^32*pi^6 +
122545834483180148823284106792358364552696090843313263634335
742375553036*X^30*pi^8 -
101876148272248007303896473195705042751331264115432399595036
2982602733716*X^28*pi^10 +
621857720225806972876625013778472315908587579812981261909494
9577395360308*X^26*pi^12 -
265608158186185557443550183298294570528810093209785100289175
60850465908940*X^24*pi^14 -
354304690577888862471656333646804453192184157420090762123562
96086782304310*X^22*pi^16 +
671058004602866971042894900565098501351992599275362371282936
0489790347141690*X^20*pi^18 -
296425707702366254605535418023068828088331675134146119672396
381792491791551602*X^18*pi^20 +
102896134580010152704327470300769979656415899365603190195898
38214392491750545646*X^16*pi^22 -
283596896677402998223565020213652663274564170004095269060013
644768653450140389604*X^14*pi^24 +
603423732660598621129609224256066145615406884152241846142353
9936878389392412058748*X^12*pi^26 -
953777981939638555809940295363852291161082973325916857994241
04884546165722606444796*X^10*pi^28 +
106301705937010914358834542081389950594692719438692048746439
1666931916167646563454596*X^8*pi^30 -
775484256267507950720136181549623703453858988927172719464984
5319501020395295680012493*X^6*pi^32 +
330006527513948638352136605230750188213006771319488665111484
33912283777552060598677275*X^4*pi^34 -
668733039548322988575280307361665376506474742937797830966824
79089265863903043034054375*X^2*pi^36 +
406540938646647907528826581691190636887502297130171206629469
62216490836812744412015625*pi^38))/
(12940599990966594200633658893117375358266428015954690708323
577463473600620134400000000*pi^39)

5.5 Lagrange spline


n=15;
x=linspace(-pi,pi,n);
y=abs(x).*exp(sin(x))+atan(x)./(x.^3+5);
[X,lag]=lagrange(x,y);
xx=linspace(-pi,pi,200);
yy=abs(xx).*exp(sin(xx))+atan(xx)./(xx.^4+1);
% figure
%
plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',8);
hold on
plot(xx,yy,'k','Linewidth',2);
y_spline=spline(x,y,xx);
hold on
plot(xx,y_spline,'g','Linewidth',2)
legend('noduri','Pol Lagrange','f(x)','Spline'

5.6 Lagrange spline 2


x=[5 6 8 11 12 14 17 21 22 26];
y=[-2 33 -1 50 -13 -4 -1 6 4 0];
[X,lag]=lagrange(x,y);
xx=linspace(min(x),max(x),300);
hold on
y_spline=spline(x,y,xx);
plot(xx,y_spline,'g','Linewidth',2)
legend('noduri','Pol Lagrange','Spline')

APROXIMAREA FUNCTIILOR PRIN METODA CELOR MAI MICI PATRATE

6.1 Regresie liniara


function [a, b, Er]=regresie_liniara(x,y)
m=length(x);
n=length(y);
if m~=n
error('Date incorecte; lungimi diferite ale vectorilor');
else
A=[sum(x.^2) sum(x);sum(x) n];
B=[sum(x.*y); sum(y)];
sol=A^(-1)*B;
a=sol(1);b=sol(2);
Er=sum((a*x+b-y).^2);
u=linspace(min(x),max(x),300);
v=a*u+b;
figure

plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',7);
hold on
plot(u,v,'k','Linewidth',3);
title('Modelul liniar de regresie');
legend('Punctele','Modelul liniar')
end
end

>> x=[2 6 5 32 24 56 67 34 63 15 7 2 3 23 53 34]

y=[3 36 24 2 34 64 27 98 34 2 5 5 26 24 95 34]

[a,b,Er]=regresie_liniara(x,y)

x =

2 6 5 32 24 56 67 34 63 15
7 2 3 23 53 34

y =

3 36 24 2 34 64 27 98 34 2
5 5 26 24 95 34

a =

0.6782

b =

14.0056
Er =

1.0053e+04

6.2 Regresie parabolica(patratica)


function [a, b, c, Er]=regresie_parabolica(x,y)
m=length(x);
n=length(y);
if m~=n
error('Date incorecte; lungimi diferite ale vectorilor');
else
A=[sum(x.^4) sum(x.^3) sum(x.^2);sum(x.^3) sum(x.^2)
sum(x); sum(x.^2) sum(x) n];
B=[sum((x.^2).*y); sum(x.*y) ;sum(y)];
sol=A^(-1)*B;
a=sol(1);b=sol(2);c=sol(3);

u=linspace(min(x),max(x),300);
v=a*u.^2+b*u+c;
figure
plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',7);
hold on
plot(u,v,'b','Linewidth',3);
title('Modelul parabolic de regresie');
legend('Punctele','Modelul parabolic')

end
Er=sum((a*x.^2+b*x+c-y).^2);
end

>> x=[0;5;10;15;20;25;30;35;40];y=[2;4;6;8;10;12;14;16;18];
>> [a,b,c,Er]=regresie_parabolica(x,y)

a =

2.7756e-17

b =

0.4000

c =

2.0000

Er =

6.0506e-28
6.3 Regresie cubica
function [a, b, c, d, Er]=regresie_cubica(x,y)
m=length(x);
n=length(y);
if m~=n
error('Date incorecte; lungimi diferite ale vectorilor');
else
A=[sum(x.^6) sum(x.^5) sum(x.^4) sum(x.^3);...
sum(x.^5) sum(x.^4) sum(x.^3) sum(x.^2);...
sum(x.^4) sum(x.^3) sum(x.^2) sum(x);...
sum(x.^3) sum(x.^2) sum(x) n];
B=[sum((x.^3).*y);sum((x.^2).*y); sum(x.*y) ;sum(y)];
sol=A^(-1)*B;
a=sol(1);b=sol(2);c=sol(3);d=sol(4);

u=linspace(min(x),max(x),300);
v=a*u.^3+b*u.^2+c*u+d;
figure

plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',7);
hold on
plot(u,v,'b','Linewidth',3);
title('Modelul cubic de regresie');
legend('Punctele','Modelul cubic')

end
Er=sum((a*x.^3+b*x.^2+c*x+d-y).^2);
end

>> x=[4;5;7;8;9;5];

>> y=[5;3;12;13;4;9];

>> [a,b,c,d,Er]=regresie_cubica(x,y)

a =

-0.5795

b =

10.2239

c =

-56.0281

d =

102.7738

Er =

19.4368
6.4 Regresie 4th
function [a, b, c, d, e, Er]=regresie_4th(x,y)
m=length(x);
n=length(y);
if m~=n
error('Date incorecte; lungimi diferite ale vectorilor');
else
A=[sum(x.^8) sum(x.^7) sum(x.^6) sum(x.^5) sum(x.^4);...
sum(x.^7) sum(x.^6) sum(x.^5) sum(x.^4) sum(x.^3);...
sum(x.^6) sum(x.^5) sum(x.^4) sum(x.^3) sum(x.^2);...
sum(x.^5) sum(x.^4) sum(x.^3) sum(x.^2) sum(x);...
sum(x.^4) sum(x.^3) sum(x.^2) sum(x) n];
B=[sum((x.^4).*y);sum((x.^3).*y);sum((x.^2).*y);
sum(x.*y) ;sum(y)];
sol=A^(-1)*B;
a=sol(1);b=sol(2);c=sol(3);d=sol(4);e=sol(5);
u=linspace(min(x),max(x),300);
v=a*u.^4+b*u.^3+c*u.^2+d*u+e;
figure

plot(x,y,'o','MarkerEdgeColor','k','MarkerFaceColor','g','Ma
rkerSize',7);
hold on
plot(u,v,'b','Linewidth',3);
title('Modelul 4th de regresie');
legend('Punctele','Modelul 4th')

end
Er=sum((a*x.^4+b*x.^3+c*x.^2+d*x+e-y).^2);
end

>> x=[2;3;5;6;7;9;3;5;6;11];

>> y=[4;5;12;6;8;9;6;4;2;1];

>> [a,b,c,d,e,Er]=regresie_4th(x,y)

a =

-0.0300

b =

0.7294

c =

-6.2052

d =

21.9757

e =

-21.0582

Er =

59.1033

>>

S-ar putea să vă placă și