【问题标题】:Finite differences for 2D Parabolic PDE二维抛物线 PDE 的有限差分
【发布时间】:2016-03-07 04:36:25
【问题描述】:

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

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

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

看来我做得不对。我的代码如下。

我正在尝试编写 Fortran 代码来使用有限差分求解 2D 热(抛物线)方程。当我打印出我的结果时,我得到了不同的结果和“NaN”。看来我没有正确定义边界条件。我正确地做了一维代码,试图将其概括为两个我在边界处遇到麻烦。

注意,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

【问题讨论】:

  • 我们在这里并没有真正解决物理问题,抱歉。如果您有特定的编码问题,我们可能会提供帮助,但这种类型的问题可能超出了 stackoverflow 的范围。
  • 话虽如此,我可以提出几个问题来指导您前进。您确定您正确设置了边界条件吗?看起来您只设置了 u(0,0) 和 u(nx,ny),然后使用了 u(0,1:ny-1),例如。
  • 另外,因为看起来你正在努力学习,我建议你缩进你的代码。阅读格式不正确的代码非常困难,缩进 for 循环和条件是其中的关键部分。
  • 来自 Joe:感谢您在下方提供的 cmets。我无法回复,因为我的评分不超过 50。你建议我如何修复边界条件?当您说“但随后使用u(0,1:ny-1)”时,我不明白您的评论。我正在努力学习 Fortran。
  • @Joe 您可以随时在自己的问题下发表评论,不需要任何代表。更重要的是,这个问题属于别处。最好scicomp.stackexchange.com

标签: math fortran fortran90 gfortran differential-equations


【解决方案1】:

正如罗斯指出的那样,您还没有完全指定边缘 i=j=0i=nxj=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.

内部点稍后会被覆盖。

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 2016-10-11
    • 2018-01-02
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    相关资源
    最近更新 更多