编写用牛顿迭代法求方程根的函数。方程为
a
x
3
+
b
x
2
+
c
x
+
d
=
0
ax^3+bx^2+cx+d=0
ax3+bx2+cx+d=0,系数a、b、c、d由主函数输入,求x在1附近的一个实根。求出根后,由主函数输出。
牛顿迭代法的公式:
x
=
x
0
−
f
(
x
)
f
′
(
x
0
)
x=x_0-\frac{f(x)}{f'(x_0)}
x=x0−f′(x0)f(x),设迭代到
∣
x
−
x
0
∣
≤
1
∗
1
0
−
5
|x-x_0 |≤1*10^{-5}
∣x−x0∣≤1∗10−5时结束。
2.问题分析
牛顿迭代法是取
x
0
x_0
x0之后,在这个基础上找到比
x
0
x_0
x0更接近的方程根,一步一步迭代,从而找到更接近方程根的近似根。
设
r
r
r是
f
(
x
)
=
0
f(x)=0
f(x)=0的根,选取
x
0
x0
x0作为r的初始近似值,过点
(
x
0
,
f
(
x
0
)
)
(x_0,f(x_0))
(x0,f(x0))做曲线
y
=
f
(
x
)
y=f(x)
y=f(x)的切线L,L的方程为
y
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
y=f(x_0)+f'(x_0)(x-x_0)
y=f(x0)+f′(x0)(x−x0),求出L与x轴交点的横坐标
x
1
=
x
0
−
f
(
x
0
)
f
′
(
x
0
)
x_1=x_0-\frac{f(x_0)}{f'(x0)}
x1=x0−f′(x0)f(x0),称
x
1
x_1
x1为
r
r
r的一次近似值;
过点
(
x
1
,
f
(
x
2
)
)
(x1,f(x_2))
(x1,f(x2))做曲线
y
=
f
(
x
)
y=f(x)
y=f(x)的切线,并求出该切线与x轴交点的横坐标
x
2
=
x
1
−
f
(
x
1
)
f
′
(
x
1
)
x_2=x_1-\frac{f(x1)}{f'(x1)}
x2=x1−f′(x1)f(x1),称
x
2
x_2
x2为
r
r
r的二次近似值;重复以上过程,得到
r
r
r的近似值
x
n
x_n
xn。上述过程即为牛顿迭代法的求解过程。
3.算法设计
程序流程分析:
1)在1附近找任一实数作为
x
0
x_0
x0的初值,我们取1.5,即
x
0
x_0
x0=1.5。
2)用初值
x
0
x_0
x0代入方程中计算此时的
f
(
x
0
)
f(x0)
f(x0)及
f
′
(
x
0
)
f'(x0)
f′(x0);程序中用变量f描述方程的值,用fd描述方程求导之后的值。
3)计算增量h=f/fd。
4)计算下一个
x
x
x,
x
x
x=
x
0
x_0
x0-h。
5)用新产生的
x
x
x替换原来的
x
0
x_0
x0,为下一次迭代做好准备。
6)若
∣
x
−
x
0
∣
>
=
1
e
−
5
|x-x0|>=1e-5
∣x−x0∣>=1e−5,则转到步骤(3)继续执行,否则转到步骤(7)。
7)所求
x
x
x就是方程
a
x
3
+
b
x
2
+
c
x
+
d
=
0
ax^3+bx^2+cx+d=0
ax3+bx2+cx+d=0的根,将其输出。
%%time
# 牛顿迭代法求方程根# 函数功能是用牛顿迭代法求方程的根defsolution(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值whileabs(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)
请输入方程的系数:
方程的参数为: 2.0 -4.0 3.0 -6.0
所求方程的根为x=2.000000
CPU times: user 214 ms, sys: 78.1 ms, total: 293 ms
Wall time: 27.3 s