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))
发布了39 篇原创文章 · 获赞 12 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/wdh315172/article/details/105039939