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

