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

Fortran使用双条件编写条件循环求解函数根遇无限循环问题求助

二分法求根代码问题修复说明

原代码存在的核心问题

  • 语法错误:表达式中漏写乘号,3c需要改为3*c,否则会出现计算逻辑错误
  • 未实现二分法核心逻辑:完全没有更新区间端点a和b,区间没有按规则收缩,导致迭代无法收敛
  • 循环退出条件逻辑错误:仅判断了f>0且绝对值小于阈值的情况,遗漏了f<0的收敛场景,导致满足精度要求也无法退出
  • 迭代计数器未初始化:count1没有赋初始值,计数结果无意义
  • 迭代逻辑顺序错误:首次计算的中点和函数值没有纳入迭代打印,且迭代时用初始a和旧c计算新值,不符合二分法规则

终止条件合理性说明

你提到的「函数值正负+绝对值小于阈值」的双条件没有必要,直接判断ABS(f) < 1e-4就可以覆盖正负两种收敛场景,也可以额外增加b-a < 1e-4作为双保险,避免部分函数在根附近斜率太平缓导致函数值收敛慢的问题。

修复后的完整代码

PROGRAM proj
IMPLICIT NONE
REAL :: a=2.0, b=3.0, c, f
INTEGER :: count1 = 0 ! 初始化计数器

! 打印表头
PRINT*, "迭代次数", "当前中点c", "函数值f(c)"

DO
    c = (a + b)/2
    f = c**3 - 3*c - 4
    count1 = count1 + 1
    ! 打印当前迭代结果
    PRINT*, count1, c, f
    
    ! 满足精度要求直接退出
    IF (ABS(f) < 1e-4) EXIT
    
    ! 按二分法规则更新区间
    IF (f > 0.0) THEN
        b = c
    ELSE
        a = c
    END IF
END DO

PRINT*, "===== 最终结果 ====="
PRINT*, "近似根c = ", c
PRINT*, "对应函数值f(c) = ", f
PRINT*, "迭代总次数 = ", count1

END PROGRAM proj

代码运行说明

运行后会逐行打印每一次迭代的次数、当前中点值、对应函数值,可以直观看到区间收缩、函数值逐步趋近于0的过程,最终输出满足1e-4精度要求的近似根。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:54:04