1.1方程求根之二分法

目录

前言

对于普通的方程,我们用高中学的解方程方法是可以的,不过对于 超越方程高次代数方程 的求解是很困难的,而且也很难得到准确得解,今天我们用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\)满足我们的精度,我们取\(x\)\(f(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#目录

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 周日

posted @ 2019-02-17 18:02  梦并不遥远  阅读(1136)  评论(0编辑  收藏  举报