0

我试图制作一个 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 代码看起来没问题,还是我应该改变什么?大卫

4

1 回答 1

0

我不认为你对初始条件的陈述是正确的。

显然,您的方程式已经标准化。你的身体听起来像一个半无限的固体。我会这样写初始条件:

u(x, t) = 1 for t = 0

这表示当问题开始时身体处于均匀温度。因为t > 0你有一个温度、通量或表面对流的边界条件,它将从身体中移除能量,并为你提供一个有趣的瞬态温度分布。

于 2015-03-09T19:50:28.780 回答