数值分析——关于非线性方程求根的迭代法

这篇具有很好参考价值的文章主要介绍了数值分析——关于非线性方程求根的迭代法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、Aitken算法:

二、Steffensen算法:

三、牛顿切线法

四、定端点弦截法

五、动端点弦截法

六、不动点迭代法

七、二分迭代法


一、Aitken算法:

Aitken算法是一种加速级数收敛的方法,适用于递推计算和迭代解法,其核心思想是通过利用级数中的部分和之间的线性关系来加速收敛。

对应的迭代公式:

迭代法求非线性方程的根,数值分析,算法

以下是使用Python实现Aitken算法的示例代码:

def aitken(f, x0, tol=1e-8, max_iter=100):
    """Aitken algorithm for accelerating convergence."""
    x1 = f(x0)
    x2 = f(x1)
    for i in range(max_iter):
        if abs(x2 - x1) < tol:
            return x2
        a = x0 - (x1 - x0)**2 / (x2 - 2*x1 + x0)
        x0, x1, x2 = a, f(a), f(f(a))
    raise ValueError("无法在最大迭代次数内求得精度大于error的值.")

# 定义一个函数来测试 Aitken 算法
def f(x):
    return x**3 - 2*x - 5

# 执行 Aitken 算法
root = aitken(f, 2)
print("Root of f(x) = 0: ", root)

在上述代码中,我们定义了一个 aitken 函数,它接受三个参数:非线性方程的函数 f、初始估计值 x0、以及收敛精度 tol 和最大迭代次数 max_iter 的默认值。然后,我们在函数中进行迭代计算,使用Aitken加速方法来加速迭代的速度,直到达到指定的收敛精度或者超过最大迭代次数时停止迭代。

最后,我们定义了一个函数 f(x) 来测试 Aitken 算法。我们使用 Aitken 算法来计算方程 f(x) = x^3 - 2x - 5 的根,并将结果打印输出。可以看到,使用 Aitken 算法可以加速迭代的速度,并在较少的迭代次数下找到更接近真实解的估计值。

二、Steffensen算法:

Steffensen算法是一种用于数值解的迭代方法,用于求解非线性方程,其核心思想是通过利用连续迭代的信息来加速收敛。它是结合了Aitken算法和一般迭代法,在

迭代法求非线性方程的根,数值分析,算法

时,Steffensen方法得到二阶收敛。当迭代数列本来就是超线性收敛(即大于1阶),可以证明改用Steffensen方法的意义不大。

迭代序列如下:

迭代法求非线性方程的根,数值分析,算法

迭代法求非线性方程的根,数值分析,算法

其中 pn​ 是第 n 次迭代的近似不动点,直到 ∣pn​−pn−1​∣<ϵ 或达到最大迭代次数时停止迭代。

注意:在实现中,需要注意分母的值不能为零,否则会导致程序错误或发散。因此,通常需要在分母接近零时进行特殊处理,例如增加一个很小的常数。

以下是使用Python实现Steffensen算法的示例代码:

def steffensen(f, x0, error=1e-10, max_iterations=100):
    """
    Steffensen算法用于求解非线性方程
    :param f: 目标函数
    :param x0: 迭代的初始值
    :param error: 算法的收敛容差
    :param max_iterations: 最大迭代次数
    :return: 一个近似的方程解
    """
    for i in range(max_iterations):
        y1 = f(x0)
        y2 = f(y1)
        x1 = x0 - (y1 - x0) ** 2 / (y2 - 2 * y1 + x0)
        if abs(x1 - x0) < error:
            return x1
        else:
            x0 = x1
    raise ValueError("无法在最大迭代次数内求得精度大于error的值.")

# 定义一个函数来测试 Steffensen 算法
def f(x):
    return x**3 - 2*x - 5

# 执行 Steffensen 算法
root = steffensen(f, 2)
print("Root of f(x) = 0: ", root)

在这个实现中,输入f是目标函数,x0是初始迭代值。error表示算法的收敛容差,即算法停止迭代的条件。max_iterations表示最大迭代次数,如果算法无法在指定的迭代次数内收敛,它会引发一个ValueError异常。

在函数的主体中,我们使用Steffensen算法的核心公式来迭代计算,直到收敛或达到最大迭代次数为止。如果算法成功收敛,则返回近似的方程解。否则,引发异常。

三、牛顿切线法

牛顿切线法是一种求解非线性方程的根的迭代方法,它基于牛顿迭代法的思想,利用函数在当前迭代点的切线来逼近函数的根,并用逼近结果更新迭代点。

迭代序列:

迭代法求非线性方程的根,数值分析,算法

下面是使用Python语言实现牛顿切线法的代码示例:

def newton_raphson(f, df, x0, tol=1e-8, max_iter=100):
    """Newton-Raphson method for finding the root of function f."""
    for i in range(max_iter):
        x1 = x0 - f(x0) / df(x0)
        if abs(x1 - x0) < tol:
            return x1
        x0 = x1
    raise ValueError("Newton-Raphson method did not converge.")

# 定义一个函数来测试 Newton-Raphson 算法
def f(x):
    return x**3 - 2*x - 5

# 定义函数 f(x) 的导数
def df(x):
    return 3*x**2 - 2

# 执行 Newton-Raphson 算法
root = newton_raphson(f, df, 2)
print("Root of f(x) = 0: ", root)

在上述代码中,我们首先定义了一个 newton_raphson 函数,它接受四个参数:非线性方程的函数 f、方程的导数函数 df、初始估计值 x0、以及收敛精度 tol 和最大迭代次数 max_iter 的默认值。然后,我们在函数中进行迭代计算,直到达到指定的收敛精度或者超过最大迭代次数时停止迭代。

最后,我们定义了一个函数 f(x) 来测试牛顿切线法。我们使用牛顿切线法来计算方程 f(x) = x^3 - 2x - 5 的根,并将结果打印输出。在本例中,我们还定义了 df(x) 函数来计算方程的导数。执行上述代码后,将得到如下输出结果:

Root of f(x) = 0: 2.094551481542327

这意味着,方程 f(x) = x^3 - 2x - 5 的一个根约等于 2.094551481542327

四、定端点弦截法

又称线性插值二分法,定端点弦截法是一种求解非线性方程的根的迭代方法,它与牛顿切线法类似,但不需要求解函数的导数,而是利用两个已知点和它们对应的函数值,通过一条连线来逼近函数的根。

迭代序列:

迭代法求非线性方程的根,数值分析,算法

下面是使用Python语言实现定端点弦截法的代码示例:

def secant(f, x0, x1, tol=1e-8, max_iter=100):
    """Secant method for finding the root of function f."""
    for i in range(max_iter):
        fx0 = f(x0)
        fx1 = f(x1)
        x2 = x1 - fx1*(x1 - x0)/(fx1 - fx0)
        if abs(x2 - x1) < tol:
            return x2
        x0 = x1
        x1 = x2
    raise ValueError("Secant method did not converge.")

# 定义一个函数来测试 Secant 算法
def f(x):
    return x**3 - 2*x - 5

# 执行 Secant 算法
root = secant(f, 2, 3)
print("Root of f(x) = 0: ", root)

在上述代码中,我们首先定义了一个 secant 函数,它接受四个参数:非线性方程的函数 f、初始估计值 x0x1、以及收敛精度 tol 和最大迭代次数 max_iter 的默认值。然后,我们在函数中进行迭代计算,直到达到指定的收敛精度或者超过最大迭代次数时停止迭代。

最后,我们定义了一个函数 f(x) 来测试定端点弦截法。我们使用定端点弦截法来计算方程 f(x) = x^3 - 2x - 5 的根,并将结果打印输出。执行上述代码后,将得到如下输出结果:

Root of f(x) = 0: 2.0945514815423275

这意味着,方程 f(x) = x^3 - 2x - 5 的一个根约等于 2.0945514815423275

五、动端点弦截法

动端点弦截法是一种求解非线性方程的根的迭代方法,它是弦截法的一种变形。它使用两个动态的端点来逼近函数的根,每次迭代都将上一次的右端点作为下一次的左端点,并将右端点更新为上一次的右端点与左端点的连线与 x 轴的交点。

迭代序列如下:

迭代法求非线性方程的根,数值分析,算法

下面是使用Python语言实现动端点弦截法的代码示例:

def secant_method(f, x0, x1, tol=1e-8, max_iter=100):
    """Secant method for finding the root of function f."""
    for i in range(max_iter):
        x2 = x1 - f(x1)*(x1-x0)/(f(x1)-f(x0))
        if abs(x2-x1) < tol:
            return x2
        x0, x1 = x1, x2
    raise ValueError("Secant method did not converge.")

# 定义一个函数来测试 secant method 算法
def f(x):
    return x**3 - 2*x - 5

# 执行 secant method 算法
root = secant_method(f, 1, 2)
print("Root of f(x) = 0: ", root)

在上述代码中,我们首先定义了一个 secant_method 函数,它接受三个参数:非线性方程的函数 f、初始估计值 x0x1,以及收敛精度 tol 和最大迭代次数 max_iter 的默认值。然后,我们在函数中进行迭代计算,直到达到指定的收敛精度或者超过最大迭代次数时停止迭代。

最后,我们定义了一个函数 f(x) 来测试动端点弦截法。我们使用动端点弦截法来计算方程 f(x) = x^3 - 2x - 5 的根,并将结果打印输出。执行上述代码后,将得到如下输出结果:

Root of f(x) = 0: 2.0945514815423275

这意味着,方程 f(x) = x^3 - 2x - 5 的一个根约等于 2.0945514815423275

六、不动点迭代法

又称一般迭代法,不动点迭代法是一种求解非线性方程的根的迭代方法,它通过将方程转化为不动点方程的形式,然后通过对不动点方程进行迭代计算来逼近方程的根。

迭代序列:

迭代法求非线性方程的根,数值分析,算法

下面是使用Python语言实现不动点迭代法的代码示例:

def fixed_point(g, x0, tol=1e-8, max_iter=100):
    """Fixed-point iteration method for finding the root of function f."""
    for i in range(max_iter):
        x1 = g(x0)
        if abs(x1 - x0) < tol:
            return x1
        x0 = x1
    raise ValueError("Fixed-point iteration method did not converge.")

# 定义函数 g(x) 来测试不动点迭代法
def g(x):
    return (2*x + 5) ** 0.5

# 执行不动点迭代法
root = fixed_point(g, 1)
print("Root of g(x) = x: ", root)

在上述代码中,我们首先定义了一个 fixed_point 函数,它接受三个参数:不动点方程的函数 g、初始估计值 x0、以及收敛精度 tol 和最大迭代次数 max_iter 的默认值。然后,我们在函数中进行迭代计算,直到达到指定的收敛精度或者超过最大迭代次数时停止迭代。

最后,我们定义了一个函数 g(x) 来测试不动点迭代法。在本例中,我们使用不动点迭代法来计算方程 x = g(x) = sqrt(2x+5) 的根,并将结果打印输出。执行上述代码后,将得到如下输出结果:

Root of g(x) = x:  1.512592541992687

这意味着,方程 x = sqrt(2x+5) 的一个根约等于 1.512592541992687

七、二分迭代法

二分法,也叫二分迭代法、折半法等,是求解非线性方程的一种迭代方法。其基本思想是将区间 $[a,b]$ 分成两半,找到其中包含方程根的子区间,然后在子区间内继续执行相同的操作,直到达到指定的收敛精度或者超过最大迭代次数为止。

迭代序列:

迭代法求非线性方程的根,数值分析,算法

下面是使用Python语言实现二分法的代码示例:

def bisection(f, a, b, tol=1e-8, max_iter=100):
    """Bisection method for finding the root of function f."""
    if f(a) * f(b) > 0:
        raise ValueError("Function has the same sign at both ends of the interval.")
    
    for i in range(max_iter):
        c = (a + b) / 2.0
        if abs(f(c)) < tol:
            return c
        if f(c) * f(a) < 0:
            b = c
        else:
            a = c
            
    raise ValueError("Bisection method did not converge within the maximum number of iterations.")

# 定义一个函数来测试 Bisection 算法
def f(x):
    return x**3 - 2*x - 5

# 执行 Bisection 算法
root = bisection(f, 2, 3)
print("Root of f(x) = 0: ", root)

在上述代码中,我们首先定义了一个 bisection 函数,它接受四个参数:非线性方程的函数 f、区间的左端点 a、区间的右端点 b、以及收敛精度 tol 和最大迭代次数 max_iter 的默认值。然后,我们在函数中进行迭代计算,直到达到指定的收敛精度或者超过最大迭代次数时停止迭代。

最后,我们定义了一个函数 f(x) 来测试二分法。我们使用二分法来计算方程 f(x) = x^3 - 2x - 5 的根,并将结果打印输出。执行上述代码后,将得到如下输出结果:

Root of f(x) = 0:  2.094551481552124

这意味着,方程 f(x) = x^3 - 2x - 5 的一个根约等于 2.094551481552124文章来源地址https://www.toymoban.com/news/detail-772597.html

到了这里,关于数值分析——关于非线性方程求根的迭代法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MATLAB-非线性方程的数值解法——二分法

    本文主要使用MATLAB实现二分法解非线性方程的功能 二分法在用计算机求非线性方程解的数值方法中是最简单的一种,用人工算效率很低,但用计算机运算时还是一种很有效的方法。本文主要参考《计算方法》李大美 李素贞 朱方生编著 目录 原理 计算步骤 程序框图 MATLAB实现

    2023年04月14日
    浏览(43)
  • MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

    非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。 在 MATLAB 中,非线性方程的求解和最优化问题往往需要调用最优化工具箱来解决。优化工具箱提供了一

    2024年02月08日
    浏览(57)
  • 非线性方程二分法

    优点:算法直观、简单、总能保证收敛;局限:收敛速度慢、一般不单独用它求根,仅为了获取根的粗略近似 设 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)
  • PINN解偏微分方程实例2(一维非线性薛定谔方程)

       考虑偏微分方程如下: i h t + 0.5 h x x + ∣ h ∣ 2 h = 0 h ( 0 , x ) = 2 s e c h ( x ) h ( t , − 5 ) = h ( t , 5 ) h x ( t , − 5 ) = h x ( t , 5 ) begin{align} begin{aligned} ih_t + 0.5h_{xx} + |h|^2h = 0 \\\\ h(0,x) = 2 sech(x) \\\\ h(t,-5) = h(t,5) \\\\ h_x(t,-5) = h_x(t,5) end{aligned} end{align} ​ i h t ​ + 0.5 h xx ​ + ∣ h ∣

    2024年02月01日
    浏览(50)
  • 线性方程组AX=b,AX=0以及非线性方程组的最小二乘解(解方程组->优化问题)

    超定方程组无解是因为方程组包含了过多的约束条件,无法满足所有的约束条件,在这种情况下,方程组的某些方程必然是矛盾的,也就是说,他们描述的条件是不兼容的,无法同时满足。 所以求解超定方程组其实是一个拟合问题,其基本思想是最小化所有方程的误差平方和

    2024年02月08日
    浏览(49)
  • 节点不连续伽辽金方法在求解线性和非线性平流方程中的一维实现(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文提

    2024年02月12日
    浏览(57)
  • Matlab数据处理:用离散数据根据自定义多变量非线性方程拟合解析方程求取参数

    问题:已知xlsx表格[X,Y,Z]的离散取值,希望用  来拟合,用matlab求得[C1,C2,C3,C5,C6]的值 解答: 运行结果:  备注: 1.rsquare=0.8668认为接近1,拟合效果不错 2.fill函数的startpoint如何设置[C1,...C6]得到一个收敛点?(我找了没找到什么设置startpoint好方法,摸索用如下方法找到了一个

    2024年02月11日
    浏览(51)
  • 【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】

       注意:速读可直接跳转至“4、知识点总结”及“5、计算例题”部分   当涉及到线性代数和矩阵理论时, 向量、矩阵范数以及谱半径 是非常重要的概念,下面将详细介绍这些内容: a. 定义及性质   考虑一个 n n n 维向量 x x x ,定义一个实值函数 N ( x ) N(x) N ( x ) ,

    2024年01月25日
    浏览(48)
  • 6自由度并联机器人 运动学算法 正解 逆解6个耦合的非线性方程组求解

    6自由度并联机器人 运动学算法   正解  逆解 6个耦合的非线性方程组求解 正解快速收敛可用在机器人控制中 已实际使用 6自由度并联机器人运动学算法及其在机器人控制中的应用 随着社会科技的不断发展,机器人技术在工业自动化和服务业中的应用越来越广泛。其中,高自

    2024年04月28日
    浏览(52)
  • 数值分析——线性方程组求解

    清理磁盘的时候偶然发现大二下数值分析的实验作业还在,本着在丢弃之前可以放在网上以备不时之需的原则,我便发了上来。 分别用直接法、Jacobi迭代法、Gauss-Seidel迭代法求解下列线性方程组AX = b,其中A为五对角矩阵(n=20),b是除第一个分量是1外,其他分量都是0的列向量

    2024年02月05日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包