问题描述
编写用牛顿迭代法求方程根的函数 。方程为 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
0
)
f
′
(
x
0
)
x=x_0-\frac {f(x_0)}{f^{'}(x_0)}
x=x0−f′(x0)f(x0)
设迭代到
∣
x
−
x
0
∣
<
=
1
0
−
5
|x-x_0|<=10^{-5}
∣x−x0∣<=10−5时结束。
问题分析
牛顿迭代法是取
x
0
x_0
x0之后,在这个基础上找到比
x
0
x_0
x0更接近的方程根,一步一步迭代, 从而找到更接近方程根的近似根。
设
r
r
r是
f
(
x
0
)
f(x_0)
f(x0)的根, 选取
x
0
x_0
x0作为
r
r
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
L,
L
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
L
L与
x
x
x轴交点的横坐标
x
1
=
x
0
−
f
(
x
0
)
f
′
(
x
0
)
x_1=x_0-\frac{f(x_0)}{f^{'}(x_0)}
x1=x0−f′(x0)f(x0),称
x
1
x_1
x1为
r
r
r的一次近似值; 过点
(
x
1
,
f
(
x
2
)
)
(x_1,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(x_1)}{f^{'}(x_1)}
x2=x1−f′(x1)f(x1),称
x
2
x_2
x2为
r
r
r的二次近似值;重复以上过程,得到
r
r
r的近似值
x
n
x_n
xn. 上述过程即为牛顿迭代法的求解过程。
算法流程分析
- 在1附件找任意一个实数作为 x 0 x_0 x0的初值, 我们取1.5, 即 x 0 x_0 x0=1.5
- 用初值 x 0 x_0 x0代入方程中计算此时的 f ( x 0 ) f(x_0) f(x0)及 f ′ ( x 0 ) f^{'}(x_0) f′(x0); 程序中用变量 f f f描述方程的值, 用 f d fd fd描述方程求导之后的值
- 计算增量 h = f / f d h=f/fd h=f/fd
- 计算下一个 x x x, x = x 0 − h x=x_0-h x=x0−h
- 用新计算的 x x x替换原来的 x 0 x_0 x0, 为下一次迭代做好准备。
- 若 ∣ x − x 0 ∣ > = 1 e − 5 |x-x_0|>=1e-5 ∣x−x0∣>=1e−5, 则转到步骤3继续执行,否则转到步骤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 的根, 将其输出。
Code
# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 牛顿迭代法求方程根
# 函数功能是用牛顿迭代法求方程的根
def solution(a,b,c,d):
x=1.5
x0=x
#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: #abs()函数返回数字的绝对值
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
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 -4 3 -6
方程的参数为: 2.0 -4.0 3.0 -6.0
所求方程的根为x=2.000000