目录
[TOC]
前言
对于普通的方程,我们用高中学的解方程方法是可以的,不过对于 超越方程 与 高次代数方程 的求解是很困难的,而且也很难得到准确得解,今天我们用Python语言和二分法来求解这些方程,得到满足精度的解,并不是准确。
(一)二分法的分析
1.定义:
在某区间有函数 在区间 内单调连续,且 ,根据连续函数的性质可知方程在 内一定有唯一的实根。
2.需要满足的条件:
- 是单调函数
- 是连续函数
3.二分法的思想:
不断的分割 区间,取 的中点值
- 当 时,则根在 之间;
- 当 时,则根在 之间。
- 再分割
直到满足我们的精度,我们取 为 的近似解。
4.二分法的误差:
我们取的是:第k次分割后的中间值为近似解。
即:
对于预先给定的误差:
有:
(二)代码实现
1.算法流程图:
二分法流程图.jpg2.源代码:
(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)确定范围:
使用到数学绘图软件,根据数学表达式绘制曲线。
https://www.cnblogs.com/zyg123/p/10385517.html#%E7%9B%AE%E5%BD%95
a. 大致的图像:
02.pngb.利用放大按钮,放大后的图像:
03.pngc.范围是:[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)确定范围:
05.png 04.png根据下面图像,取范围:[1.8, 2.0]
(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)确定范围:
06.png 07.png根据下面图像,取范围是:[-2, 2]
(2)运行结果:
次数 1
x: 0.0
a: 0.0
b: 2.0
…………
次数 9
x: 1.3203125
a: 1.3203125
b: 1.328125
满足精度的结果: 1.32421875
网友评论