2D抛物线偏微分方程的有限差分

时间:2016-03-07 04:36:25

标签: math fortran fortran90 gfortran differential-equations

这是一个修改过的问题,来自Numerical Computing-Kincaid的书,第15章。(不是物理学)

如何正确实施边界条件?条件是

u(0,y,t) = u(x,0,t) = u(nx,y,t) = u(x,ny,t) = 0.

我似乎没有正确地做到这一点。我的代码如下。

我正在尝试使用有限差分来编写Fortran代码来解决2D热(抛物线)方程。当我打印出我的结果时,我会得到不同的结果和'NaN'。我似乎没有正确定义边界条件。我在1维中正确地完成了代码,试图将它概括为两个我在边界处遇到麻烦。

注意,i,j分别用于x和y位置的do循环,m用于时间do循环。 nx,ny,W分别是x,y方向和时间中的网格点数。 Lx,Lytmax是网格的位置和时间间隔的大小。位置(x,y)步骤和时间步长分别由hx,hy,k给出,hxhy对于下面的示例相同。我将我的解决方案存储在变量u和v中,如下所示。

program parabolic2D

implicit none

integer :: i,j,m 
integer, parameter :: nx=10., ny=10., W=21. 
real, parameter :: Lx=1.0, Ly=1.0, tmax=0.1 
real :: hx,hy,k,pi,pi2,R,t 
real, dimension (0:nx,0:ny) :: u,v 


hx=(Lx-0.0)/nx 
hy=(Ly-0.0)/ny 
k=(tmax-0.0)/W
R=k/hx**2.
u(0,0)=0.0; v(0,0)=0.0; u(nx,ny)=0.0; v(nx,ny)=0.0 !boundary conditions u(0,0,t)=0=u(nx,ny,t)
pi=4.0*atan(1.0) 
pi2=pi*pi



do i=1,nx-1
do j=1,ny-1
u(i,j)=sin(pi*real(i)*hx)*sin(pi*real(j)*hy)  !initial condition
end do
end do

do m=1,W

do i=1,nx-1
do j=1,ny-1
v(i,j) = R*(u(i+1,j)+u(i-1,j)+u(i,j+1)+u(i,j-1))+(1-4*R)*u(i,j) !Discretization for u(x,y,t+k)
end do
end do

t = real(m)*k ! t refers to time in the problem.

do i=1,nx-1
do j=1,ny-1
u(i,j)=v(i,j) !redefining variables.
end do
end do
write(*,*) 'for all times m, this prints out u(x,y,t)',m,((u(i,j),i=0,nx),j=0,ny)

end do

end program parabolic2D

1 个答案:

答案 0 :(得分:2)

正如Ross指出的那样,您还没有完全指定边i=j=0i=nx以及j=nx的边界条件。只指定了您域名的角落。

更改

u(0,0)=0.0; v(0,0)=0.0; u(nx,ny)=0.0; v(nx,ny)=0.0 !boundary conditions u(0,0,t)=0=u(nx,ny,t)

u(0,:)=0.0 u(nx,:)=0.0 u(:,0)=0.0 u(:,ny)=0.0

甚至

u=0.0

稍后会覆盖内部点。