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

这篇具有很好参考价值的文章主要介绍了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为最大迭代步长。文章来源地址https://www.toymoban.com/news/detail-433407.html

到了这里,关于Python调用二分法和牛顿法求方程的根的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二分法MATLAB代码

    本质是通过不断进行区间压缩来获取函数零点。 二分法的终止条件:区间长度小于等于精度要求 。 流程: 如下图所示:

    2024年02月05日
    浏览(46)
  • 二分法相关使用

    在线OJ:704. 二分查找 有序数组下的二分思路如下: 由于这里是有序数组, 我们可以可以先得到中点位置, 中点可以把数组分为左右两边; 如果中点位置的值等于目标值, 直接返回中点位置; 如果中点位置的值小于目标值, 则去数组中点左侧按同样的方式查找; 如果中点位置的值大

    2024年02月07日
    浏览(43)
  • 【算法】—二分法详解

    ①定义: 二分查找算法也称折半搜索算法,对数搜索算法,是一种在 有序数组 中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素

    2024年02月09日
    浏览(52)
  • 【二分查找】一文带你掌握二分法 (附万能模板)

    一、简介 哪怕没有学过编程的同学,也许不知道二分法这个名字,但也一定接触过它的核心思想。不了解的同学也没关系,我用一句话就能概括出它的精髓: 将一个区间一分为二,每次都舍弃其中的一部分。 二分法能够极大地降低我们在解决问题时的时间复杂度。假如你要

    2024年01月19日
    浏览(58)
  • 【剑指Offer】二分法例题

    链表是数据结构中重要的一个章节,他的重要性也不言而喻,在未来不管是笔试还是面试都会遇到这类的题目,所以接下来我就会把一些链表的常考的题目全部整理出来供大家学习指正。 题目链接 描述: 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包

    2023年04月13日
    浏览(45)
  • 非线性方程二分法

    优点:算法直观、简单、总能保证收敛;局限:收敛速度慢、一般不单独用它求根,仅为了获取根的粗略近似 设 f ( x ) f(x) f ( x ) 在 [ a , b ] [a,b] [ a , b ] 上连续、严格单调、满足条件 f ( a ) f ( b ) 0 f(a)f(b)0 f ( a ) f ( b ) 0 则在区间 [ a , b ] [a,b] [ a , b ] 内必有一根 x ∗ x^* x ∗ 。通

    2024年02月04日
    浏览(48)
  • 1241:二分法求函数的零点

    【题目描述】 有函数:f(x)=x5−15x4+85x3−225x2+274x−121 已知f(1.5)0,f(2.4)0 且方程f(x)=0在区间[1.5,2.41.5,2.4] 有且只有一个根,请用二分法求出该根。 【输入】 (无) 【输出】 该方程在区间[1.5,2.41.5,2.4]中的根。要求四舍五入到小数点后66位。 【输入样例】 【输出样例】 【AC代码】

    2024年01月25日
    浏览(36)
  • Leetcode刷题笔记——二分法

    二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问。算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将原数组通过[left,right]两个索引划分范围,初值left=0,right=数组的最后一个元素 当left = r

    2024年02月10日
    浏览(42)
  • 06-C++ 基本算法 - 二分法

    在这个笔记中,我们将介绍二分法这种基本的算法思想,以及它在 C++ 中的应用。我们将从一个小游戏猜数字开始,通过这个案例来引出二分法的概念。然后我们将详细讲解什么是二分法以及它的套路和应用。最后,我们还会介绍 C++ STL 中的二分查找函数。让我们一起来探索

    2024年02月16日
    浏览(45)
  • 算法:二分法---寻找H指数

    1、题目: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数 。 根据维基百科上 h 指数的定义: h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包