1.1方程求根之二分法
目录
前言
对于普通的方程,我们用高中学的解方程方法是可以的,不过对于 超越方程 与 高次代数方程 的求解是很困难的,而且也很难得到准确得解,今天我们用Python语言和二分法来求解这些方程,得到满足精度的解,并不是准确。
(一)二分法的分析
1.定义:
在某区间有函数 \(f(x)\) 在区间\([a, b]\) 内单调连续,且\(f(a)*f(b)<0\) ,根据连续函数的性质可知方程在\([a,b]\) 内一定有唯一的实根。
2.需要满足的条件:
- \(f(x)\)是单调函数
- \(f(x)\)是连续函数
- \(f(a)*f(b)<0\)
3.二分法的思想:
不断的分割\([a,b]\) 区间,取\([a,b]\) 的中点值\(x=(a+b)/2\)
- 当\(f(x)*f(a)<0?\) 时,则根在\([a,x]\) 之间;
- 当\(f(x)*f(b)<0\) 时,则根在\([x,b]\) 之间。
- 再分割\(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.算法流程图:
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)确定范围:
使用到数学绘图软件,根据数学表达式绘制曲线。
a. 大致的图像:
b.利用放大按钮,放大后的图像:
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]
(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]
(2)运行结果:
次数 1
x: 0.0
a: 0.0
b: 2.0
…………
次数 9
x: 1.3203125
a: 1.3203125
b: 1.328125
满足精度的结果: 1.32421875