1.1方程求根之二分法

2018-11-28  本文已影响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 周日

上一篇下一篇

猜你喜欢

热点阅读