python 二分法和牛顿法 求立方根

1. 标准二分法

# -*- coding: utf-8 -*-

def cube_root(num, error_value):

    positive_num  = abs(num)
    left = 0
    right = positive_num
    mid = (left+right) / 2.

    while abs(mid**3 - positive_num) > error_value:
        if mid**3 > positive_num:
            right = mid
        else:
            left = mid

        mid = (left + right) / 2.

    return mid if num>=0 else -mid



if __name__ == "__main__":
    num = -667817
    error_value = 1e-5

    print(cube_root(num, error_value))

2. 牛顿法

设 r 是 f(x)=0 的根,选取 x_0 作为 r 的初始近似值,过点 (x_0, f(x_0)) 做曲线 y=f(x) 的切线 LL: y=f(x_0)+f'(x_0)(x-x_0),则 L 与 x 轴交点的横坐标 x_1 = x_0 - \frac{f(x_0)}{f'(x_0)} ,称 x_1 为 r 的一次近似解。过点 (x_1, f(x_1)) 做曲线 y=f(x) 的切线,并求该切线与 x 轴交点的横坐标 x_2 = x_1 - \frac{f(x_1)}{f'(x_1)} ,称 x_2 为 r 的二次近似解。重复以上过程,得 r 的近似值序列,其中, x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} 称为 r 的 n+1 次近似值,上式称为牛顿迭代公式

 

用牛顿迭代法解非线性方程,是把非线性方程 f(x)=0 线性化的一种近似方法。把 f(x) 在点 x_0 的某邻域内展开成泰勒级数:f(x)=f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)(x-x_0)^2}{2!} + ... + \frac{f^{(n)}(x_0)(x-x_0)^n}{n!} + R_n(x)

取其线性部分(即泰勒展开的前两项),并令其等于0,即:f(x)=f(x_0) + f'(x_0)(x-x_0) = 0。以此作为非线性方程f(x)=0 的近似方程,若 f'(x) \neq 0,则其解为  x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}。这样,得到牛顿迭代法的一个迭代关系式:x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

# -*- coding: utf-8 -*-

def newton_method(num, error_value):

    x = num / 2.

    while abs(x**3 - num) > error_value:
        x -= (x**3 - num) / (3.0 * x**2)

    return x



if __name__ == "__main__":
    num = -667817
    error_value = 1e-5

    print(newton_method(num, error_value))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值