我尝试使用隐式方法制作一个Matlab代码来绘制热方程的离散解。
我给出的有关热方程的信息如下:
d ^ 2U / d ^ 2×= du / dt滤波器
初始条件(t = 0):
如果x> 0 ,则u = 0
否则u = 1(当t = 0时)
离散隐式差分方法可以写成如下:
(I+delta t*A)[v(m+1)]=v(m)
,其中I是单位矩阵,delta t是时间空间,m是时间步数,v(m + 1)是下一个时间步的v值。 A是矩阵:A在对角线上的值为2,而在该对角线的正下方和右侧都是-1。所有其他数字都为零。
A=(1/dx^2)*
[2 -1 0 . . . 0
-1 2 -1 . . . .
0 . . . . . .
. . . . . 0
. . . . -1 2 -1
1 . . . 0 -1 2]
不插入值,而是写入符号:
A=(1/dx^2)*
[alpha(1) gamma(1) 0 . . . . . . . . 0
beta(2) alpha(2) gamma(2) ... .. . 0
0 . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . 0
. . . . beta(n-1) alpha(n-1) gamma(n-1)
0 . . . 0 beta(n) alpha(n)]
L = 20.; % Length of the wire
T =0.1; % Final time
maxm = 2000; % Number of time steps
dt = T/maxm;
n = 70; % Number of space steps
dx = L/(n);
r = dt/(dx^2); % Stability parameter, r less or equal to 1/2
alpha(1)=2+(1/(r));
d(1)=alpha(1);
v(1)=0; % Boundary condition.
v(n)=1; %Boundary condition.
c(1)=v(0);
for k=2:n
beta(k)=-1;
gamma(k)=-1;
alpha(k)=2+(1/r);
m(k)=beta(k)/d(k-1);
d(k)=alpha(k)-(m(k)*gamma(k-1));
c(k)=v(k)-(m(k)*c(k-1));
v(n)=c(n)/d(n);
for k=n-1:1
v(k)=(c(k)-gamma(k)*v(k+1))/d(k);
end
end
我收到的错误消息如下:
尝试访问v(2); index因界而错,因为numel(v)= 1。
隐式错误(第37行) 率c(k)= V(k)的 - (M(k)的* C(K-1));
是否有人知道我应该写什么,以便错误消息消失? Matlab代码看起来没问题,或者我应该改变什么? 大卫
答案 0 :(得分:0)
我不认为你的初始条件陈述是正确的。
显然,你的等式已经标准化了。你的身体听起来像半无限的固体。我会用这种方式写出这个初始条件:
u(x, t) = 1 for t = 0
这表示问题开始时身体处于均匀的温度。对于t > 0
,你有一个表面的温度,通量或对流的边界条件,它将从身体中去除能量,并给你一个有一定兴趣的瞬态温度分布。