目录
[TOC]
前言
本章节讲的是另一种基础的求解方程的方法,不定点迭代法。
(一)不定点迭代法的分析
1.定义:
一般地,为了求解非线性方程:
将其转换为等价的形式:
其中 称为迭代函数。由于(1)与(2)具有相同的解:
则构造迭代公式有:
给定初值 ,并且 是连续函数,则有:
可得 是方程的(4)的解,也是方程(1) 的解。
上面的方法就称为:不定点迭代法
2.条件:
- 在[a,b]内连续,在(a,b)内可导。
- 对于任意的 ,则有
- 在[a,b]内,存在一个常数L(0<L<1),使得,局部收敛
3.思想:
思想.jpg在收敛函数的前提下,不断的逼近真实值,直到满足我们的精度要求。
如下图,我们可以看到,给定初始值后,经过几次的迭代,取值P很逼近两函数的交点,也就是方程的解。
4.误差:
要使 ,只需要
即可以用迭代前后两次的近似根的绝对值大小,来判断使否满足精度要求,从而终止迭代的条件。
(二)代码实现
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)不定点迭代法:
"""
不定点迭代法,不断的逼近求解的方法
"""
from my_math.func_math import feval
def item_fun(expr, x_0, r):
"""
不定点迭代法求解方程的根
:param expr: 迭代函数的表达式
:param r: 误差
:return: 结果值
"""
k = 0
# 第一次两点的差距
x_1 = feval(expr, x_0)
x_2 = feval(expr, x_1)
f_1 = abs(x_2 - x_1)
# 第二次两点的差距
x_1 = feval(expr, x_2)
x_2 = feval(expr, x_1)
f_2 = abs(x_2 - x_1)
# 判断迭代函数是否收敛
if f_1 <= f_2:
print("函数不收敛")
result = None
else:
while abs(x_2-x_1) > r:
x_1 = feval(expr, x_2)
x_2 = feval(expr, x_1)
k += 1
print('*' * 20)
print("次数", k)
print("x_k", x_1)
print("x_(k+1)", x_2)
result = x_2
print("最后的结果是:", result)
return result
if __name__ == '__main__':
item_fun("1+1/(x**2)", 1.45, 10**-15)
# 最后的结果是: 1.4655713791984073
(三)案例演示
1.求解:
(1)迭代函数的选择
将转化为等价的两种形式
1) 的图像:
01.1.png 01.2.png可知,其在1.2~1.4之间有解决。
2) 的图像:
01.png 02.png函数收敛,取其初始值是:1.4
3)的图像:
03.png 04.png函数不收敛,不满足要求。
(2)运行结果
1)对于 有:
要求其误差是:不超过10^-5
初始值是:1.4
次数: 1
x_k: 1.324736389945562
x_(k+1) :1.3247213843988477
次数 2
x_k: 1.324718535206007
x_(k+1) :1.324718155312702
最后的结果是: 1.324718155312702
取其结果是:1.32472
2)对于有:
函数不收敛
最后的结果是: None
2.求解:
(1)函数的选择
将函数转化为下面几种等价的形式
的图像
可知,其在1.0~1.5之间有根。
(2)运行结果
要求其误差是:不超过10^-5
初始值是:1.5
1)对于
次数: 1
x_k: 1.4620902736993255
x_(k+1): 1.4677909186639455
…………
次数: 9
x_k: 1.465568837830036
x_(k+1): 1.4655726498903963
最后的结果是: 1.4655726498903963
取其结果是:1.46557
2)对于
次数: 1
x_k: 1.466243022306503
x_(k+1): 1.4658768155675745
…………
次数: 4
x_k: 1.4655770399093733
x_(k+1): 1.4655738557111386
最后的结果是: 1.4655738557111386
取其结果是:1.46557
3)对于
函数不收敛
最后的结果是: None
取其结果是:无
4)对于
函数不收敛
最后的结果是: None
取其结果是:无
5)对于
函数不收敛
最后的结果是: None
取其结果是:无
3.求解:
(1)函数的选择
将函数转化为下面几种等价的形式
的图像
07.png 08.png可知,函数有两个根,其在-2与2附近之间有根。
(2)运行结果
要求其误差是:不超过10^-5
初始值是:-2与2
1)对于:
函数不收敛
最后的结果是: None
取其结果值:无
2)对于:
函数不收敛
最后的结果是: None
取其结果值:无
3)对于:
当初值为2时。
次数: 1
x_k: 1.732056325884
x_(k+1): 1.732051503216
最后的结果是: 1.732051503216
取为:1.73205
当初值为-2时。
次数: 1
x_k: 1.7079058866077501
x_(k+1): 1.728670273791
次数: 2
x_k: 1.731595007775
x_(k+1): 1.73198968899375
次数: 3
x_k: 1.7320426599749998
x_(k+1): 1.7320497615377501
最后的结果是: 1.7320497615377501
取为:1.73205
取其结果值:1.73205
4)对于:
初始值是:2.0时,
最后的结果是: 1.7320508075688879
取为:1.7205
初始值是:-2.0时,
最后的结果是: -1.7320508075688879
取为:-1.73205
网友评论