非线性方程的简单迭代法和Steffensen迭代法
- 格式:doc
- 大小:124.50 KB
- 文档页数:7
非线性方程牛顿迭代法与斯特芬森迭代法的研究与比较非线性方程牛顿迭代法与斯特芬森迭代法的研究与比较申林坚(南昌航空大学 测试与光电工程学院 江西 南昌 330063)摘要:本文针对一个具体的非线性方程032=-x e x 进行研究,首先作出了了函数xe x xf -=23)(的图像,大体判定其零点(即方程解)在(3,4)区间内, 接着用牛顿迭代法和斯特芬森迭代法进行求解分析,牛顿法的迭代公式为)()(1k k k k x f x f x x '-=+, 斯特芬森迭代法公式为),(),(,2)(21k k k k kk k k k k k y z x y x y z x y x x ϕϕ==+---=+记录两种方法求得指定精度解所需迭代次数及所需计算时间,并对其优缺点 进行了分析。
关键词:非线性方程;牛顿迭代法;斯特芬森迭代法引言非线性是实际问题中经常出现的,并且在科学与工程计算中的地位越来越重要,很多我们熟悉的线性模型都是在一定条件下由非线性问题简化得到的,为得到更符合实际的解答,往往需要直接研究非线性模型,从而产生非线性科学,它是21世纪科学技术发展的重要支柱。
本论文通过对特定非线性方程032=-x e x 进行求解,介绍了两种常用的迭代法牛顿迭代法和斯特芬森迭代法,详尽阐述了其各自的数学几何原理及优缺点比较,从而更深入的理解非线性方程的迭代法求解。
正文一.作出)(x f 的图像,确定隔根区间 在Matlab 中输入以下指令并回车:x=(-10:0.001:10); y=3*x.^2-exp(x); plot(x,y);grid on ;-10-8-6-4-202468104图1得到图1所示)(x f 的图像,易知,当10-<x 及10>x 时,)(x f 无零点 将y 轴方向放大,输入命令axis([-10 10 -2 2]),得到图2-10-8-6-4-20246810-2-1.5-1-0.500.511.52图2可知函数有三个零点,隔根区间为(-2,0),(0,2),(2,4) 将x 轴方向放大,输入命令axis([-2 4 -2 2]),得到图3-2-101234-2-1.5-1-0.500.511.52图3可将隔根区间进一步缩小为(-1,0),(0,1),(3,4)二.牛顿迭代法求区间(3,4)中的根对于方程0)(=x f ,如果)(x f 是线性函数,则它的求根是容易的。
⾮线性⽅程求解基于MATLAB的⾮线性⽅程的五种解法探讨摘要:本⽂利⽤matlab软件对⾮线性⽅程解法中的⼆分法、简单迭代法、⽜顿法、割线法以及Steffensen法的数值分析⽅法的算法原理及实现⽅法进⾏了探讨。
对f x x x=+-()2ln2的零点问题,分别运⽤以上五种不同的⽅法进⾏数值实验,⽐较⼏种解法的优缺点并进⾏初步分析评价。
关键词:⼆分法、简单迭代法、⽜顿法、割线法、Steffensen法1、引⾔在很多实际问题中,经常需要求⾮线性⽅程f(x) =0的根。
⽅程f(x) =0的根叫做函数f(x)的零点。
由连续函数的特性知:若f(x)在闭区间[a,b ]上连续,且()()0f a f b<.则f(x) =0在开区间(a,b)内⾄少有⼀个实根。
这时称[a,b]为⽅程f(x) =0的根的存在区间。
本⽂主要对⾮线性⽅程的数值解法进⾏分析,并介绍了⾮线性⽅程数值解法的五种⽅法。
并设=+-.f x x x()2ln2f x在[1,2]上的图形,如图1:. 显然,函数在[1,2]之间有⼀个零点。
⾸先画出()2、计算机配置操作系统Windows 7 旗舰版内存2GB处理器AMD 4核 A6-3400M APU 1.4GHz图.13、⼆分法⼆分法的基本思想是将⽅程根的区间平分为两个⼩区间,把有根的⼩区间再平分为两个更⼩的区间,进⼀步考察根在哪个更⼩的区间内。
如此继续下去,直到求出满⾜精度要求的近似值。
设函数()f x 在区间[a,b ]上连续,且f(a)·f(b) <0,则[a,b ]是⽅程f(x) =0的根的存在区间,设其内有⼀实根,记为x*。
取区间[a,b ]的中点()2k a b x +=并计算1()f x ,则必有下列三种情况之⼀成⽴: (1) 1()f x =0,x1就是⽅程的根x*;(2)()f a .1()f x <0,⽅程的根x*位于区间[a, 1x ]之中,此时令111,a a b x ==; (3)1()f x .()f b <0,⽅程的根x*位于区间[1x ,b ]之中,此时令11a x =,1b b =。
实验报告一:实验题目一、 实验目的掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。
二、 实验内容1、编写二分法、并使用这两个程序计算02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 410- ,比较两种方法收敛速度。
2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。
3、由中子迁移理论,燃料棒的临界长度为下面方程的根,用牛顿迭代法求这个方程的最小正根。
4、用牛顿法求方程的根,精确至8位有效数字。
比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。
第1题:02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。
画图函数:function Test1()% f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0r = 0:0.01:1;y = r + exp(r) - 2plot(r, y);grid on 二分法程序:计算调用函数:[c,num]=bisect(0,1,1e-4)function [c,num]=bisect(a,b,delta)%Input –a,b 是取值区间范围% -delta 是允许误差%Output -c 牛顿迭代法最后计算所得零点值% -num 是迭代次数ya = a + exp(a) - 2;yb = b + exp(b) - 2;if ya * yb>0return;endfor k=1:100c=(a+b)/2;yc= c + exp(c) - 2;if abs(yc)<=deltaa=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif abs(b-a)<deltanum=k; %num为迭代次数break;endendc=(a+b)/2;err=abs(b-a);yc = c + exp(c) - 2;牛顿迭代法程序:计算调用函数:[c,num]=newton(@func1,0.5,1e-4) 调用函数:function [y] = func1(x)y = x + exp(x) - 2;end迭代算法:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;%num为迭代次数break;endendc=p0;第2题:由题意得到算式:计算调用函数:[c,num]=newton(@func2,0.02,1e-8)程序:先用画图法估计出大概零点位置在0.02附近。
第4章 非线性方程与非线性方程组的迭代解法--------学习小结一、本章学习体会本章我们主要学习了非线性方程的几种解法,主要有对分法、简单迭代法、steffensen 迭代法、Newton 法、割线法等。
这几种方法都有其思想,并且它们的思想彼此之间有一定的联系。
本章的思路大致可以理解为:1.如何选取迭代公式;2.如何判断迭代公式的收敛速度;3.如何进行迭代公式的修正,以加速收敛;4.如何选取最适合的迭代方法 。
二、本章知识梳理具体求根通常分为两步走,第一步判断根是否存在,若存在,确定根的某个初始近似值;第二步,将初始近似值逐步加工成满足精度要求的结果。
求初始近似值,即确定根的大致区间(a, b ),使(a, b )内恰有方程的一个根。
本章的学习思路:针对一种迭代方法,找出迭代公式,并判断其收敛性,一般选取收敛速度最快的迭代公式,所以自然的提出了如何使收敛加速的问题。
4.1非线性方程的迭代解法非线性方程的迭代解法有:对分法、简单迭代法、steffensen 迭代法、Newton 法、割线法等。
4.1.1对分法设()[]()()0,<∈b f a f b a C x f 且,根据连续函数的介值定理,在区间()b a ,内至少存在有一个实数s ,使()0=s f 。
现假设在()b a ,内只有一个实数s ,使()0=s f 并要把s 求出来,用对分法的过程: 令b b a a ==00, 对于M k ,....,2,1,0=执行计算2kk k b a x +=若()ηε≤≤-k f a b k k 或,则停止计算取k x s ≈否则转(3)()()k k k k k k b b a a a f x f ==<++11,,0则令()()k k k k k k b b x a a f x f ==>++11,,0则令 若M k =则输出M 次迭代不成功的信息;否则继续。
对分法的局限:对分法只能求实根,而且只能求单根和奇数重根,不能求偶数根和复数根4.1.2简单迭代法及其收敛性迭代法是一种逐次逼近法,用某个固定公式反复校正根的近似值,使之逐步精确化,最后得到满足精度要求的解。
《数值计算方法》实验报告实验名称:实验1 非线性方程的简单迭代法和Steffensen 迭代法 实验题目:分别用简单迭代法和Steffensen 迭代法求方程 010423=-+x x在 [1, 2] 的一个实根.实验目的:理解并掌握简单迭代法和Steffensen 迭代法 基础理论:简单迭代法和Steffensen 迭代法1).简单迭代法的原理:将一元非线性方程:0)(=x f 改写成等价方程:)(x x ρ= ,对此,从某个初始值x0开始,对应式)(x x ρ= 构成迭代公式 ,...1,0),(1==+k x x k k ρ ,这样就可以确定序列 {}k x (k=0,1,2…)。
如果 {}k x 有极限*lim x x k k =∞→ ,由式 ,...1,0),(1==+k x x k k ρ 两边取极限可得 )(**x x ρ= ,可知 *x 为方程0)(=x f 的近似解。
2)Steffensen 迭代法的原理:通过把改进的Aitken 方法应用于根据不动点迭代所得到的线性收敛序列,将收敛速度加速到二阶。
()⎪⎪⎪⎩⎪⎪⎪⎨⎧+---===+k k k k k k k k k k k x y z x y x x y z x y 2)()(21ρρ[]x x x x x x x +---=)(2)(()()(2ρρρρψ实验环境:操作系统:Windows 7;实验平台:Turbo C++实验过程:写出算法→编写程序→调试运行程序→计算结果1)简单迭代法的算法:Input:初始近似值x0,精度要求del,最大迭代次数NOutput:近似解x 或失败信息1. n ←12. While n≤N do;3. x ←f(x0);4. if | x-x0|<del then5. | return x;6. end7. n←n+1;8. X0←x;9. End10. return False;// 超出最大迭代次数2)Steffensen迭代法的算法:Input : 区间端点a,b;精度要求del;最大迭代次数N Output:近似解或失败信息1. n←12. while n ≤N do;3. y←f(x0);4.z←f(y);5.x←x0-()202xyzxy+--;6.If |x-x0|<del then;7.| return x;8.end9.n←n+1;10.x0←x;11.end12.return False;实验结果a,用简单迭代法计算的结果结果约为1.365230b.用Steffensen迭代法计算的结果:近似解为:1.365230给出程序:1,简单迭代法的程序(C++)#include "stdio.h"#include "math.h"#define phi(x) 0.5*sqrt(10-x*x*x)void main(){int n=1,N;float x,x0,del;printf("x0="); scanf("%f",&x0); printf("\ndel=:"); scanf("%f",&del); printf("\nN="); scanf("%d",&N);printf("\nk x(k)");printf("\n %2d %f ",0,x0);while (n<N){ x=phi(x0);if(fabs(x-x0)<del){ printf("\n \n=近似解= %f \n",x);return;}printf("\n %2d %f ",n,x0);n=n+1; x0=x;}printf("\n \n%d次迭代后未达到精度要求.\n",N); }2,Steffensen迭代法的程序(C++)#include "stdio.h"#include "math.h"#define phi(x) 0.5*sqrt(10-x*x*x);void main(){int n=1,N;float x,x0,del,y,z,a,b;printf("x0="); scanf("%f",&x0);printf("\ndel=:"); scanf("%f",&del);printf("\na="); scanf("%f",&a);printf("\nb="); scanf("%f",&b);printf("\nN="); scanf("%d",&N);printf("\nk x(k)");printf("\n %2d %f ",0,x0);while (n<N){ y=phi(x0);z=phi(y);x=x0-(y-x0)*(y-x0)/(z-2*y+x0);if(fabs(x-x0)<del){ printf("\n \n=近似解= %f \n",x);return;}printf("\n %2d %f ",n,x0);n=n+1; x0=x;}printf("\n \n%d次迭代后未达到精度要求.\n",N);}结果分析:1.用简单迭代法和Steffensen迭代法都能求出非线性方程的近似解,且用简单迭代法和Steffensen迭代法求出的近似解基本一样。
Steffensen迭代法是一种重要的数值计算方法,它在数值分析领域有着广泛的应用。
该方法通过迭代逼近函数的根,是一种高效、稳定的求解非线性方程的工具。
Steffensen迭代法基于不动点理论,通过构造一个逐步逼近根的序列来求解方程。
它的基本思想是利用函数在某一点的局部线性逼近来逼近根的位置。
具体来说,我们从一个初始值开始,通过对函数进行局部线性逼近,计算出一个新的逼近值。
然后,我们再次对函数进行局部线性逼近,得到一个更接近根的新的逼近值。
通过不断迭代,我们可以逐步逼近方程的根。
Steffensen迭代法的迭代公式为:\[ x_{n+1} = x_n - \frac{{(f(x_n))^2}}{{f(x_n+f(x_n))-f(x_n)}} \]其中,\( x_n \) 是第n次迭代的逼近值,\( f(x) \) 是需要求根的函数。
与其他迭代方法相比,Steffensen迭代法具有较快的收敛速度和较高的精度。
它适用于求解各种非线性方程,包括多项式方程、三角函数方程、指数函数方程等。
在实际应用中,Steffensen迭代法常被用于求解方程的根,特别是当方程的根位于某一区间内时,该方法的效果更加显著。
然而,Steffensen迭代法也存在一些限制。
首先,该方法对初始值的选择较为敏感,不同的初始值可能导致迭代结果的差异。
其次,当方程的根位于奇点附近时,该方法可能出现发散现象。
因此,在应用Steffensen迭代法时,我们需要对问题进行合理的分析和判断,选择合适的初始值,以获得准确的迭代结果。
总之,Steffensen迭代法是一种重要的数值计算方法,它通过逐步逼近函数的根,高效、稳定地求解非线性方程。
在实际应用中,我们可以根据具体问题的需求选择合适的初始值和迭代次数,以获得较为精确的解。
迭代法——非线性方程与方程组的数值解法7.1方程求根与二分法二分法,取中点判断左右区间[a,b]-----x 0=(b+a)/2---f(x0)是否为0是:零点为x 0;否,f(x 0)与f(a)同号,则x 0取代a ;f(x 0)与f(b)同号,则x 0取代b 重新计算区间;7.2不动点迭代法及其收敛性不动点:将f(x)=0写成隐式x=φ(x),若x*满足f(x*)=0,则x*=φ(x*) ;反之亦然,则x*为函数φ(x)的一个不动点。
迭代函数:φ(x)选初值x 0,x 1=φ(x 0)……有x k+1=φ(x k ),k=0,1,2….。
lim k→∞x k =x ∗等价于{xk}等价于迭代方程收敛不动点存在性: φ(x)在[a,b]区间内满足:(1)任意∀x ϵ[a,b],有a ≤φ(x)≤b ;(2)∃1>L >0,使得∀x ,y ∈ a,b 都有丨∅ x −∅ y 丨≤L 丨x −y 丨; 则φ(x)在[a,b]区间内存在唯一不动点x*收敛误差计算: 丨xk −x ∗丨≤L k1−L 丨x1−x0丨丨xk +1−xk 丨≤L k 丨x1−x0丨丨x ∗−xk 丨≤11−L 丨xk +1−xk 丨局部收敛性:φ(x)在x*的某个领域R :丨x-x*丨≤δ,对任意x0属于R 迭代后产生的{xk }属于R ,且收敛到x*则称为局部收敛。
P 阶收敛:设迭代过程x k+1=φ(x)收敛于方程x=φ(x)的根x*,如果当k →∞,则有迭代误差e k =x k -x*满足渐进关系式:e k +1e k p →C (非零常数)则称迭代过程P 阶收敛。
领域内p 阶收敛:φ(p )在所求根x*的领域内连续,有φ’(x*)=φ”(x*)=…= φ(p-1)(x*)=0;φ(p )(x*)≠0,则在x*领域内p 阶收敛7.3收敛加速法1.艾特金加速收敛法x*=x 2x 0−x 12x 2−2x 1+x 0=x 0−(x 1−x 0)2x 2−2x 1+x 0;x k+1=φ(x k )x k+2=φ(x k+1)X k +1 =x k −(x k +1−x k )2x k +2−2x k +1+x k =x k -(Δx k )2/Δ2x k2.史蒂文森迭代法y k =φ(x k ),z k =φ(y k ),x k+1=x k −(y k −x k )2zk −2y k +x k ,k=0,1,…改写为不动点迭代法:x k+1=Ψ(x k ),k=0,1,…Ψ(x)=x-(φ(x )−x )2φ(φ(x ))−2φ(x )+x若x*为Ψ(x)的不动点,则x*也是φ(x )的不动点;反之,若x*是φ(x )的不动点,当φ”(x)存在, φ’(x)≠1时,x*也是Ψ(x)的不动点; 史蒂文森迭代法是二阶收敛的。
(一)非线性方程的迭代解法1.非线性方程的一般形式:f(x)=02.非线性方程的分类:⎩⎨⎧=为其他函数。
超越方程,次代数多项式;为代数方程,)()(0)(x f n x f x f 3.方程的根:若存在常数s 使f(s)=0,则称s 是方程(4.1)的根,又称s 是函数f(x)的零点。
4.重根:若f(x)能分解为)()()(x s x x f m ϕ-= 则称s 是方程(4.1)的m 重根和f(x)的m 重零点。
当m=1时,s 称为方程(4.1)的单根和f(x)的单零点。
5.结论:(1)零点存在定理:设函数f(x)在闭区间[a,b]上连续,且f(a)•f(b)<0,那么在开区间(a,b )内至少有一点ξ,使f(ξ)=0.(2)根的唯一性判别:一阶导数不变号且不为零(3)n 次代数方程在复数域上恰有n 个根(4)高于4次的代数方程没有求根公式6.方法:(1)搜索根方法:①作图法:②逐步搜索法:确定方程根的范围的步骤:步骤1 取含f(x)=0根的区间[a,b],即f(a)•f(b)<0;步骤2 从a 开始,按某个预定的步长h ,不断地向右跨一步进行一次搜索, 即检查kh a x k +=上的函数)(k x f 值的符号。
若0)()(1<•-k k x f x f ,则可以确定一个有根区间],[1k k x x -.步骤3 继续向右搜索,直到找出[a,b]上的全部有根区间],[1k k x x -(k=1,2,…,n).(2)二分法①基本思想:含根区间逐次分半缩小,得到一个区间长度以1/2的比例减小的含根区间序列 {}k I ,在给定根的误差界时,利用长度趋于零的特点,可得到在某个区间中满足要求的近似根。
②迭代终止的条件ε<)(k x fε2<-k k a b或者ε<-≤-2k k k a b s x(3)简单迭代法及其收敛性)(0)(x x x f ϕ=⇔=,2,1,0),(1==+k x x k k ϕ迭代法是一种逐次逼近法,用某个固定公式反复校正根的近似值,使之逐 步精确化,最后得到满足精度要求的解。
《数值计算方法》实验报告
实验名称:实验1 非线性方程的简单迭代法和Steffensen 迭代法
实验题目:分别用简单迭代法和Steffensen 迭代法求方程
010423=-+x x
在 [1, 2] 内的一个实根.
实验目的:理解并掌握简单迭代法和Steffensen 迭代法
基础理论:简单迭代法和Steffensen 迭代法
1).简单迭代法的原理:将一元非线性方程:0)(=x f 改写成等价方程:)(x x ρ= ,对此,从某个初始值x0开始,对应式)(x x ρ= 构成迭代公式 ,...1,0),(1==+k x x k k ρ ,这样就可以确定序列 {}k x (k=0,1,2…)。
如果 {}k x 有极限
*lim x x k k =∞→ ,由式 ,...1,0),(1==+k x x k k ρ 两边取极限可得 )(**x x ρ= ,可知 *
x 为方程0)(=x f 的近似解。
2)Steffensen 迭代法的原理:
通过把改进的Aitken 方法应用于根据不动点迭代所得到的线性收敛序列,将收敛速度加速到二阶。
()⎪⎪⎪⎩
⎪⎪⎪⎨⎧+---===+k k k k k k k k k k k x y z x y x x y z x y 2)
()(21ρρ
[]x x x x x x x +---=)(2)(()()(2ρρρρψ
实验环境:操作系统:Windows 7;
实验平台:Turbo C++
实验过程:写出算法→编写程序→调试运行程序→计算结果
1)简单迭代法的算法:
Input:初始近似值x0,精度要求del,最大迭代次数N
Output:近似解x 或失败信息
1. n ←1
2. While n ≤N do;
3. x ←f(x0);
4. if | x-x0|<del then
5. | return x;
6. end
7. n ←n+1;
8. X0←x;
9. End
10. return False; ≤()0202
x y z x y +--Steffensen 迭代法计
算的结果:
近似解为:
给出程序:
1,简单迭代法的程序(C++)
#include ""
#include ""
#define phi(x) *sqrt(10-x*x*x)
void main()
{int n=1,N;
float x,x0,del;
printf("x0="); scanf("%f",&x0);
printf("\ndel=:"); scanf("%f",&del); printf("\nN="); scanf("%d",&N);
printf("\nk x(k)");
printf("\n %2d %f ",0,x0);
while (n<N)
{ x=phi(x0);
if(fabs(x-x0)<del)
{ printf("\n \n=近似解 = %f \n",x);
return;
}
printf("\n %2d %f ",n,x0);
n=n+1; x0=x;
}
printf("\n \n%d次迭代后未达到精度要求.\n",N); }
2,Steffensen迭代法的程序(C++)
#include ""
#include ""
#define phi(x) *sqrt(10-x*x*x);
void main()
{int n=1,N;
float x,x0,del,y,z,a,b;
printf("x0="); scanf("%f",&x0);
printf("\ndel=:"); scanf("%f",&del); printf("\na="); scanf("%f",&a);
printf("\nb="); scanf("%f",&b);
printf("\nN="); scanf("%d",&N);
printf("\nk x(k)");
printf("\n %2d %f ",0,x0);
while (n<N)
{ y=phi(x0);
z=phi(y);
x=x0-(y-x0)*(y-x0)/(z-2*y+x0);
if(fabs(x-x0)<del)
{ printf("\n \n=近似解 = %f \n",x);
return;
}
printf("\n %2d %f ",n,x0);
n=n+1; x0=x;
}
printf("\n \n%d次迭代后未达到精度要求.\n",N); }
结果分析:
1.用简单迭代法和Steffensen迭代法都能求出非线性方程的近似解,且用简单迭代法和Steffensen迭代法求出的近似解基本一样。
2.用Steffensen迭代法来求解时迭代的次数少很多,可见Steffensen迭代法加速了收敛速度。