隐式有限差分法

时间:2016-11-20 03:23:47

标签: algorithm matlab

(这是我朋友的问题。请清楚解释一下因为他不擅长编码。) 首先,我是一名主修土木工程的大四学生。我不擅长编程。 我想解决

a diffusion equation

使用显式有限差分法和隐式有限差分法。

显式FDM:这是源代码:

function H3 = eFDM (T0, E, delta_x, delta_t)

T0 = 12;
delta_x = 1;
delta_t = 0.2; 

E = 0.00025;

Nx = 20/delta_x; % number of length steps
Nt = 24/delta_t; % number of time steps

omega = 2*pi/T0;

lamda = E*delta_t*3600/delta_x^2;

H = 5*ones(Nx+1,Nt+1);  %Create water level matrix with Nz+1 rows, and Nt+1 columns
                         %Initial guess is that H is 5 everywhere.
time = [0:delta_t:24];
H(1,:) = 5 + 1*sin(omega*time);  %Set boundary condition
maxiter = 1000;

for iter = 1:maxiter
    Hlast = H; %Save the last guess
    H(:,1) = Hlast(:,end); %Initialize the water level at t=0 to the last level
    for i = 2:Nt+1,
        H(2:end-1,i) = (lamda*H(1:end-2,i-1)+(1-2*lamda)*H(2:end-1,i-1)+lamda*H(3:end,i-1));
        H(end,i) = H(end-1,i); % Enforce bottom BC
    end
    err(iter) = max(abs(H(:)-Hlast(:)));  %Find difference between last two solutions
    if err(iter)<1E-4
        break; % Stop if solutions very similar, we have convergence
    end
end
if iter == maxiter;
    warning('Convergence not reached')
end
H3 = H;

for i = 1:24/delta_t +1
     t(i) = (i-1)*delta_t;
end

figure
plot(t,H3(1,:),t,H3(2,:),t,H3(4,:));
axis([0 24 5-1-0.25 5+1+0.25])
grid on
xlabel('Time (h)','FontName','SVNelvetica','Fontsize',10,'color','b')
ylabel('Water level (m)','FontName','SVNelvetica','Fontsize',10,'color','b')
title('Unsteady seepage','FontName','SVNelvetica','Fontsize',12,'color','r')
print -depsc -tiff -r200 myplot

现在我转向Implicit方法来解决这种扩散问题。我使用了Thomas算法(三对角矩阵算法)。对不起,我不能在这里发布链接。

function H5 = iFDM (T0, E, delta_x, delta_t)

T0 = 12;
delta_x = 1;
delta_t = 0.2; 

E = 0.00025;

Nx = 20/delta_x; % number of length steps
Nt = 24/delta_t; % number of time steps

omega = 2*pi/T0;

lamda = E*delta_t*3600/delta_x^2;

H = 5*ones(Nx+1,Nt+1);  %Create water level matrix with Nz+1 rows, and Nt+1 columns
                         %Initial guess is that H is 5 everywhere.
time = [0:delta_t:24];
H(1,:) = 5 + 1*sin(omega*time);  %Set boundary condition
maxiter = 1000;

a = - lamda;
b = 1 + 2 * lamda;
c = - lamda;

    Hlast = H; %Save the last guess
    H(:,1) = Hlast(:,end); %Initialize the water level at t=0 to the last level
    for i = 2:Nt+1, %time run
        D = H(2:end,i-1);
        DD = tridiag(a, b, c, D);
        H(2:end,i) = DD;
    end
H5 = H;

for i = 1:24/delta_t +1
     t(i) = (i-1)*delta_t;
end

figure
plot(t,H5(1,:),t,H5(2,:),t,H5(4,:));
axis([0 24 5-1-0.25 5+1+0.25])
grid on
xlabel('Time (h)','FontName','SVNelvetica','Fontsize',10,'color','b')
ylabel('Water level (m)','FontName','SVNelvetica','Fontsize',10,'color','b')
title('Unsteady seepage','FontName','SVNelvetica','Fontsize',12,'color','r')
print -depsc -tiff -r200 myplot


function y = tridiag(a,b,c,D )


%  Solve the  n x n  tridiagonal system for y:
%
%  [ b(1)  c(1)                                  ] [  y(1)  ]   [  D(1)  ]
%  [ a(2)  b(2)  c(2)                            ] [  y(2)  ]   [  D(2)  ]
%  [       a(3)  b(3)  c(3)                      ] [        ]   [        ]
%  [            ...   ...   ...                  ] [  ...   ] = [  ...   ]
%  [                    ...    ...    ...        ] [        ]   [        ]
%  [                        a(n-1) b(n-1) c(n-1) ] [ y(n-1) ]   [ D(n-1) ]
%  [                                 a(n)  b(n)  ] [  y(n)  ]   [  D(n)  ]


nx = length(D);   
for i = 1:nx
    cc(i,1) = 1;
    dd(i,1) = 1;
end

for i = 1:nx
    if i == 1
        cc(i,1) = c ./ b;
        dd(i,1) = D(i,1) ./ b;
    else
        cc(i,1) = c ./(b - cc(i-1,1).*a);
        dd(i,1) = (D(i,1) - dd(i-1,1).*a) / (b - cc(i-1,1).*a);
    end
end


for j = nx: -1 :1
   if j == nx 
       y(j,1) = dd(j,1);
   else
       y(j,1) = dd(j,1) - cc(j,1)*y(j+1,1);
   end
end

我关闭循环只是为了先控制。 这是我为这两种方法得到的结果。他们是不同的。

result for 2 methods

我不知道在隐式FDM中我的问题是什么。请帮助我,提前谢谢。

0 个答案:

没有答案