The Fun Of Algorithm - Day3 - Newton Iterative Equation

问题描述

编写用牛顿迭代法求方程根的函数 。方程为 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=x0f(x0)f(x0)
设迭代到 ∣ x − x 0 ∣ < = 1 0 − 5 |x-x_0|<=10^{-5} xx0<=105时结束。

问题分析

牛顿迭代法是取 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)(xx0),求出 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=x0f(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=x1f(x1)f(x1),称 x 2 x_2 x2 r r r的二次近似值;重复以上过程,得到 r r r的近似值 x n x_n xn. 上述过程即为牛顿迭代法的求解过程。

算法流程分析

  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(x_0) f(x0) f ′ ( x 0 ) f^{'}(x_0) f(x0); 程序中用变量 f f f描述方程的值, 用 f d fd fd描述方程求导之后的值
  3. 计算增量 h = f / f d h=f/fd h=f/fd
  4. 计算下一个 x x x, x = x 0 − h x=x_0-h x=x0h
  5. 用新计算的 x x x替换原来的 x 0 x_0 x0, 为下一次迭代做好准备。
  6. ∣ x − x 0 ∣ > = 1 e − 5 |x-x_0|>=1e-5 xx0>=1e5, 则转到步骤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 的根, 将其输出。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值