美文网首页
1.1方程求根之二分法

1.1方程求根之二分法

作者: 张一根 | 来源:发表于2018-11-28 13:37 被阅读0次

    目录

    [TOC]

    前言

    对于普通的方程,我们用高中学的解方程方法是可以的,不过对于 超越方程高次代数方程 的求解是很困难的,而且也很难得到准确得解,今天我们用Python语言和二分法来求解这些方程,得到满足精度的解,并不是准确。

    (一)二分法的分析

    1.定义:

    在某区间有函数 f(x) 在区间[a, b] 内单调连续,且f(a)*f(b)<0 ,根据连续函数的性质可知方程在[a,b] 内一定有唯一的实根。

    2.需要满足的条件:

    1. f(x)是单调函数
    2. f(x)是连续函数
    3. f(a)*f(b)<0

    3.二分法的思想:

    不断的分割[a,b] 区间,取[a,b] 的中点值x=(a+b)/2

    1. f(x)*f(a)<0? 时,则根在[a,x]? 之间;
    2. f(x)*f(b)<0 时,则根在[x,b] 之间。
    3. 再分割x=(a+b)/2

    直到x满足我们的精度,我们取xf(x) 的近似解。

    4.二分法的误差:

    我们取的是:第k次分割后的中间值为近似解。

    即:x_k=\frac{1}{2}(a_k+b_k)

    对于预先给定的误差:\varepsilon>0

    有:|x^*-x_k| \le \frac{1}{2}(b_k-a_k)=\frac{1}{2^k+1}<\varepsilon

    (二)代码实现

    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)二分法

    """
        二分法:
        f(a)*f(b)<0 连续函数f(a)在a,b区间必有根。
    """
    from my_math.func_math import feval
    
    def two_fun(expr, a, b, r):
        """
            二分法求解方程
        :param expr: 方程表达式
        :param a: 左端
        :param b: 右端
        :param r: 精度
        :return: 求解的结果
        """
        f_a = feval(expr, a)
        f_b = feval(expr, b)
        if f_a*f_b >= 0:
            print("该区间没有根")
        else:
            k = 0
            while 1/(2**(k+1)) > r:
                x = (b + a)/2
                if feval(expr, a) * feval(expr, x) > 0:
                    a = x
                else:
                    b = x
                k += 1
                print("*"*20)
                print("次数", k)
                print("x:", x)
                print("a:", a)
                print("b:", b)
    
        result = (a+b)/2
        print("满足精度的结果:", result)
    
    # 求解1-x-sin(x)=0为例
    if __name__ == '__main__':
        two_fun("1-x-sin(x)", 0, 1, 10**-4)
    

    (三)案例效果

    1.求解:1-x-sin(x)=0

    使用二分法求解1-x-sin(x)=0? ,误差范围不超过\frac{1}{2}\times10^{-4}

    (1)确定范围:

    使用到数学绘图软件,根据数学表达式绘制曲线。

    绘图软件的下载网址

    https://www.cnblogs.com/zyg123/p/10385517.html#%E7%9B%AE%E5%BD%95

    a. 大致的图像:
    02.png
    b.利用放大按钮,放大后的图像:
    03.png
    c.范围是:[0, 1]内必有根

    (2)运行结果:


    次数 1
    x: 0.5
    a: 0.5
    b: 1


    …………


    次数 13
    x: 0.5108642578125
    a: 0.5108642578125
    b: 0.510986328125

    满足精度的结果: 0.51092529296875

    取结果是:0.5109

    2.求解:sin(x)-\frac{x^2 }{4}=0

    要求误差不超过,10^{-3}

    (1)确定范围:

    根据下面图像,取范围:[1.8, 2.0]

    05.png 04.png

    (2)运行结果:


    次数 1
    x: 1.9
    a: 1.9
    b: 2.0


    …………


    次数 9
    x: 1.933984375
    a: 1.93359375
    b: 1.933984375

    满足精度的结果: 1.9337890625

    取结果是:1.934

    3.求解:x^{3}-x-1=0

    要求误差不超过:10^{3}

    (1)确定范围:

    根据下面图像,取范围是:[-2, 2]

    06.png 07.png

    (2)运行结果:


    次数 1
    x: 0.0
    a: 0.0
    b: 2.0


    …………


    次数 9
    x: 1.3203125
    a: 1.3203125
    b: 1.328125

    满足精度的结果: 1.32421875

    取结果是:1.324

    作者:Mark

    日期:2019/02/17 周日

    相关文章

      网友评论

          本文标题:1.1方程求根之二分法

          本文链接:https://www.haomeiwen.com/subject/cspaqqtx.html