当前位置: 首页 > article >正文

Python调用二分法和牛顿法求方程的根

文章目录

    • 二分法
    • 牛顿法
    • 函数定义

二分法

二分法是最简单的求根算法。

对于方程 f ( x ) = 0 f(x)=0 f(x)=0,如果 f ( a ) ⋅ f ( b ) < 0 f(a)\cdot f(b)<0 f(a)f(b)<0,则说明 a , b a,b a,b之间必有根,如果按照某个步长对其进行搜索,那么最终一定能够不断缩小根的取值范围,不断精确化。

二分法就是基于这种思想的一种算法,其实质是对区间进行快速选取。如果已知 f ( a ) ⋅ f ( b ) < 0 f(a)\cdot f(b)<0 f(a)f(b)<0,则快速选取 c = a + b 2 c=\frac{a+b}{2} c=2a+b,如果 f ( a ) ⋅ f ( c ) < 0 f(a)\cdot f(c)<0 f(a)f(c)<0,则说明根在 ( a , c ) (a,c) (a,c)之间,否则即说明根在 ( a , b ) (a,b) (a,b)之间,然后不断迭代下去。

scipy提供了二分求根算法bisect,测试如下

from scipy.optimize import bisect

def func(x):
    return x*x - 2

bisect(func, 0, 2)
# 1.4142135623715149

其中,func为待求函数,0,2为下限和上限。

牛顿法

如果 f ( x ) f(x) f(x)=0可以写成 x = φ ( x ) x=\varphi(x) x=φ(x)的形式,则可以将这个方程的根理解为 y = φ ( x ) y=\varphi(x) y=φ(x) y = x y=x y=x的交点。现给定一个初值 x 0 x_0 x0,将其代入 φ ( x ) \varphi(x) φ(x)中,则 φ ( x 0 ) \varphi(x_0) φ(x0)对应一个新的 x x x,记为 x 1 x_1 x1

如果数列 { x n } \{x_n\} {xn}收敛,那么必有 x = lim ⁡ k → ∞ x k x=\lim_{k\to\infty}x_k x=limkxk即为方程的根。所以,问题的关键在构造合适的 φ ( x ) \varphi(x) φ(x)使得数列能够快速收敛。

其最简单的形式莫过于 x k + 1 = x k + f ( x k ) x_{k+1}=x_k+f(x_k) xk+1=xk+f(xk),不过这种迭代公式看起来十分危险,如果$f(x_k)是一个大于0的单调递增函数,那么结果就爆炸了。

所以,最好为 f ( x k ) f(x_k) f(xk)乘以一个系数,当 f ( x k ) f(x_k) f(xk)增加时使之变小,当其递减时使之变大。所以一个比较好的形式为

x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} xk+1=xkf(xk)f(xk)

此即Newton公式。

除了迭代形式,Newton公式也可以作为二分法的一个升级版本, x k − f ( x k ) f ′ ( x k ) x_k-\frac{f(x_k)}{f'(x_k)} xkf(xk)f(xk)可以表示过 ( x k , f ( x k ) ) (x_k,f(x_k)) (xk,f(xk))做切线与 x x x轴的交点,通过切线选取新的 x x x值取代了二分法的盲动性,示例如下

from scipy.optimize import newton

newton(func, 0)
# 1.4142135623715149

函数定义

二分法和牛顿法的参数定义如下

bisect(f, a, b, args=(), xtol=2e-12, rtol=8.881784197001252e-16, maxiter=100, full_output=False, disp=True)
newton(func, x0, fprime=None, args=(), tol=1.48e-08, maxiter=50, fprime2=None, x1=None, rtol=0.0, full_output=False, disp=True)

其中,f, a, b以及func, x0已经在演示的时候调用了,分别是求根函数和初值;args为待求根函数中可能包含的其他参数;maxiter为最大迭代步长。


http://www.kler.cn/news/16562.html

相关文章:

  • 密码学作业——置换密码部分
  • 真北游记 | 潮汕行的似水流年
  • 拷贝构造函数和赋值重载函数详解
  • 辅助驾驶功能开发-功能对标篇(16)-NOA 城市辅助系统-毫末智行
  • C++标准库 --- 动态内存 (Primer C++ 第五版 · 阅读笔记)
  • 解密.[support2022@cock.li].faust后缀勒索病毒加密的文件:拯救您的企业数据的完整指南!
  • 100+Python挑战性编程练习系列 -- day 2
  • python基于轻量级YOLOv5的生猪检测+状态识别分析系统
  • 读研读博不emo
  • 数字化医院PACS影像系统 三维影像后处理技术应用
  • 100篇帮小白入门——什么是嵌入式系统?
  • CANOE入门到精通——CANOE系列教程记录2
  • 【Python】芜湖市空气质量指数可视化(散点图、分类散点图、单变量分布图、线性回归拟合图、相关性热力图)
  • Linux常见的网络命令
  • ChatGPT技术原理 第五章:GPT模型
  • 《Effective Python 编写高质量Python代码的59个有效方法》学习笔记5
  • mybatis generator自定义model的代码注释
  • 测牛学堂:2023软件测试入门学习指南之测试方法完结总结
  • EMC VPLEX VS2 FRU故障备件更换基本流程
  • JAVA开发——常用的注解
  • 十一、通过六个因素对织物起球等级进行预测
  • 【第十一届泰迪杯B题】最终版:问题一的实现(含源代码)
  • 26从零开始学Java之如何对数组进行排序与二分查找?
  • scratch比大小 中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析2023年3月
  • gRPC入门教程
  • 【Java笔试强训 25】
  • 时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测
  • Java 基础入门篇(四)—— 方法的重载与参数传递机制
  • 11.string,stringbuilder,stringbuffer的区别和联系。
  • 5. 操作系统基础