python123高次方程求根_1.1方程求根之二分法

目录

[TOC]

前言

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

(一)二分法的分析

1.定义:

在某区间有函数

在区间

内单调连续,且

,根据连续函数的性质可知方程在

内一定有唯一的实根。

2.需要满足的条件:

是单调函数

是连续函数

3.二分法的思想:

不断的分割

区间,取

的中点值

时,则根在

之间;

时,则根在

之间。

再分割

直到

满足我们的精度,我们取

的近似解。

4.二分法的误差:

我们取的是:第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)二分法

"""

二分法:

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)确定范围:

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.求解:

要求误差不超过,

(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.求解:

要求误差不超过:

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

你可能感兴趣的:(python123高次方程求根)