[数值分析]不动点迭代法求解非线性方程

Promble1

求出 f(x)=3x2ex=0 f ( x ) = 3 x 2 − e x = 0 的根,精确到小数点后的第4位。


首先我们利用matlab绘图确定出根的大致区域。
[数值分析]不动点迭代法求解非线性方程_第1张图片
由图可知存在三个有根区间 [1,0],[0,1],[3,4] [ − 1 , 0 ] , [ 0 , 1 ] , [ 3 , 4 ]


Step1 S t e p 1
利用不动点迭代法计算区间 [1,0] [ − 1 , 0 ] 上存在的根。

f(x)=3x2ex(1.1) (1.1) f ( x ) = 3 x 2 − e x

建立迭代方程
g(x)=±ex3(1.2) (1.2) g ( x ) = ± e x 3

g(x)=2lnx+ln3(1.3) (1.3) g ( x ) = 2 ln ⁡ x + ln ⁡ 3

对于式 (1.2) ( 1.2 ) 分析其在区间[-1,0]之间迭代的收敛性。

g(x)=36ex(1.4) (1.4) g ′ ( x ) = 3 6 e x

|g(x)| | g ′ ( x ) | 在区间[-1,0]上是递增的,则 |g(x)||g(1)|<12<1 | g ′ ( x ) | ≤ | g ′ ( 1 ) | < 1 2 < 1 ,于是是满足收敛性。
由于要求 1g(x)0 − 1 ≤ g ( x ) ≤ 0 ,于是取 g(x)=ex3 g ( x ) = − e x 3 。进行迭代得到 xk x k 序列。

代码

#include
using namespace std;
double fun(double x) {
    return -sqrt(exp(x)/3.0);
}
int main()
{
    double l = 1,r = 0;
    int t = 0;
    while(fabs(r - l) >= 0.000001) {
        l = r;
        r = fun(r);
        printf("第%d次迭代:%.6f\n",++t,r);
    }
    return 0;
}

结果
[数值分析]不动点迭代法求解非线性方程_第2张图片


然后我们考虑一下式子 (1.4) ( 1.4 ) 的收敛性。

g(x)=2x g ′ ( x ) = 2 x

显然不满足印内性,因为 g(1)=2<1 g ′ ( − 1 ) = − 2 < − 1


Step2 S t e p 2

你可能感兴趣的:(数值分析)