目录
目录
前言
本章节讲的是另一种基础的求解方程的方法,不定点迭代法。
(一)不定点迭代法的分析
1.定义:
一般地,为了求解非线性方程:
\[ f(x)=0 \] 将其转换为等价的形式:\[ x = \varphi(x) \] 其中$\varphi(x) $ 称为迭代函数。由于(1)与(2)具有相同的解:则构造迭代公式有:
\[ x_{k+1} = \varphi(x_k), k=0,1,2··· \] 给定初值\(x_0\) ,并且\(\varphi(x)\) 是连续函数,则有:\[ x^* = \lim_{k \to \infty} x_{k+1} = \lim_{k \to \infty} \varphi(x_{k})= \varphi(\lim_{k \to \infty} x_{k}) = \varphi(x^*) \]可得\(x^*\) 是方程的(4)的解,也是方程(1)\(f(x)=0\) 的解。
上面的方法就称为:不定点迭代法
2.条件:
- \(\varphi(x)\) 在[a,b]内连续,在(a,b)内可导。
- 对于任意的\(x \in [a,b]\) ,则有\(\varphi(x) \in [a,b]\)
- 在[a,b]内,存在一个常数L(0<L<1),使得\(|\varphi\prime(x)|\leq L < 1\),局部收敛
3.思想:
在收敛函数的前提下,不断的逼近真实值,直到满足我们的精度要求。
如下图,我们可以看到,给定初始值\(p_0\)后,经过几次的迭代,取值P很逼近两函数的交点,也就是方程的解。
4.误差:
要使\(x^*-x_k \leq \varepsilon\) ,只需要\(|x_{k+1}-x_k| \leq \varepsilon\)
即可以用迭代前后两次的近似根的绝对值大小,来判断\(x_k\)使否满足精度要求,从而终止迭代的条件。
(二)代码实现
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)不定点迭代法:
""" 不定点迭代法,不断的逼近求解的方法"""from my_math.func_math import fevaldef 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 resultif __name__ == '__main__': item_fun("1+1/(x**2)", 1.45, 10**-15) # 最后的结果是: 1.4655713791984073
(三)案例演示
1.求解:\(f(x)=x^3-x-1=0\)
(1)迭代函数的选择
将\(f(x)\)转化为等价的两种形式
\[ x=\varphi_1(x)=\sqrt[3]{x+1} \]
\[ x = \varphi_2(x)=x^3-1 \]
1)\(f(x)\) 的图像:
可知,其在1.2~1.4之间有解决。
2)\(\varphi_1(x)=\sqrt[3]{x+1}\) 的图像:
函数收敛,取其初始值是:1.4
3)\(\varphi_2(x)=x^3-1\)的图像:
函数不收敛,不满足要求。
(2)运行结果
1)对于\(x=\varphi_1(x)=\sqrt[3]{x+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)对于\(x = \varphi_2(x)=x^3-1\)有:
函数不收敛
最后的结果是: None2.求解:\(f(x)=x^3-x^2-1=0\)
(1)函数的选择
将函数转化为下面几种等价的形式
\[ x=\varphi(x_1)=1+\frac{1}{x^2} \]
\[ x=\varphi(x_2)=\sqrt[3]{1+x^2} \]
\[ x=\varphi(x_3)=\frac{1}{\sqrt{x-1}} \]
\[ x=\varphi(x_4)=\sqrt{x^3-1} \]
\[ x=\varphi(x_5)=\frac{1}{x^2-x} \]
\(f(x)\) 的图像可知,其在1.0~1.5之间有根。
(2)运行结果
要求其误差是:不超过10^-5
初始值是:1.5
1)对于\(\varphi(x_1)=1+\frac{1}{x^2}\)
次数: 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)对于\(\varphi(x_2)=\sqrt[3]{1+x^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)对于\(\varphi(x_3)=\frac{1}{\sqrt{x-1}}\)
函数不收敛
最后的结果是: None取其结果是:无
4)对于\(\varphi(x_4)=\sqrt{x^3-1}\)
函数不收敛
最后的结果是: None取其结果是:无
5)对于\(\varphi(x_5)=\frac{1}{x^2-x}\)
函数不收敛
最后的结果是: None取其结果是:无
3.求解:\(f(x) = x^2-3=0\)
(1)函数的选择
将函数转化为下面几种等价的形式
\[ x = \varphi(x_1)=x^2+x-3 \]
\[ x = \varphi(x_2)=\frac{3}{x} \]
\[ x=\varphi(x_3)=x-\frac{1}{4}(x^2-3) \]
\[ x=\varphi(x_4)=\frac{1}{2}(x+\frac{3}{x}) \]
\(f(x)\)的图像
可知,函数有两个根,其在-2与2附近之间有根。
(2)运行结果
要求其误差是:不超过10^-5
初始值是:-2与2
1)对于:\(\varphi(x_1)=x^2+x-3\)
函数不收敛
最后的结果是: None取其结果值:无
2)对于:\(\varphi(x_2)=\frac{3}{x}\)
函数不收敛
最后的结果是: None取其结果值:无
3)对于:\(\varphi(x_3)=x-\frac{1}{4}(x^2-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)对于:\(\varphi(x_4)=\frac{1}{2}(x+\frac{3}{x})\)
初始值是:2.0时,
最后的结果是: 1.7320508075688879
取为:1.7205
初始值是:-2.0时,
最后的结果是: -1.7320508075688879
取为:-1.73205