Você está na página 1de 2

function [error,A,b,u,x,V] = fdm1d_DD(p,q,r,f,xi,xf,vi,vf,n,grf,s,sws)

if 2 < 3
return
end
% Numero de incognitas del problema
tm = n -2;
% Declaracion de la matriz y vectores de trabajo
%A = sparse(tm,tm);
A = zeros(tm,tm); % Matriz de carga
b = zeros(tm,1); % Vector de carga
u = zeros(tm,1); % Vector de solucion
x = zeros(n,1); % Vector de coordenadas de la particion
V = zeros(n,1) ; % Vector solucion
h = (xf-xi)/(n-1);
h1 = h*h;
% Llenado de los puntos de la malla
for i = 1: n,
x(i) = xi + (i-1)*h;
end
% Llenado de la matriz y vector
b(1) = f(xi) - p(xi)*(vi/h1);
A(1,2) = p(x(1))/h1 - q(x(1))/(2.0*h);
A(1,1) = ((-2.0 * p(x(1))) / h1) + r(x(1));
for i=2:tm-1,
A(i,i-1) = p(x(i))/h1 - q(x(i))/(2.0*h);
A(i,i) = ((-2.0 * p(x(i))) / h1) + r(x(i));
A(i,i+1) = p(x(i))/h1 + q(x(i))/(2.0*h);
b(i) = f(x(i));
end
A(tm,tm-1) = p(x(tm))/h1 - q(x(tm))/(2.0*h);
A(tm,tm) = ((-2.0 * p(x(tm))) / h1) + r(x(tm));
b(tm) = f(x(tm+1))-p(x(tm+1))*(vf/h1);
% Soluciona el sistema
u = inv(A)*b;
% Copia la solucion obtenida del sistema lineal al vector solucion
V(1) = vi;
for i=1:tm,
V(i+1) = u(i);
end
V(n) = vf;
% Encuentra el error en norma inÖnita usando particion par=10
error = 0;
if sws == 1
par = 10;
for i = 1: n-1,
inc = (x(i+1)-x(i))/par;
for j = 1:par+1,
px = x(i)+inc*(j-1);
e = abs(s(px)-l(px,x(i),V(i),x(i+1),V(i+1)));
if e > error
error = e;
end
end
end
end
% Revisa si se graÖcara
if grf == 1
if sws == 1
% Calcula la solucion analitica en la particion de calculo
ua = zeros(n,1);
for i = 1: n,
ua(i) = s(x(i));
end
end
% GraÖcar la solucion numerica
plot(x,V,'o');
hold
% GraÖcar la solucion analitica en una particion tamano xPart
if sws == 1
xPart = 1000;
h = (xf-xi)/(xPart-1);
xx = zeros(xPart,1);
xa = zeros(xPart,1);
for i = 1: xPart,
xx(i) = xi + (i-1)*h;
xa(i) = s(xx(i));
end
plot(xx,xa);
% GraÖca el error
figure(2);
plot(x,V-ua);
end
end
end
% Evalua el punto x en la recta dada por los puntos (x1,y1) y (x2,y2), se usa
para el calculo de la norma inÖnito
function y = l(x,x1,y1,x2,y2)
y = y1+((y2-y1)/(x2-x1))*(x-x1);
end

Você também pode gostar