二分法和牛顿迭代法解方程(python实现)

二分法

1.二分法思路

假设给定的函数是f(x)=(x-2)^3,二分法首先要求函数是单调的,然后选择一个可行的区间[left,right],其中f(left)<0,f(right)>0,然后选择区间的中点middle,若z左侧函数值乘以中点处的函数值小于0,则说明零点在[left,middle],否则在[middle,right]。

2.二分法代码实现

def f(x):
    return pow(x-2,3)

def binaryMethod(left,right):
    middle=(left+right)/2
    time=-1
    if f(middle)==0:
        print("方程的解为:" + str(middle))
        return time,middle
    while abs(f(middle))>1e-6:
        middle=(left+right)/2
        if f(left)*f(middle)<=0:
            right=middle
        else:
            left=middle
        time+=1
        print(time,middle)
    return time,middle

if __name__=='__main__':
    binaryMethod(0,10)

3.结果截图

在这里插入图片描述

牛顿迭代法

1.牛顿迭代法思路

在这里插入图片描述
这个图借用了别人的。首先确定一个起始点x0,计算出x0点处曲线的切线,切线与x轴有个交点x1,x1作为下一次迭代的起点,依次循环直到f(xn)无限逼近于0,xn可以根据牛顿迭代公式算出。

2.牛顿迭代法代码实现

def f(x):
    return pow(x-2,3)

def df(x):
    return 3*pow(x-2,2)

def newtonMethod(x):
    time=-1
    while abs(f(x))>1e-6:
        x=x-f(x)/df(x)
        time+=1
        print(time,x)
    return time,x


if __name__=='__main__':
    print(newtonMethod(0))

3.结果截图

在这里插入图片描述

好的,我来回答你的问题。 首先,我们来看二分法实现二分法的思路很简单,就是不断缩小一个区间,直到区间足够小,我们认为找到了一个。具体实现如下: ```python import math def f(x): return x**3 - 3*x - 1 def bisection(a, b, eps): """ a, b: 初始区间 eps: 精度 """ while (b - a) > eps: c = (a + b) / 2 if f(c) == 0: return c elif f(a) * f(c) < 0: b = c else: a = c return (a + b) / 2 # 测试 result = bisection(1, 3, 1e-7) print(f"二分法的近似为:{result:.7f}") print(f"理论值为:{2 * math.cos(20 * math.pi / 180):.7f}") ``` 输出结果为: ``` 二分法的近似为:1.8793852 理论值为:1.8793852 ``` 可以看到,二分法得到的近似理论值非常接近,精度也达到了小数点后七位。 接下来,我们来看牛顿迭代实现牛顿迭代的思路是:在当前的近似x0处,利用函数f的一阶泰勒展开式,得到一个更好的近似x1。具体实现如下: ```python def f(x): return x**3 - 3*x - 1 def df(x): return 3*x**2 - 3 def newton(x0, eps): """ x0: 初始近似 eps: 精度 """ while abs(f(x0)) > eps: x0 = x0 - f(x0)/df(x0) return x0 # 测试 result = newton(2, 1e-7) print(f"牛顿迭代的近似为:{result:.7f}") print(f"理论值为:{2 * math.cos(20 * math.pi / 180):.7f}") ``` 输出结果为: ``` 牛顿迭代的近似为:1.8793852 理论值为:1.8793852 ``` 可以看到,牛顿迭代得到的近似理论值也非常接近,精度达到了小数点后七位。 总结: 二分法牛顿迭代都是非线性方程的常用方二分法的优点是简单易懂,但收敛速度较慢;牛顿迭代的优点是收敛速度快,但需要函数的导数,有时比较困难。在实际应用中,我们需要根据具体情况选择合适的方
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值