• 弦截法及Python实现


    目录

    1 原理

    2 弦截法的求解过程

    3 弦截法的几何解释

    3.1 定端点弦截法

    3.2 变端点弦截法

    4 案例&Python实现


    1 原理

    弦截法是在牛顿法的基础上进行了改良。牛顿法迭代公式如下:

    x_{n+1}=x_n-\frac{f(x)}{f'(x)}

    从迭代公式可以看出,牛顿迭代法的一个较强的要求是:f(x)" role="presentation">f(x)存在且不为0。弦截法的思想就是用弦斜率去近似代替f(x)" role="presentation">f(x)

    弦截法的迭代公式有两种:
    ① 定端点迭代法,用点(x0,f(x0))" role="presentation">(x0,f(x0))和点(xn,f(xn))" role="presentation">(xn,f(xn))连线的斜率 近似代替f(x)" role="presentation">f(x) 。

    xn+1=xnxnx0f(xn)f(x0)f(xn)" role="presentation">xn+1=xnxnx0f(xn)f(x0)f(xn)

    ② 变端点迭代法,又叫快速弦截法, 用点(xn,f(xn))" role="presentation">(xn,f(xn))和点(xn+1,f(xn+1))" role="presentation">(xn+1,f(xn+1))连线的斜率 近似代替f(x)" role="presentation">f(x) 。

    xn+1=xnxnxn1f(xn)f(xn1)f(xn)" role="presentation">xn+1=xnxnxn1f(xn)f(xn1)f(xn)

    弦截法和牛顿法的异同点:

    相同点不同点
    都是线性化方法

    牛顿法在计算x_{n+1}时,只用到了x_n,所以称之为单点迭代法;

    弦截法在计算x_{n+1}时,用到了x_nx_{n-1},所以称之为多点迭代法;

    弦截法不需要计算导函数,运算量更小

    2 弦截法的求解过程

    ① 求解迭代函数;

    ② 构造迭代公式(一般采用变端点弦截法);

    ② 确定迭代初值;

    ③ 确定迭代终止条件。

    3 弦截法的几何解释

    3.1 定端点弦截法

    迭代过程如下:

    • 定端点为P_0(x_0,f(x_0))
    • 起始迭代点为P_1(x_1,f(x_1))
    • 连接P0、P1,两点的连线与x轴的交点的横坐标为x_2
    • 更新迭代起始点为P_2(x_2,f(x_2))
    • 连接P0、P2,两点的连线与x轴的交点的横坐标为x_3
    • ......
    • 如此循环P0与Pn连线与x轴的交点会无限接近于真实解x*

    3.2 变端点弦截法

    迭代过程如下:

    • 起始迭代点有两个点P_0(x_0,f(x_0))P_1(x_1,f(x_1))
    • 连接P0、P1,两点的连线与x轴的交点的横坐标为x_2
    • 更新起始迭代点为P_1(x_1,f(x_1))P_2(x_2,f(x_2))
    • 连接P1、P2,两点的连线与x轴的交点的横坐标为x_3

    • ......

    • 如此循环,Pn" role="presentation">PnPn+1" role="presentation">Pn+1连线与x轴的交点会无限接近于真实解x*

    4 案例&Python实现

    用快速弦截法求解方程x3x1=0" role="presentation">x3x1=0的根,精度要求ε=109" role="presentation" style="position: relative;">ε=109

    输出近似解以及迭代次数。

    程序流程:

    Python代码:

    1. #----弦截法求根-----#
    2. import numpy as np
    3. def f(x):
    4. y=x**3-x-1#求根方程的表达式
    5. return y
    6. def main():
    7. x0=0;x1=np.pi/2 #取初值
    8. e=10**(-9) #误差要求
    9. N=10000 #迭代次数上限
    10. L=0 #初始化迭代次数
    11. while abs((f(x1)-0))>e: #采用残差来判断
    12. x2=x1-(x1-x0)/(f(x1)-f(x0))*f(x1) #迭代公式
    13. x0=x1
    14. x1=x2
    15. L=L+1 #统计迭代次数
    16. if L>N:
    17. print("超出迭代次数上限")
    18. break
    19. print(f"x2={x2}") #输出数值解
    20. print(f(x2)-0) # 验证解的正确性
    21. print(f"L={L}") #输出迭代次数
    22. if __name__ == '__main__':
    23. main()

    运行结果:

    1. x2=1.324717957244748
    2. 8.881784197001252e-15
    3. L=9
  • 相关阅读:
    896. 最长上升子序列 II 线性dp (优化版 nlogn 贪心+二分)
    什么是Mirai僵尸网络
    网络编程基础知识拾遗:用大白话解释什么是交换机、路由器、光猫、IP地址和子网掩码、公网和内网IP、端口和域名
    如何使ssh操作linux 更安全
    2023年【北京市安全员-B证】考试试卷及北京市安全员-B证模拟考试题
    python 碰到问题
    jmeter分布式压力测试搭建
    情绪识别公开数据集汇总心电相关and申请方法详细描述 呕心沥血之作 全网唯一
    OSPF高级特性 —— 转发地址不可达情况 + 解决
    Python条件语句+字典
  • 原文地址:https://blog.csdn.net/dongke1991/article/details/127529412