用隐式差分法求解热方程

时间:2015-03-09 10:42:36

标签: matlab finite-element-analysis

我尝试使用隐式方法制作一个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代码看起来没问题,或者我应该改变什么? 大卫

1 个答案:

答案 0 :(得分:0)

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

显然,你的等式已经标准化了。你的身体听起来像半无限的固体。我会用这种方式写出这个初始条件:

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

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