• 【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现


    目录

    一、非线性方程式求根

    1、二分法(Bisection Method、对分法)

    a. 理论简介

    b. python实现

    2、迭代法(Iterative Method)

    a. 理论简介

    b. python实现

    3、Newton 迭代法(Newton's Method)

    a. 理论简介

    b. python实现


    一、非线性方程式求根

            非线性方程举例:

    f(x)=0

    5x^4+3x+1=0

            非线性方程式求根是一个重要的数值计算问题,常用的方法包括二分法、迭代法和牛顿迭代法。

    1、二分法(Bisection Method、对分法)

    a. 理论简介

    (连续函数介值定理)

            二分法是一种简单而直观的求根方法,适用于单调函数的根。它的基本思想是通过不断缩小根所在区间来逼近根的位置。具体步骤如下:

    • 首先,选择一个初始区间[a, b],确保函数在这个区间内连续且函数值异号(即f(a) * f(b) < 0)。
    • 然后,计算区间的中点c = (a + b) / 2,并计算函数在c处的值f(c)。
    • 接下来,根据f(c)与0的关系,确定新的区间[a, c]或[c, b],使得新的区间内仍满足函数值异号的条件。
    • 重复上述步骤,直到满足预设的精度要求,即根的近似值落在所选区间内。

    b. python实现

    1. def f(x):
    2. return 5 * x**4 + 3 * x + 1
    3. def bisection_method(a, b, tolerance=1e-6, max_iterations=100):
    4. if f(a) * f(b) >= 0:
    5. return None
    6. for _ in range(max_iterations):
    7. c = (a + b) / 2
    8. if abs(f(c)) < tolerance:
    9. return c
    10. if f(c) * f(a) < 0:
    11. b = c
    12. else:
    13. a = c
    14. return None
    15. # 调用二分法求解方程的根
    16. root = bisection_method(a=-1, b=0)
    17. if root is not None:
    18. print("方程的一个根为:", root)
    19. else:
    20. print("未找到方程的根")

    注意,二分法要求初始区间[a, b]满足f(a) * f(b) < 0,即方程在区间的两个端点上取值异号。

    输出:

    a=-0.5, b=1
    方程的一个根为: -0.36193275451660156
    a=-1, b=0
    未找到方程的根

    2、迭代法(Iterative Method)

    a. 理论简介

            迭代法是一种通过不断迭代逼近根的方法,适用于任意函数的根。它的基本思想是从一个初始的近似值开始,通过不断更新逼近根的位置,直到满足预设的精度要求。具体步骤如下:

    • 首先,选择一个初始的近似值x0。
    • 然后,根据迭代公式x[i+1] = g(x[i]),计算下一个近似值x[i+1]。
    • 重复上述步骤,直到满足预设的精度要求,即近似值与根的差值足够小。

    b. python实现

    1. def g(x):
    2. return (-1) / (5 * x**3 + 3)
    3. def iterative_method(initial_guess, tolerance=1e-6, max_iterations=100):
    4. x = initial_guess
    5. for _ in range(max_iterations):
    6. x_next = g(x)
    7. if abs(x_next - x) < tolerance:
    8. return x_next
    9. x = x_next
    10. return None
    11. # 调用迭代法求解方程的根
    12. root = iterative_method(initial_guess=0)
    13. if root is not None:
    14. print("方程的一个根为:", root)
    15. else:
    16. print("未找到方程的根")

    注意,迭代法的收敛性与迭代函数的选择密切相关,对于某些函数可能无法收敛或者收敛速度很慢。

    输出:

    方程的一个根为: -0.36193292438672897

    3、Newton 迭代法(Newton's Method)

    a. 理论简介

            牛顿迭代法是一种快速收敛的求根方法,适用于光滑函数的根。它利用函数的局部线性近似来逼近根的位置。具体步骤如下:

    • 首先,选择一个初始的近似值x0。
    • 然后,根据牛顿迭代公式x[i+1] = x[i] - f(x[i]) / f'(x[i]),计算下一个近似值x[i+1]。
    • 重复上述步骤,直到满足预设的精度要求,即近似值与根的差值足够小。

    b. python实现

    1. def f(x):
    2. return 5 * x**4 + 3 * x + 1
    3. def f_prime(x):
    4. return 20 * x**3 + 3
    5. def newton_method(initial_guess, tolerance=1e-6, max_iterations=100):
    6. x = initial_guess
    7. for _ in range(max_iterations):
    8. delta_x = f(x) / f_prime(x)
    9. x -= delta_x
    10. if abs(delta_x) < tolerance:
    11. return x
    12. return None
    13. # 调用牛顿迭代法求解方程的根
    14. root = newton_method(initial_guess=0)
    15. if root is not None:
    16. print("方程的一个根为:", root)
    17. print(int(f(root)))
    18. else:
    19. print("未找到方程的根")

    注意,牛顿法要求2阶导不编号,1阶导不为0

    输出:

    方程的一个根为: -0.3619330489831212

  • 相关阅读:
    Typescript基本类型---上篇
    Idea中 css 、js 压缩插件会自动生成xxx.min.css、xxx.min.js文件
    《位图BitMap - 基于java实现》
    基于Admin.NET框架的前端的一些改进和代码生成处理(2)
    Veritas Backup Exec v22.2.1193.1605 数据备份恢复软件
    【***操作系统---第五章***】
    9.2.5 TIMESTAMP类型
    计算机网络(一)
    【SSL 1458】zzzyyds(DP)
    Docker安装Mysql
  • 原文地址:https://blog.csdn.net/m0_63834988/article/details/133317012