You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran循环写入数组修复:x按-2~2指定步长正确赋值问题

问题根因

你写的双层嵌套循环逻辑完全颠倒了:对于每个数组下标j,你都完整跑了一遍x从-2到2的遍历,每次遍历都会覆盖Yb(j)的数值,等内层循环跑完,Yb(j)里存的自然只有x取最后一个值(2)的计算结果,Ya数组的问题完全一致。
除此之外你的代码还有两个核心错误:

  • 数组越界:你给Ya分配的长度是20(索引范围1~20),但循环i从0到20,访问i=0、i=20都会触发越界;Yb同理,分配长度200但j循环0到200,也会越界
  • 梯形积分函数逻辑错误:你把传入的数组当成了自变量x,且步长计算完全不对,就算数组赋值对了也算不出正确积分结果
修正后完整代码
module integration_methods
    implicit none
    contains
      ! 输入参数:被积函数值数组f、采样点数量n、步长h
      real function trapezoid_rule(f, n, h)
        integer, intent(in) :: n
        real, intent(in) :: h
        real, dimension(n), intent(in) :: f
        integer :: k
        real :: s
        ! 梯形法公式:h*(f(1)/2 + f(2)+...+f(n-1) + f(n)/2)
        s = f(1)/2.0 + f(n)/2.0
        do k=2, n-1
          s = s + f(k)
        end do  
        trapezoid_rule = s * h
      end function trapezoid_rule
end module integration_methods
    
program integration
    use integration_methods
    implicit none
    integer :: j, i
    ! 步长0.1从-2到2共41个点,步长0.01共401个点
    integer, parameter :: n = 41, m = 401
    real, parameter :: h_a = 0.1, h_b = 0.01
    real, allocatable, dimension(:) :: Ya, Yb
    real :: x, integral
    allocate(Ya(n), Yb(m))
    
    ! 给Ya赋值:步长0.1
    x = -2.0
    do i=1, n
        Ya(i) = exp(-x/5.0)
        x = x + h_a
    end do
    
    ! 给Yb赋值:步长0.01
    x = -2.0
    do j=1, m
        Yb(j) = exp(-x/5.0)
        x = x + h_b
    end do
    
    ! 计算积分
    integral = trapezoid_rule(Ya, n, h_a)
    write (*,*) '步长0.1时梯形法积分结果 = ', integral
    integral = trapezoid_rule(Yb, m, h_b)
    write (*,*) '步长0.01时梯形法积分结果 = ', integral
    
    deallocate(Ya, Yb)
end program integration
修正说明
  • 移除了错误的双层嵌套循环,改为单循环同步更新x和数组下标,保证每个数组位置存储对应x的函数值
  • 修正了数组长度和循环范围的匹配,避免数组越界问题
  • 重写了梯形积分函数,符合数值积分的计算逻辑,修正后步长越小计算结果越接近解析解(约4.2272)

内容的提问来源于stack exchange,提问作者HUR1EY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:10