【算法设计zxd】第3章 求解方程的近似算法 非线性——二分法(穿根),牛顿法(切线),线性代数

目录

非线性方程:

非线性方程的收敛性和收敛速度:

 建立迭代方程

【例3-5】求9x^2-sin x-1=0,在(0,1)之间的解,要求| 9x^2-sin x-1|<0.00001。

二分法:(穿根法)

 二分法的时间渐近复杂度分析

【例3-5】求9x^2-sin x-1=0,在(0,1)之间的解,要求| 9x^2-sin x-1|<0.00001。

牛顿法--有点儿化曲为直那意思

线性代数方程:

 【例3-8】求下列解线性方程组的解


非线性方程:

非线性方程的收敛性和收敛速度:

定义 3.1 x_k是方程 f(x) =0 的根,若存在 x k 的一个邻域 Δ,当 初值属于 Δ时,迭代收敛,则称该迭代过程具有局部收敛性
定义3.2 设 \varepsilon _{k} = x^{*} - x _{k}第k次迭代的迭代误差,若 【第k+1次迭代误差 与 第k次迭代误差的p次方 同阶。】
则称迭代是 p阶收敛的。称c 渐近误差常数
定义 3.3 EI = p ^{\frac{1}{\Theta }} 效率指数,其中,θ表示每次迭代的 计算量 p 表示迭代的收敛阶
定理 3.1 若当 x [a, b] 时, φ(x) [a, b] ,且 φ(x)满足 |φ’(x)| ≤ L<1, x [a, b]
则迭代收敛于唯一的根。

建立迭代方程

(1) 选取适当的初值 x 0
(2) 建立迭代方程,将方程 f(x)=0 转换成 x=φ(x)的等 价形式。
(3) 运用迭代方程 x=φ(x) ,反复计算,如x_1 = \Phi ( x_0 ), x_2= \Phi (x_1),.. ,x_n=\Phi (x_{n-1}),得到 x的序列,若该数列收敛 ,则最终可以得到满足一定精度 ε 的解,即有|x _{n}-x _{n-1}|<\varepsilon 有时候也会用 f(x_ n )<= ε f(x_ n )=0 来判断。

【例3-5】求9x^2-sin x-1=0,在(0,1)之间的解,要求|9x^2-sin x-1|<0.00001

问题分析

超越方程没有通用公式,移项建立迭代方程
(1) x=(sin x +1)^{1/2} /3   //从x^2解
(2) x=arc sin(9*x*x-1)         //从sinx解       不收敛

 计算模型:

算法设计与描述算法分析
输入:x
输出: x0

迭代方程:

equation(x):

{

        x1 <- x; x0 <- 0;

        while( | x1- x0| >0.00001 )

        {

                x0 <- x1;

                x1 <- sqrt ( sin(x0) +1) /3 ;
        }

        return  x0;

}

(1)若 x0=0.4 ,经测试达到精度0.00001,需要迭代的次数6次,xi = 0.391849
(2) x 0 =0.5, 经测试达到精度 0.00001,需要迭代的次数 为 7 次, x i = 0.391851

二分法:

equationD (x1,x2)

{

        f1 <-  9*x1*x1 - sin(x1)-1;

        f2 <- 9*x2*x2 - sin(x2)-1;

        f <- 1;

        if( f1*f2 < 0 )

        {

                while ( | x - x3 | > 0.00001)

                {

                        x <- ( x1+x2)/2;        //中点

                        f <- 9*x*x - sin(x)-1;

                        if(f==0)break;

                        if(f*f1>0)         //不在里面,从(x,x2)

                        {

                                x3=x1; //x3是上一次的x值

                                f1=f;

                                x1=x;

                        }

                        else //在里面 (x1,x)

                        {

                                x3=x2;

                                x2=x;

                        }

                } 

        }

}

(1) x 1 =0,x 2 =0.4, 
代入 k≥(ln(b-a)-lnε)/ln2 -1得 k≥14.287712
经测试,当 x i =0.391852 ,达到所要求精度 0.00001所迭代的次数为 17 次。
(2) x 1 =0,x 2 =0.5
代入 k≥(ln(b-a)-lnε)/ln2 -1得 k≥14.6096
经测试,当 x i =0.391853 ,达 到所要求精度 0.00001所迭代 的次数为 17 次。

牛顿法:
计算模型:

 equationN (x)

{

        x1 <- x;

        x2 <- x1 - (9*x1*x1 -sin(x1) -1) / (18*x1 - cos(x1));

        while( |x1-x2 | > 0.00001 )

        {

                x1 <- x2;

                x2  <- x1- (9*x1*x1 -sin(x1) -1)/(18*x1-cos(x1)) ;

        }

        return x2;

}

算法测试
(1) x 1 =0.4, 经测试 ,x=0.391847
时,达到所要求精度 0.00001
迭代的次数为 7 次。
(2) x 1 =0.5, 经测试 ,x=0.391847
时,达到所要求精度 0.00001
迭代的次数为 3 次。

二分法:(穿根法)

f(x) 在区间 [a, b]上连续,则在此区间上任取两点 x 1 x 2 ,若 f(x 1 )*f(x 2 )<0,则在(x 1 ,x 2 )间必有解。
其求解步骤为:
(1)f(x 1 )*f(x 2 )<0 ,方程有解,继续 (2) ,否则无解;
(2) x=(x 1 +x 2 )/2 ,代入方程 f(x)=0 ,则 x即为所求, 算法结束。否则进行 (3)
(3)f(x 1 )*f(x)<0 ,与 x 2 同侧令 x 2 =x ,若 f(x1)*f(x)>0, 则与 x 1 同侧,令 x 1 =x ,继续步骤 (2)

二分法的时间渐近复杂度分析

设根在区间[a _{k},b _{k}],取x _{k}=(a _{k} + b _{k} ) /2 作为根的一 个近似,按上述算法框架,不断二分,则可以获 得一个近似根的序列 {x 0 ,x 1 ,x 2 ,…,x k },该序列必以根 x * 为极限。
那么,误差可以表示为: \large |x ^{*}-x _{k} | \leq (b _{k} - a _{k})/2 = (b-a)/2 ^{k+1}
对于给定精度 ε ,只需取 k 满足\large (b-a)/2 ^{k+1}  ≤ ε,可 得 k ≥ (ln(b-a)-lnε) / ln2 -1
计算模型:
 

牛顿法--有点儿化曲为直那意思

设待解方程为 f(x) ,其一个解为 x
设过点 (x 0 ,y 0 ) 的切线斜率为 f ’(x 0), 则其切线方程为: f(x)=f(x 0 )+f ’(x 0 )(x-x 0 )
当其与 x 轴相交时,f(x)=0。则可得到 x=x 0 -f(x 0 )/f ’(x 0 )
上式可以做为迭代公式,反复使 用,求出迭代数列 x 1 ,x 2 ,…, x n,直到 满足精度为止。

 牛顿法的时间复杂度分析

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值