Sei sulla pagina 1di 3

En archivo para el método de Jacobi dice:

function [solucion,num_iteraciones]=metodo_jacobi(A,B,punto_inicial,error)
cont_iteraciones=0;
s=size(A);
num_ecuaciones=s(1);
for k=1:num_ecuaciones
B(k)=B(k)/A(k,k);
A(k,:)=A(k,:)/A(k,k);
A(k,k)=0;
end
M=-A;
x_ant=punto_inicial';
x_sig=M*x_ant+B';
deltax_n=x_sig-x_ant;
while norm(deltax_n,inf) > error
x_sig=M*x_ant+B';
deltax_n=x_sig-x_ant;
x_ant=x_sig;
cont_iteraciones=cont_iteraciones+1;
end
solucion=x_sig;
num_iteraciones=cont_iteraciones;

MÉTODO DE JACOBI y MÉTODO DE GAUSS-SEIDEL


Para el método de Jacobi, considere un sistema Ax=b
Sea A = D - E - F, donde D es la diagonal de A, -E la triangula inferior y -F la
triangular superior.
Así, la sucesión que se construye con este método iterativo será:
Ax = b
(D-E-F)x = b
Dx = (E+F)x + b
-1 -1
x =
(k) D (E+F)x
(k-1) + Db
El siguiente programa resuelve mediante el método de Jacobi un sistema de
ecuaciones Ax=b con un error menor que una tolerancia dada tol. Note que el
programa necesita un dato inicial x0. Además, el programa se detiene si se
alcanza un número máximo de iteraciones maxit sin que se satisfaga el criterio
de convergencia.

function [x,iter]=jac(A,b,x,tol,maxit)
N=diag(diag(A));
P=N-A; corr=1; errest=1; iter=0;
while abs(errest)>tol & iter<maxit
iter=iter+1;
x0=x;
corr0=corr;
x=N\(P*x0+b);
corr=norm(x-x0,inf);
normest=corr/corr0;
if normest>=1 & iter>=2
error('norma de la matriz de iteración > 1')
end
errest=normest/(1-normest)*corr;
end
iter

Ejemplo: Resuelva Ax(0)=b, con una aproximación inicial x (0)=[0 0 0]'

>> A=[5 -2 1;-1 -7 3;2 -1 8];


>> x=[0 0 0]';
>> b=[3 -2 1]';
>> tol=10^-6;
>> maxit=200;
>> jac(A,b,x,tol,maxit)

iter=
13

ans=

0.6763
0.1799
-0.0216

Para el MÉTODO DE GAUSS-SEIDEL, modificar N y P:


N=tril(A)
P=N-A

function[y,err,it]=JACOBIANO(A,b,maxiter,epsilon)
% y es vector solución
% err es el error final
% it es el numero de iteraciones final
% A matriz del sistema
% b vector del sistema
% maxiter es numero máximo de iteraciones
% epsilon es la cota del error
n=length(b);
it=0;
err=2*epsilon;
x=zeros(1,n);
y=zeros(1,n);
while it<maxiter & err>epsilon
for i=1:n
S=0;
for j=1:n;
if i~=j;
S=S+A(i,j)*x(j);
end
end
y(i)=(b(i)-S)/A(i,i);
end
it=it+1;
err=norm(x-y,1);
x=y;
end
y
it
err

Potrebbero piacerti anche