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
相关产品推荐
相关产品推荐

