100个python算法超详细讲解:牛顿迭代法求方程根

1.问题描述
编写用牛顿迭代法求方程根的函数。方程为ax 3 +bx 2 +cx+d=0,系数a、
b、c、d由主函数输入,求x在1附近的一个实根。求出根后,由主函数输出。


2.问题分析
牛顿迭代法是取x 0 之后,在这个基础上找到比x 0 更接近的方程根,一步一
步迭代,从而找到更接近方程根的近似根。
设r是f(x)=0的根,选取x 0 作为r的初始近似值,过点(x 0 ,f(x 0 ))做曲线y=f(x)
的切线L,L的方程为y=f(x 0 )+f'(x 0 )(x-x 0 ),求出L与x轴交点的横坐标x 1 =x 0 -
f(x 0 )/f'(x 0 ),称x 1 为r的一次近似值;过点(x 1 ,f(x 2 ))做曲线y=f(x)的切线,并求
出该切线与x轴交点的横坐标x 2 =x 1 -f(x 1 )/f'(x 1 ),称x 2 为r的二次近似值;重复
以上过程,得到r的近似值x n 。上述过程即为牛顿迭代法的求解过程。

3.算法设计
程序流程分析:
1)在1附近找任一实数作为x 0 的初值,我们取1.5,即x 0 =1.5。
2)用初值x 0 代入方程中计算此时的f(x 0 )及f'(x 0 );程序中用变量f描述方
程的值,用fd描述方程求导之后的值。
3)计算增量h=f/fd。
4)计算下一个x,x=x 0 -h。
5)用新产生的x替换原来的x 0 ,为下一次迭代做好准备。
6)若|x-x 0 |>=1e-5,则转到步骤(3)继续执行,否则转到步骤(7)。
7)所求x就是方程ax 3 +bx 2 +cx+d=0的根,将其输出。


4.确定程序框架
该程序的主体结构如下

if __name__ == '__main__':
# 输入方程的系数
# 用牛顿迭代法求方程的根
# 输出所求方程的根

程序流程图如图1.4所示。

5.迭代法求方程根
编写程序时要注意的一点是判定|x-x 0 |>=1e-5,许多初学者认为判定条件
应该是|x-x 0 |<1e-5,从牛顿迭代法的原理可以看出,迭代的实质就是越来越接
近方程根的精确值,最初给x 0 所赋初值与根的精确值是相差很多了,正是因为
这个我们才需要不断地进行迭代,也就是程序中循环体的功能。在经过一番迭
代之后所求得的值之间的差别也越来越小,直到求得的某两个值的差的绝对值
在某个范围之内时便可结束迭代。若我们把判定条件改为|x-x 0 |<1e-5,则第一
次的判断结果必为假,这样我们就不能进入循环体再次执行。希望初学者对于
本类题目条件的判定要多加注意。 

定义solution()函数求方程的根。solution()函数的代码如下:

# 函数功能是用牛顿迭代法求方程的根
def solution(a, b, c, d):
x = 1.5
x0 = x # 用所求得的x的值代替x0原来的值
# f用来描述方程的值,fd用来描述方程求导之后的值
f = a * x0 * x0 * x0 + b * x0 * x0 + c * x0 + d
fd = 3 * a * x0 * x0 + 2 * b * x0 + c
h = f / fd
x = x0 - h # 求得更接近方程根的x的值
while abs(x - x0) >= 1e-5:
x0 = x
f = a * x0 * x0 * x0 + b * x0 * x0 + c * x0 + d
fd = 3 * a * x0 * x0 + 2 * b * x0 + c
h = f / fd
x = x0 - h # 求得更接近方程根的x的值
return x

6.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 牛顿迭代法求方程根
# 函数功能是用牛顿迭代法求方程的根
def solution(a, b, c, d):
x = 1.5
x0 = x # 用所求得的x值代替x0原来的值
# f用来描述方程的值,fd用来描述方程求导之后的值
f = a * x0 * x0 * x0 + b * x0 * x0 + c * x0 + d
fd = 3 * a * x0 * x0 + 2 * b * x0 + c
h = f / fd
x = x0 - h # 求得更接近方程根的x值
while abs(x - x0) >= 1e-5:
x0 = x
f = a * x0 * x0 * x0 + b * x0 * x0 + c * x0 + d
fd = 3 * a * x0 * x0 + 2 * b * x0 + c
h = f / fd
x = x0 - h # 求得更接近方程根的x值
return x
if __name__ == '__main__':
print("请输入方程的系数:")
# a,b,c,d代表所求方程的系数
a, b, c, d = map(float, input().split())
print("方程的参数为:" , a, b, c, d)
# x用来记录求得的方程根
x = solution(a, b, c, d)
print("所求方程的根为x=%.6f"% x)

7.运行结果
在PyCharm下运行程序,结果如图1.5所示。

 

  • 2
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lee达森

创作不易,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值