zoukankan      html  css  js  c++  java
  • 1.2方程求根之不定点迭代法

    目录

    前言

    本章节讲的是另一种基础的求解方程的方法,不定点迭代法。

    (一)不定点迭代法的分析

    1.定义:

    一般地,为了求解非线性方程:

    [f(x)=0 ]

    将其转换为等价的形式:

    [x = varphi(x) ]

    其中$varphi(x) $ 称为迭代函数。由于(1)与(2)具有相同的解:

    则构造迭代公式有:

    [x_{k+1} = varphi(x_k), k=0,1,2··· ]

    给定初值(x_0) ,并且(varphi(x)) 是连续函数,则有:

    [x^* = lim_{k o infty} x_{k+1} = lim_{k o infty} varphi(x_{k})= varphi(lim_{k o infty} x_{k}) = varphi(x^*) ]

    可得(x^*) 是方程的(4)的解,也是方程(1)(f(x)=0) 的解。

    上面的方法就称为:不定点迭代法

    2.条件:

    1. (varphi(x)) 在[a,b]内连续,在(a,b)内可导。
    2. 对于任意的(x in [a,b]) ,则有(varphi(x) in [a,b])
    3. 在[a,b]内,存在一个常数L(0<L<1),使得(|varphiprime(x)|leq L < 1),局部收敛

    3.思想:

    在收敛函数的前提下,不断的逼近真实值,直到满足我们的精度要求。

    如下图,我们可以看到,给定初始值(p_0)后,经过几次的迭代,取值P很逼近两函数的交点,也就是方程的解。

    思想.jpg

    4.误差:

    要使(x^*-x_k leq varepsilon) ,只需要(|x_{k+1}-x_k| leq varepsilon)

    即可以用迭代前后两次的近似根的绝对值大小,来判断(x_k)使否满足精度要求,从而终止迭代的条件。

    (二)代码实现

    1.流程图:

    不定点迭代法.jpg

    2.源代码:

    (1)feval函数:

    def feval(string, a):
        """
            根据值来计算数学表达式。
        :param string: 含有x未知数的数学表达式
        :param a: 自变量x的具体数值
        :return:  数学表达式的计算结果
        """
        count = string.count("x")
        string = string.replace('x', '%f')
        t = (a, ) * count
        result = eval(string % t)
        return result
    

    (2)不定点迭代法:

    """
        不定点迭代法,不断的逼近求解的方法
    """
    from my_math.func_math import feval
    
    
    def item_fun(expr, x_0, r):
        """
            不定点迭代法求解方程的根
        :param expr: 迭代函数的表达式
        :param r: 误差
        :return: 结果值
        """
        k = 0
        # 第一次两点的差距
        x_1 = feval(expr, x_0)
        x_2 = feval(expr, x_1)
        f_1 = abs(x_2 - x_1)
    
        # 第二次两点的差距
        x_1 = feval(expr, x_2)
        x_2 = feval(expr, x_1)
        f_2 = abs(x_2 - x_1)
    
        # 判断迭代函数是否收敛
        if f_1 <=  f_2:
            print("函数不收敛")
            result = None
        else:
            while abs(x_2-x_1) > r:
                x_1 = feval(expr, x_2)
                x_2 = feval(expr, x_1)
                k += 1
                print('*' * 20)
                print("次数", k)
                print("x_k", x_1)
                print("x_(k+1)", x_2)
            result = x_2
        print("最后的结果是:", result)
        return result
    
    
    if __name__ == '__main__':
        item_fun("1+1/(x**2)", 1.45, 10**-15)
        # 最后的结果是: 1.4655713791984073
    

    (三)案例演示

    1.求解:(f(x)=x^3-x-1=0)

    (1)迭代函数的选择

    (f(x)​)转化为等价的两种形式

    [x=varphi_1(x)=sqrt[3]{x+1} ]

    [x = varphi_2(x)=x^3-1 ]

    1)(f(x)) 的图像:

    01.1.png

    01.2.png

    可知,其在1.2~1.4之间有解决。

    2)(varphi_1(x)=sqrt[3]{x+1}) 的图像:

    01.png

    02.png

    函数收敛,取其初始值是:1.4

    3)(varphi_2(x)=x^3-1)的图像:

    03.png

    04.png

    函数不收敛,不满足要求。

    (2)运行结果

    1)对于(x=varphi_1(x)=sqrt[3]{x+1}) 有:

    要求其误差是:不超过10^-5

    初始值是:1.4


    次数: 1
    x_k: 1.324736389945562
    x_(k+1) :1.3247213843988477


    次数 2
    x_k: 1.324718535206007
    x_(k+1) :1.324718155312702
    最后的结果是: 1.324718155312702

    取其结果是:1.32472
    2)对于(x = varphi_2(x)=x^3-1)有:

    函数不收敛
    最后的结果是: None

    2.求解:(f(x)=x^3-x^2-1=0)

    (1)函数的选择

    将函数转化为下面几种等价的形式

    [x=varphi(x_1)=1+frac{1}{x^2} ]

    [x=varphi(x_2)=sqrt[3]{1+x^2} ]

    [x=varphi(x_3)=frac{1}{sqrt{x-1}} ]

    [x=varphi(x_4)=sqrt{x^3-1} ]

    [x=varphi(x_5)=frac{1}{x^2-x} ]

    (f(x)​) 的图像

    06.png

    05.png

    可知,其在1.0~1.5之间有根。

    (2)运行结果

    要求其误差是:不超过10^-5

    初始值是:1.5

    1)对于(varphi(x_1)=1+frac{1}{x^2})

    次数: 1
    x_k: 1.4620902736993255
    x_(k+1): 1.4677909186639455


    …………


    次数: 9
    x_k: 1.465568837830036
    x_(k+1): 1.4655726498903963
    最后的结果是: 1.4655726498903963

    取其结果是:1.46557
    2)对于(varphi(x_2)=sqrt[3]{1+x^2})

    次数: 1
    x_k: 1.466243022306503
    x_(k+1): 1.4658768155675745


    …………


    次数: 4
    x_k: 1.4655770399093733
    x_(k+1): 1.4655738557111386
    最后的结果是: 1.4655738557111386

    取其结果是:1.46557
    3)对于(varphi(x_3)=frac{1}{sqrt{x-1}})

    函数不收敛
    最后的结果是: None

    取其结果是:无
    4)对于(varphi(x_4)=sqrt{x^3-1})

    函数不收敛
    最后的结果是: None

    取其结果是:无
    5)对于(varphi(x_5)=frac{1}{x^2-x})

    函数不收敛
    最后的结果是: None

    取其结果是:无

    3.求解:(f(x) = x^2-3=0)

    (1)函数的选择

    将函数转化为下面几种等价的形式

    [x = varphi(x_1)=x^2+x-3 ]

    [x = varphi(x_2)=frac{3}{x} ]

    [x=varphi(x_3)=x-frac{1}{4}(x^2-3) ]

    [x=varphi(x_4)=frac{1}{2}(x+frac{3}{x}) ]

    (f(x)​)的图像

    07.png

    08.png

    可知,函数有两个根,其在-2与2附近之间有根。

    (2)运行结果

    要求其误差是:不超过10^-5

    初始值是:-2与2

    1)对于:(varphi(x_1)=x^2+x-3)

    函数不收敛
    最后的结果是: None

    取其结果值:无
    2)对于:(varphi(x_2)=frac{3}{x})

    函数不收敛
    最后的结果是: None

    取其结果值:无
    3)对于:(varphi(x_3)=x-frac{1}{4}(x^2-3))

    当初值为2时。


    次数: 1
    x_k: 1.732056325884
    x_(k+1): 1.732051503216
    最后的结果是: 1.732051503216

    取为:1.73205

    当初值为-2时。


    次数: 1
    x_k: 1.7079058866077501
    x_(k+1): 1.728670273791


    次数: 2
    x_k: 1.731595007775
    x_(k+1): 1.73198968899375


    次数: 3
    x_k: 1.7320426599749998
    x_(k+1): 1.7320497615377501
    最后的结果是: 1.7320497615377501

    取为:1.73205

    取其结果值:1.73205
    4)对于:(varphi(x_4)=frac{1}{2}(x+frac{3}{x}))

    初始值是:2.0时,

    最后的结果是: 1.7320508075688879

    取为:1.7205

    初始值是:-2.0时,

    最后的结果是: -1.7320508075688879

    取为:-1.73205

    取其结果值:1.73205与-1.73205

    作者:Mark

    日期:2019/02/18 周一

  • 相关阅读:
    0803C#如何高效读取EXCEL文件
    0711笔记
    笔记0709
    0708:XML专题
    笔记0705
    笔记0704
    笔记0627
    笔记0626
    gridview合并单元格
    笔记0624
  • 原文地址:https://www.cnblogs.com/zyg123/p/10395478.html
Copyright © 2011-2022 走看看