解x=g(x)的简单迭代法
- 格式:ppt
- 大小:836.50 KB
- 文档页数:15
迭代法求解⽅程(组)的根⾸先,迭代法解⽅程的实质是按照下列步骤构造⼀个序列x0,x1,…,xn,来逐步逼近⽅程f(x)=0的解:1)选取适当的初值x0;2)确定迭代格式,即建⽴迭代关系,需要将⽅程f(x)=0改写为x=φ(x)的等价形式;3) 构造序列x0,x1,……,xn,即先求得x1=φ(x0),再求x2=φ(x1),……如此反复迭代,就得到⼀个数列x0, x1,……,xn,若这个数列收敛,即存在极值,且函数 φ(x)连续,则很容易得到这个极限值,x*就是⽅程f(x)=0的根。
举个例⼦:求解⽅程: f(x) =x^3-x-1=0 在区间 (1,1.5)内的根。
⾸先我们将⽅程写成这种形式:⽤初始根x0=1.5带⼊右端,可以得到这时,x0和x1的值相差⽐较⼤,所以我们要继续迭代求解,将x1再带⼊公式得直到我们我们得到的解的序列收敛,即存在极值的时候,迭代结束。
下⾯是这个⽅程迭代的次数以及每次xi的解(i=0,1,2....)我们发现当k=7和8的时候,⽅程的解已经不再发⽣变化了,这时候我们就得到了此⽅程的近似解。
1#define eps 1e-82int main()3{4x0=初始近似根;5do{6x1=x0;7x0=g(x1); //按特定的⽅程计算新的近似根8}while(fabs(x0-x1)>eps);9printf("⽅程的近似根是%f\n",x0);10}注意:如果⽅程⽆解,算法求出的近似根序列就不会收敛,那么迭代过程就会变成死循环。
因此,在使⽤迭代算法前应先考察⽅程是否有解,并在算法中对迭代次数给予限制。
下⾯再写⼀个求解⽅程组的例⼦加深⼀下理解:算法说明:⽅程组解的初值X=(x0,x1,…,xn-1),迭代关系⽅程组为:xi=gi(X)(i=0,1,…,n-1),w为解的精度,maxn为迭代次数。
算法如下:算法核⼼:1int main()2{3for(i=0; i<n; i++)4x[i]=初始近似根;5do6{7k=k+1;8for(i=0; i<n; i++)9y[i]=x[i];10for(i=0; i<n; i++)11x[i]=gi(X); //按特定的⽅程计算新的近似根12c=0;13for(i=0; i<n; i++)14c=c+fabs(y[i]-x[i]);//c要每次重新设初值为015}while(c>eps and k<maxn );16for(i=0; i<n; i++)17print("变量的近似根是",x[i]);18}选取初始向量精确度为1e-8,迭代次数为100求解代码如下:1#include<iostream>2#include<cstdio>3#include<cstring>4#include<cmath>5#define eps 1e-86using namespace std;7const int maxn=100;8double x[10],y[10];9int main()10{11for(int i=1;i<=4;i++)12x[i]=0;13int cnt=0;14double c=0;15do{16for(int i=1;i<=4;i++)17y[i]=x[i];18for(int i=1;i<=4;i++)19{20x[1]=(6+x[2]-2*x[3])/10;21x[2]=(25+x[1]+x[3]-3*x[4])/11;22x[3]=(-11-2*x[1]+x[2]+x[4])/10;23x[4]=(15-3*x[2]+x[3])/8;24}25c=0;26for(int i=1;i<=4;i++)27c+=(fabs(y[i]-x[i]));28}while(c>eps&&cnt<maxn);29for(int i=1;i<=4;i++)30printf("x%d = %.4lf\n",i,x[i]);31}运⾏结果如下:迭代法求解⽅程的过程是多样化的,⽐如⼆分逼近法求解,⽜顿迭代法等。
不动点迭代格式
不动点迭代格式是将不动点迭代法公式进行变形得到的形式。
具体来说,不动点迭代法是为了求方程组的根,其等价形式为 x=g(x),迭代形式为
xk+1=g(xk)。
将不动点迭代法应用到求解∇f(x)=0,就是在求极值点。
例如,对于求解∇f(x)=0,将其改造成 x=g(x) 的形式,得到
∇f(x)=0⇒x=x−α(x)∇f(x),其中α(x):Rd→R。
这个公式可以对应梯度下降法。
此外,不动点迭代格式还可以通过不同的变形适用于不同的问题。
例如,在凸优化问题中采用不同的迭代格式可以得到不同的算法,如共轭梯度法等。
以上内容仅供参考,如需更多信息,建议查阅不动点迭代法的相关书籍或论文。
2 迭代法2.1 迭代法的一般概念迭代法是数值计算中一类典型方法,不仅用于方程求根,而且用于方程组求解,矩阵求特征值等方面。
迭代法的基本思想是一种逐次逼近的方法。
首先取一个精糙的近似值,然后用同一个递推公式,反复校正这个初值,直到满足预先给定的精度要求为止。
对于迭代法,一般需要讨论的基本问题是:迭代法的构造、迭代序列的收敛性天收敛速度以及误差估计。
这里,主要看看解方程迭代式的构造。
对方程(1.1),在区间],[b a 内,可改写成为:)(x x ϕ= (2.1)取],[0b a x ∈,用递推公式:)(1k k x x ϕ=+, Λ,2,1,0=k(2.2)可得到序列:∞==0210}{,,,,k k k x x x x x ΛΛ(2.3) 当∞→k 时,序列∞=0}{k k x 有极限x ~,且)(x ϕ在x ~附近连续,则在式(2.2)两边极限,得,)~(~x x ϕ=即,x ~为方程(2.1)的根。
由于方式(1.1)和方程(2.1)等价,所以,x x ~*= 即,*lim x x k k =∞→ 式(2.2)称为迭代式,也称为迭代公式;)(x ϕ可称为迭代函数。
称求得的序列∞=0}{k k x为迭代序列。
2.2 程序和实例下面是基于MATLAB 的迭代法程序,用迭代格式)(1n n x g p =+,求解方程)(x g x =,其中初始值为0p 。
**************************************************************************function[p,k,err,P]=fixpt(f1021,p0,tol,max1)% f1021是给定的迭代函数。
% p0是给定的初始值。
% tol 是给定的误差界。
% max1是所允许的最大迭代次数。
% k 是所进行的迭代次数加1。
% p 是不动点的近似值。
% err 是误差。
% P = {p1,p2,…,pn}P(1) = p0;for k = 2:max1P(k) = feval('f1021', P(k-1));k, err = abs(P(k) - P(k-1))p = P(k);if(err<tol),break;endif k == max1disp('maximum number of iterations exceeded');endendP=P;****************************************************************************例2.1 用上述程序求方程0sin 2=-x x 的一个近似解,给定初始值5.00=x ,误差界为510-。
计算底点纬度Bf的数值迭代算法作者:吴琼烟来源:《新教育时代》2015年第12期摘要:本文研究了不动点迭代法、斯特芬森迭代法、牛顿-瑞弗森迭代法和割线法等四种数值迭代算法及其在底点纬度计算中的应用,并用MATLAB软件予以实现。
将数值迭代算法结果与经典算法结果进行比较,结果表明:利用数值迭代算法求解底点纬度,简单易行,准确可靠。
关键词:底点纬度数值迭代算法 MATLAB根据子午线弧长反求底点纬度Bf 是椭球大地测量学中的一项重要内容,是高斯投影坐标反算的基础。
底点纬度是高斯反算过程中一个重要的中间变量,当参数Bf 的值确定之后,接下来高斯投影反算的过程就变得非常简单了,从某种程度上讲,高斯投影坐标反算过程的关键就在于求出底点纬度Bf 的值。
底点纬度的求解本质上讲就是一个非线性方程的求根问题,数值分析中对此类问题有成熟的计算方法,即数值迭代算法,同时借助于计算机程序设计进行计算,可得到准确的数值解,涉及的数学技巧较少,简单易行,准确可靠。
一、计算底点纬度的经典算法由子午线弧长反求底点纬度是由纬度值计算子午线弧长的逆问题,下面首先对子午线弧长计算的经典算法进行介绍,在此基础上再对计算底点纬度的经典算法进行说明。
1.子午线弧长计算的经典算法大地测量学经典教材[1]给出了计算子午线弧长的基本公式:从赤道到大地纬度为B处的子午线弧长为(1)式中,M为子午线曲率半径,a为椭球长半轴,e为椭球第一偏心率。
对于(1)式而言,由于被积函数结构复杂,其原函数无法求出,故不能直接用牛顿-莱布尼茨积分进行计算。
在经典教材中,采用近似解析法,即把被积函数M按照牛顿二项式定理展开为e的幂级数,并将正弦的幂函数展开为余弦的倍数函数,然后逐项进行积分,考虑到计算结果的目的和精度,得到以下两个实用计算公式:(2)(3)(4)(5)2.底点纬度计算的经典算法已知从赤道到某点处的子午线弧长X,计算该点的大地纬度Bf ,即为底点纬度计算。