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} imes10^{-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 周日

原文地址:https://www.cnblogs.com/zyg123/p/10392055.html