Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 二维抛物型偏微分方程的有限差分_Math_Fortran_Fortran90_Gfortran_Differential Equations - Fatal编程技术网

Math 二维抛物型偏微分方程的有限差分

Math 二维抛物型偏微分方程的有限差分,math,fortran,fortran90,gfortran,differential-equations,Math,Fortran,Fortran90,Gfortran,Differential Equations,这是金凯的《数值计算》第15章中的一个修正问题。(不是物理) 如何正确实现边界条件?条件是 u(0,y,t) = u(x,0,t) = u(nx,y,t) = u(x,ny,t) = 0. 看来我做得不对。我的代码如下 我正试图编写一个Fortran代码,用有限差分法求解二维热(抛物线)方程。当我打印出结果时,我会得到不同的结果和“NaN”。我似乎没有正确定义边界条件。我正确地在1维中编写了代码,试图将其推广到2维,但在边界处遇到了麻烦 注意,i,j分别表示x和y位置do循环,m表示时间do循

这是金凯的《数值计算》第15章中的一个修正问题。(不是物理)

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

u(0,y,t) = u(x,0,t) = u(nx,y,t) = u(x,ny,t) = 0.
看来我做得不对。我的代码如下

我正试图编写一个Fortran代码,用有限差分法求解二维热(抛物线)方程。当我打印出结果时,我会得到不同的结果和“NaN”。我似乎没有正确定义边界条件。我正确地在1维中编写了代码,试图将其推广到2维,但在边界处遇到了麻烦

注意,
i,j
分别表示x和y位置do循环,m表示时间do循环
nx、ny、W
分别是x、y方向和时间方向上的网格点数量
Lx、Ly
tmax
是网格位置和时间间隔的大小。位置(x,y)步数和时间步数分别由
hx,hy,k
给出,并且
hx
hy
对于下面的示例是相等的。我将解决方案存储在变量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

正如Ross指出的,您还没有完全指定边
i=j=0
i=nx
j=nx
的边界条件。只指定了域的各个角

改变

u(0,0)=0.0;v(0,0)=0.0;u(nx,ny)=0.0;v(nx,ny)=0.0!边界条件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


内部点稍后会被覆盖。

我们这里没有真正解决物理问题,抱歉。如果您有一个特定的编码问题,我们可能会提供帮助,但这种类型的问题可能超出stackoverflow的范围。尽管如此,我可以提供一些问题,这些问题可能有助于指导您的方法。您确定边界条件设置正确吗?看起来您只设置了u(0,0)和u(nx,ny),但随后使用了u(0,1:ny-1)。此外,由于您似乎正在尝试学习,我建议您缩进代码。读取格式不正确的代码非常困难,循环和条件缩进是其中的关键部分。我无法回复,因为我没有>50的评级。你建议我如何修正边界条件?我不理解你的评论,当你说“但是然后使用
u(0,1:ny-1)
,”时。我正在努力学习Fortran。@乔:你可以在自己的问题下发表评论,你不需要任何代表。更重要的是,这个问题属于其他地方。最好