(这是我朋友的问题。请清楚解释一下因为他不擅长编码。) 首先,我是一名主修土木工程的大四学生。我不擅长编程。 我想解决
使用显式有限差分法和隐式有限差分法。
显式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
我关闭循环只是为了先控制。 这是我为这两种方法得到的结果。他们是不同的。
我不知道在隐式FDM中我的问题是什么。请帮助我,提前谢谢。