Ecuacion no lineal
Publicado por wil (26 intervenciones) el 16/02/2022 20:19:51
Hola, estoy intentado resolver la siguiente ecuacion no lineal por diferencias finitas :
% u_t=u_xx+6u(1-u)
%u(x,0)=(1+exp(x))^(-2)
%u(0,t)=(1+exp(-5t))^(-2)
%u(1,t)=(1+exp(1-5t))^(-2)
*************************************************
Mi codigo en matlab es el siguiente:
function w=ecuacion_test(xl,xr,tb,te,M,N)
% entrada: [xl,xr]=[0,1], [tb,te]=[0,1]
%passos em x e t : M=N=10
% w=ecuacion_test(0,1,0,1,10,10); Probe con estos datos
%
D=1.0;
f=@(x) (1+exp(x)).^(-2);
l=@(t) (1+exp(-5*t)).^(-2);
r=@(t) (1+exp(1-5*t)).^(-2);
h=(xr-xl)/M; k=(te-tb)/N; m=M+1; n=N;
sigma=(D*k)/(h*h);
w(:,1)=f(xl+(0:M)*h)'; % condicion inicial
w1=w;
for j=1:n
for it=1:3 % iteracion de Newton
DF1=zeros(m,m);DF2=zeros(m,m);
DF1=diag(1-6*k+2*sigma*ones(m,1))+diag(-sigma*ones(m-1,1),1);
DF1=DF1+diag(-sigma*ones(m-1,1),-1);
DF2=diag(2*6*k*w1);
DF=DF1+DF2;
F=-w(:,j)+(DF1+DF2/2)*w1;
DF(1,:)=[1, zeros(1,m-1)];% condcion de Dirichlet
DF(m,:)=[zeros(1,m-1) , 1];
F(1)=w1(1)-l(j);
F(m)=w1(m)-r(j); % Dirichlet conditions para F
w1=w1-DF\F; % METODO DE NEWTON
end
w(:,j+1)=w1;
end
x=xl+(0:m-1)*h;t=tb+(0:n)*k;
%u=zeros(M,N);
for itr=1:m
%fprintf('\n t x u(anal) err\n');
for i=1:n+1
uu(itr,i)=(1+exp(x(itr)-5*t(i))).^(-2);
w2(itr,i)=w(itr,i);
err(itr,i)=abs(uu(itr,i)-w2(itr,i));
end
end
for itr=1:m
fprintf('\n x \t t \t \t u(Exat.) \t w(Aprox.) \t erro \n');
for i=1:n+1
%fprintf('%6.2f %6.1f %15.6f %15.6f \n',x(itr),t(i),uu(itr,i),w(itr,i));
fprintf('%7.3f %7.3f %15.6f %15.6f %15.6f \n',x(itr),t(i),uu(itr,i),w2(itr,i),err(itr,i));
end
end
end
La solucion aproximada no esta ni cerca de la exacta, pienso que hay una parte del codigo que esta mal, pero no se cual es
.
% u_t=u_xx+6u(1-u)
%u(x,0)=(1+exp(x))^(-2)
%u(0,t)=(1+exp(-5t))^(-2)
%u(1,t)=(1+exp(1-5t))^(-2)
*************************************************
Mi codigo en matlab es el siguiente:
function w=ecuacion_test(xl,xr,tb,te,M,N)
% entrada: [xl,xr]=[0,1], [tb,te]=[0,1]
%passos em x e t : M=N=10
% w=ecuacion_test(0,1,0,1,10,10); Probe con estos datos
%
D=1.0;
f=@(x) (1+exp(x)).^(-2);
l=@(t) (1+exp(-5*t)).^(-2);
r=@(t) (1+exp(1-5*t)).^(-2);
h=(xr-xl)/M; k=(te-tb)/N; m=M+1; n=N;
sigma=(D*k)/(h*h);
w(:,1)=f(xl+(0:M)*h)'; % condicion inicial
w1=w;
for j=1:n
for it=1:3 % iteracion de Newton
DF1=zeros(m,m);DF2=zeros(m,m);
DF1=diag(1-6*k+2*sigma*ones(m,1))+diag(-sigma*ones(m-1,1),1);
DF1=DF1+diag(-sigma*ones(m-1,1),-1);
DF2=diag(2*6*k*w1);
DF=DF1+DF2;
F=-w(:,j)+(DF1+DF2/2)*w1;
DF(1,:)=[1, zeros(1,m-1)];% condcion de Dirichlet
DF(m,:)=[zeros(1,m-1) , 1];
F(1)=w1(1)-l(j);
F(m)=w1(m)-r(j); % Dirichlet conditions para F
w1=w1-DF\F; % METODO DE NEWTON
end
w(:,j+1)=w1;
end
x=xl+(0:m-1)*h;t=tb+(0:n)*k;
%u=zeros(M,N);
for itr=1:m
%fprintf('\n t x u(anal) err\n');
for i=1:n+1
uu(itr,i)=(1+exp(x(itr)-5*t(i))).^(-2);
w2(itr,i)=w(itr,i);
err(itr,i)=abs(uu(itr,i)-w2(itr,i));
end
end
for itr=1:m
fprintf('\n x \t t \t \t u(Exat.) \t w(Aprox.) \t erro \n');
for i=1:n+1
%fprintf('%6.2f %6.1f %15.6f %15.6f \n',x(itr),t(i),uu(itr,i),w(itr,i));
fprintf('%7.3f %7.3f %15.6f %15.6f %15.6f \n',x(itr),t(i),uu(itr,i),w2(itr,i),err(itr,i));
end
end
end
La solucion aproximada no esta ni cerca de la exacta, pienso que hay una parte del codigo que esta mal, pero no se cual es

Valora esta pregunta


0