我试图解决1D中的瞬态热方程并比较分析和数值解。解决方案具有相同的趋势但是非常不同,相对误差也是零,即使它显然不应该是。我不确定我是否正确解决了PDE问题。 (pde是du / dt = d ^ 2u / dx ^ 2)并且bcs是u(0,t)= 1,u(100,t)= 0,u(x,0)= 0。有人可以看看我的代码吗?
function he
m = 0;
x = linspace(0,100,500);
t = linspace(0,1000,500);
sol = pdepe(m,@hepde,@heic,@hebc,x,t);
u = sol(:,:,1);
y = erfc(x./(2*(t.^0.5)));
r=(y-u(70,:))/y;
figure;
plot(x,u(50,:),'.',x,u(150,:),'.',x,u(250,:),'.',x,u(end,:),'.',x,y,'.');
title('Numerical Solutions at different times.');
legend('t=100','t=300','t=500','t=700','y ana',0);
xlabel('Distance x');
ylabel('u(x,t)');
figure;
plot(x,r);
title('error in numerical and analytical solution');
legend('error',0);
xlabel('Distance x');
ylabel('error');
% --------------------------------------------------------------------------
function [c,f,s] = hepde(x,t,u,DuDx)
c = 1;
f = DuDx;
s = 0;
% --------------------------------------------------------------------------
function u0 = heic(x)
u0 = 0;
% --------------------------------------------------------------------------
function [pl,ql,pr,qr] = hebc(xl,ul,xr,ur,t)
pl = ul-1;
ql = 0;
pr = ur;
qr = 0;
答案 0 :(得分:0)
您实际上已正确设置了解决方案,您只是错误地使用了结果。我将逐一查看错误。
sol = pdepe(m,@hepde,@heic,@hebc,x,t);
u = sol(:,:,1);
您找到了正确的答案,但u=sol(:,:,1);
行没有用size(sol)=[2 2]
,所以您也可以u=pdepe(...);
。
现在,当你计算出确切的解决方案时,你做得非常奇怪。您希望在每个x
/ t
组合中找到它,但您只在其中一些组合中找到它。您需要使用meshgrid
获取x
和t
的所有组合,然后计算每个组合的确切解决方案。
[X,T]=meshgrid(x,t);
y = erfc(X./(2*(T.^0.5)));
然后你需要以不同的方式计算错误。
r=(y-u)./y;
figure(3);
情节不同。
plot(x,u(50,:),'b',x,u(150,:),'g',x,u(250,:),'r',x,u(end,:),'c',x,y(50,:),'b--',x,y(150,:),'g--',x,y(250,:),'r--',x,y(end,:),'c--');
实际上,您的确切解决方案不满足x=100
......