我试图制作一个 Matlab 代码来使用隐式方法绘制热方程的离散解。
我得到的关于热方程的信息如下:
d^2u/d^2x=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);索引超出范围,因为 numel(v)=1。
隐式错误(第 37 行)c(k)=v(k)-(m(k)*c(k-1));
有谁知道我应该写什么以使错误消息消失?Matlab 代码看起来没问题,还是我应该改变什么?大卫