C++实现迭代法求解指定方程输出错误 代码问题排查
求解代码的具体错误点
- 迭代格式逻辑完全错误:求解f(x)=0形式的方程根,需要先把方程变形为**x = φ(x)**的不动点形式,再通过x_{k+1}=φ(x_k)的递推逐步逼近根值。但代码中直接将目标函数
f(x) = 4*(1+sqrt(x))*log10(x)-1作为迭代映射,递推规则变成了x_{k+1}=f(x_k),从根本上偏离了求根目标——我们的目标是找到让f(x)=0的x值,不是让x迭代收敛到f(x)的函数值上。 - 迭代过程天生不收敛:哪怕强行沿用当前的递推规则,f(x)在有效定义域x>0内的导数绝对值远大于1,递推过程的数值会持续发散:比如初始x=3时,第一次递推得到的x1≈4.21,第二次递推用x=4.21计算得到的x1≈6.61,后续递推值会越来越大,永远无法满足差值小于精度eps的终止条件。
- 浮点数精度判断的用法错误:判断相邻两次迭代值差的绝对值是否满足精度要求时,代码使用了
abs(x1 - x0),在部分编译环境下,这个函数会匹配整型版本的abs实现,将传入的浮点数截断为整数后再计算绝对值,直接导致精度判断完全失效。针对double类型的差值计算,应该使用浮点数版本的fabs。 - 无效的冗余初始值:代码开头定义的
x0=-2完全没有实际作用——进入do-while循环的第一步就将x0赋值为x1的初始值3,这个-2的赋值既没有参与计算,还埋下隐患:如果后续调整循环执行顺序,把负数传入sqrt、log10这类仅支持正数输入的函数,会直接得到无意义的NaN值,导致计算完全出错。 - 无关的冗余系统代码:
system("chcp 1251>nul")是切换系统俄语代码页的命令,和数值求解的逻辑没有任何关联,属于不必要的冗余代码。
补充说明:要得到正确的迭代格式,需要从原方程变形推导——比如从4(1+√x)lgx = 1可以整理出不动点形式x = 10^(1/(4*(1+sqrt(x)))),再验证迭代映射在目标根邻域的导数绝对值小于1、选择合理的正数初始值,才能通过递推得到符合精度要求的根。
内容的提问来源于stack exchange,提问作者Andrij Matviiv
相关产品推荐
相关产品推荐

