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. 牛顿法
设 是 的根,选取 作为 的初始近似值,过点 做曲线 的切线 ,,则 与 轴交点的横坐标 ,称 为 的一次近似解。过点 做曲线 的切线,并求该切线与 轴交点的横坐标 ,称 为 的二次近似解。重复以上过程,得 的近似值序列,其中, 称为 的 次近似值,上式称为牛顿迭代公式。
用牛顿迭代法解非线性方程,是把非线性方程 线性化的一种近似方法。把 在点 的某邻域内展开成泰勒级数:
取其线性部分(即泰勒展开的前两项),并令其等于0,即:。以此作为非线性方程 的近似方程,若 ,则其解为 。这样,得到牛顿迭代法的一个迭代关系式:。
# -*- 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))