一维扩散方程差分格式的数值计算

摘要:采用FTCS显格式、Dufort-Frankel显格式、Lassonen隐格式、Grank-Nicolson隐格式对一维扩散方程进行数值计算,得到不同时间y方向扩散的速度。结果表明了不同差分格式的差别。
关键词:扩散方程;差分格式;FORTRAN;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

module global
  implicit none
  real::u(1000,1000)
end module
  
program main
  use global
  implicit none
  
  ! 声明变量
  integer i,n,h
  real nu,dt,dy,t,m
  integer nt,ny
  character(len=20) chazhi
  real::e(1000),b(1000),c(1000)
 

  ! 输入数据
  nu = 0.000217      ! 扩散系数
  ny  = 41           ! y方向
  t  = 1.08          ! 时间(s)
  dy = 0.001         ! 网格大小
  dt = 0.002         ! 时间步长
  nt = int(t/dt)     ! 总的时间步数
  m  = nu*dt/dy**2   ! 系数
   
  ! 初值及边界条件
  do i = 1,ny
    u(i,1) = 0.0
  end do
  do n = 1,nt
    u(1,n)  = 40.0
    u(ny,n) = 0.0
  end do
  
  !选择插值方式
  write(*,*)"FTCS  or    DF   or    LA   or   CN  ?"
  read(*,*) chazhi
  
  if(chazhi == 'FTCS')then   ! FTCS
    do n = 1,nt-1            !时间递进
      do i = 2,ny-1          ! y方向空间递进
        u(i,n+1) = u(i,n) + m *(u(i+1,n)-2*u(i,n)+u(i-1,n))
      end do
    end do
    
  else if(chazhi == 'DF')then  ! DF
    do n = 2,nt-1  
      do i = 2,ny-1 
        u(i,n+1) = (1-2*m)/(1+2*m) * u(i,n-1) + 2*m/(1+2*m) *(u(i+1,n)+u(i-1,n))
      end do
    end do
    
  else if(chazhi == 'LA')then  ! LA
      do i = 1, 1000
        e(i)  = m              ! LA方法系数A,i-1
        b(i)  = -(2*m+1)       ! LA方法系数B,i
        c(i)  = m              ! LA方法系数C,i+1
      end do
      
      do n = 1,nt-1
        call LAsolve(e,b,c,ny,n)  ! 求解n+1时刻的三对角方程组
      end do
      
  else if(chazhi == 'CN')then  ! CN
      do i = 1, 1000
        e(:)  = m/2            ! LA方法系数A,i-1
        b(:)  = -(m+1)         ! LA方法系数B,i
        c(:)  = m/2            ! LA方法系数C,i+1
      end do
      
      do n = 1,nt-1
        call CNsolve(e,b,c,ny,n,m) ! 求解n+1时刻的三对角方程组
      end do
  else
    write(*,*)"错误"
    stop
    
  end if
  
  ! 输出
  open(unit=11,file=trim(chazhi)//'_result.txt')
  write(11,*)"    TIME           U            Y"
  do n = 1,nt
    if(n*dt==0.18 .or. n*dt==0.36.or.n*dt==0.54.or.n*dt==0.72.or.n*dt==0.90.or.n*dt==1.08)then
      do i = 1,ny
        write(11,*)n*dt,u(i,n),(i-1)*dy!读入这些时刻u的值。
      end do
      write(11,*)
    end if
  end do

  close(11)
  
  stop 
  end program

subroutine  LAsolve(e,b,c,ny,n)
  use global
  implicit none
  
  integer i,k
  integer n,ny
  real::e(1000),b(1000),c(1000),y(1000),f(1000)
  real::L(1000),M(1000)
    
  M(1) = b(1)
  do i=2,ny
    L(i)=e(i)/M(i-1)
    M(i)=b(i)-L(i)*c(i-1)
  end do
  f(1) = -u(1,n)-e(1)*u(1,n)        ! 1处的边界值
  f(ny) = -u(ny,n)-c(ny)*u(ny,n)    ! ny处的边界值
  do i = 2,ny-1
    f(i) = -u(i,n)
  end do

    
  !------开始回带,求得y,1>>ny
  y(1)=f(1)
  do i=2,ny
    y(i)=f(i)-L(i)*y(i-1)
  end do
  
  !-----开始回带,求得n+1时刻的u,ny>>1
  u(ny-1,n+1)=y(ny)/m(ny)   
  do i=ny-1,2,-1
    u(i,n+1)=(y(i)-c(i)*u(i+1,n))/m(i)
  end do
end subroutine LAsolve
  
  
subroutine  CNsolve(e,b,c,ny,n,w)
  use global
  implicit none
  
  integer i,k
  integer n,ny
  real w
  real::e(1000),b(1000),c(1000),y(1000),f(1000)
  real::L(1000),M(1000)
    
  M(2) = b(2)
  do i=3,ny-1
    L(i)=e(i)/M(i-1)
    M(i)=b(i)-L(i)*c(i-1)
  end do
                                                                       
  f(2)    = (w-1)*u(2,n) - w/2*(u(3,n)+u(1,n))-e(1)*u(1,n)           ! 1处的边界值
  f(ny-1) = (w-1)*u(ny-1,n) - w/2*(u(ny,n)+u(ny-1,n))-c(ny)*u(ny,n)  ! ny处的边界值
  do i = 3,ny-2
    f(i) = (w-1)*u(i,n) - w/2*(u(i+1,n)+u(i-1,n))
  end do
    
  !------开始回带,求得y,1>>ny
  y(2)=f(2)
  do i=3,ny-1
    y(i)=f(i)-L(i)*y(i-1)
  end do
  
  !-----开始回带,求得n+1时刻的u,ny>>1
  u(ny-1,n+1)=y(ny-1)/m(ny-1)   
  do i=ny-2,2,-1
    u(i,n+1)=(y(i)-c(i)*u(i+1,n))/m(i)
  end do
  
end subroutine CNsolve

  • 10
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 一维方程可以表示为: $$ \frac{\partial u}{\partial t} = \alpha \frac{\partial^2 u}{\partial x^2} $$ 其中 $u(x, t)$ 是热的分布,$\alpha$ 是热扩散系数。为了求解这个方程,我们可以采用紧差分格式,将时间和空间都离散化,得到: $$ \frac{U_{i, j+1}-U_{i,j}}{\Delta t} = \alpha \frac{U_{i+1,j}-2U_{i,j}+U_{i-1,j}}{\Delta x^2} $$ 其中 $U_{i,j}$ 表示在时间 $t_j$ 和空间 $x_i$ 处的温度值,$\Delta t$ 和 $\Delta x$ 分别是时间和空间的步长。将上式整理可得: $$ U_{i,j+1}=U_{i,j}+\frac{\alpha\Delta t}{\Delta x^2}(U_{i+1,j}-2U_{i,j}+U_{i-1,j}) $$ 这个式子描述了每个时间步长中每个空间点的温度如何更新。初始条件 $U_{i,0}$ 可以由给定的初始温度分布确定。通过不断迭代上述式子,可以求解出整个时间和空间范围内的温度分布。 ### 回答2: 一维方程是描述物质内部温度分布随时间变化的方程。采用紧差分格式求解一维方程是一种数值解法,在空间和时间上进行离散化,然后通过迭代逐步逼近真实解。 首先,我们将时间和空间都离散化,采用均匀网格。将时间区间分为若干个小时间步长,空间区间分为若干个小空间步长。 然后,使用中心差分公式来近似一维方程的导数项。在时间上,使用前后两个时间步长的温度值做差分;在空间上,使用前后两个空间步长的温度值做差分。通过这样的差分近似,我们可以得到一个时间层次和空间层次上各点的差分方程。 接下来,我们进行迭代计算。根据差分方程,我们可以从已知的初始条件出发,逐步计算出时间和空间上各点的温度值。由于相邻时间步长和空间步长之间的差分近似,所以需要进行多次迭代以逼近真实解。 最后,当达到指定的迭代次数或误差范围时,我们可以得到数值解。这个数值解近似了一维方程的真实解,并且可以在不同时间和空间点上查看温度的分布。需要注意的是,差分格式求解一维方程的精度会受到网格大小的影响,因此需要合理选择时间和空间步长,以获得较为准确的结果。 总之,采用紧差分格式求解一维方程是一种数值解法,通过差分近似和迭代计算来逼近真实解,从而得到温度分布随时间变化的数值解。 ### 回答3: 一维方程描述了物体在时间和空间中的温度分布,并由热传导方程给出。为了求解这个方程,可以采用紧差分格式。紧差分格式是一种数值解法,将热方程中的导数项用有限差分逼近来近似表示。 在一维方程中,我们可以将空间离散化为若干离散点,时间离散化为若干时间步长。假设离散点的间距为Δx,时间步长为Δt,在紧差分格式中,我们可以使用中心差分来逼近导数项。 对于一维方程中的时间导数,我们可以使用前向差分或后向差分来近似表示。例如,我们可以使用前向差分将时间导数近似为(T_i,j+1 - T_i,j)/Δt,其中T_i,j表示离散点i在时间步骤j的温度。 对于一维方程中的空间导数,我们可以使用中心差分来近似表示。例如,我们可以使用中心差分将空间导数近似为(T_i+1,j - 2T_i,j + T_i-1,j)/(Δx^2),其中T_i+1,j表示离散点i+1在时间步骤j的温度,T_i-1,j表示离散点i-1在时间步骤j的温度。 通过将这两个逼近项代入一维方程,并进行代数化简,可以得到一个递推公式来求解离散点各个时间步长上的温度值。在求解过程中,我们需要使用初始条件和边界条件来确定递推公式的初始值和边界值。 通过使用紧差分格式,我们可以在计算机上进行数值求解,得到一维方程的近似解。这种求解方法可以在少量的计算时间内得到结果,并且在合理的离散化条件下,可以获得较高的精度。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值