当前位置:文档之家› Aitken加速迭代法

Aitken加速迭代法

Aitken加速迭代法
Aitken加速迭代法

Aitken加速迭代法

function [x,k]=aitken(f,x0,ep)

y=f(x0);z=f(y);

x=x0-(y-x0)^2/(x0-2*y+z);

k=0;

N=5000;

while (norm(x-x0)>ep & k

x0=x;

y=f(x0);z=f(y);

x=(x0-(y-x0)^2/(x0-2*y+z));

k=k+1 ;

end

if k==N

warning('达到最大设定次数');

end

t=round(-log10(ep));

x=vpa(x,t);

end

>> f=@(x)exp(-x);x0=0;ep=0.5e-10;

>> [x,k]=aitken(f,x0,ep)

x =

0.5671432904

k =

4

向量函数的aitken加速法

function [x,k]=aitken1(f,x0,ep)

y=f(x0(1),x0(2));z=f(y(1),y(2));

x=x0-(y-x0).^2./(x0-2*y+z);

k=0;

N=5000;

while (norm(x-x0)>ep & k

x0=x;

y=f(x0(1),x0(2));z=f(y(1),y(2));

x=(x0-(y-x0).^2./(x0-2*y+z));

k=k+1;

end

if k==N

warning('′?μ?×?′ó?¤éè′?êy');

end

t=round(-log10(ep));

x=vpa(x,t);

end

>> f=@(x,y)[exp(-x-y);exp(x*y)];x0=[0;0];ep=0.5e-10; >> [x,k]=aitken1(f,x0,ep)

x = k =

0.2138547983 110

1.328603209

迭代法的加速

6.5 迭代法的加速 一、教学目标及基本要求 通过对本节的学习,使学生掌握方程求根迭代法的加速。 二、教学内容及学时分配 本章主要介绍线性方程求根的迭代法的加速方法。要求 1.了解数值分析的研究对象、掌握误差及有关概念。 2.正确理解使用数值方法求方程的解的基本思想、数学原理、算法设计。 3.了解插值是数值逼近的重要方法之一,正确理解每一种算法的基本思想、计算公式、算法设计、程序框图设计和源程序。 4.掌握数值积分的数学原理和程序设计方法。 5.能够使用数值方法解决一阶常微分方程的初值问题。 6.理解和掌握使用数值方法对线性方程组求解的算法设计。 三、教学重点难点 1.教学重点:非线性方程迭代收敛性与迭代加速、牛顿法。 2. 教学难点:迭代的收敛性。 四、教学中应注意的问题 多媒体课堂教学为主。适当提问,加深学生对概念的理解,迭代加速的算法实现。 五、教案正文 6.1 迭代公式的加工 迭代过程收敛缓慢,计算量将很大,需要进行加速。 设k x 是根*x 的某个近似值,用迭代公式校正一次得()k k x x ?=+1,假设) ('x ?

在所考察得范围内变化不大,其估计值为L ,则有: k k k k x L L x L x x x L x x ---≈?-≈-++111)(1**1* 有迭代公式k k k x L L x L x ---=++11111 ,是比1+k x 更好的近似根。这样加工后的计算过程为: 迭代()k k x x ?=+1 改进k k k x L L x L x ---= ++11111 合并的])([111k k k Lx x L x --=+? 例3 P133 6.2 埃特金算法 上述加速方法含有导数()x '?,不便于计算。设将迭代值()k k x x ?=+1再迭代一次,又得() 11~++=k k x x ?,由于)(~1*1*++-≈-k k x x L x x 又)(*1*k k x x L x x -≈-+,消去L 得 k k k k k k k k k k x x x x x x x x x x x x x x x +---≈?--≈--++++++++112 111*1**1*1*2~)~(~~ 计算过程如下: 迭代()k k x x ?=+1 迭代()11~++=k k x x ? 改进k k k k k k k x x x x x x x +---=++++++11211112~)~(~ 小结:这节课我们主要介绍了线性方程组迭代法加速的基本思想及其常用的几种迭代方法。要求大家掌握埃特金算法及其收敛速度,收敛的阶。 作业:课后作业10-13

十、解非线性方程(组)的迭代法和加速法

一、一般迭代法求解非线性方程组。 function [k,piancha,xdpiancha,xk]=diedai1(x0,k) x(1)=x0; for i=1:k x(i+1)=fun1(x(i)); piancha=abs(x(i+1)-x(i)); xdpiancha=piancha/(abs(x(i+1))+eps); i=i+1;xk=x(i); [(i-1) piancha xdpiancha xk] end if (piancha>1)&(xdpiancha>0.5)&(k>3) disp('此迭代序列发散,请重新输入新的迭代公式') return; end if (piancha<0.001)&(xdpiancha<0.0000005)&(k>3) disp('此迭代序列收敛,且收敛速度较快') return; end p=[(i-1) piancha xdpiancha xk]'; 1、function y=fun1(x) y=(10-x.^2)./2 >> [k,piancha,xdpiancha,xk]=diedai1(5,10) 此迭代序列发散,请重新输入新的迭代公式 k = 10 piancha = 2.4484e+271 xdpiancha = 1 xk = -2.4484e+271 2、function y=fun1(x) y=10./(x+2) >> [k,piancha,xdpiancha,xk]=diedai1(5,25) 此迭代序列收敛,且收敛速度较快 k = 25 piancha = 9.5676e-007 xdpiancha = 4.1300e-007 xk = 2.3166 二、第二种迭代法。

数值分析实习作业不同迭代法求解(简单迭代法,艾特肯加速迭代法,牛顿法弦割法)

实习题六:用简单迭代法,艾特肯加速迭代法,牛顿法弦割法求解方程1-x-sin(x) = 0在[0,1]上的根。 简单迭代法和艾特肯加速法求解方程1-x-sin(x) = 0在[0,1]上的根。 主程序: %利用简单迭代法求解方程1-x-sin(x) = 0在[0,1]上的根 clear clc format long f = @f1; a = 0; b = 1; eps = 0.5*10^(-4); [x,time] = iteration(f,a,b,eps); disp('利用简单迭代法求解方程1-x-sin(x) = 0在[0,1]上的根') disp('方程1-x-sinx = 0的根是 x = ') disp(x) disp('迭代次数') disp (time) %% %利用艾特肯加速法求解方程1-x-sin(x) = 0在[0,1]上的根 [x,time] = iteration_aitken(f,a,b,eps); disp('利用艾特肯加速法求解方程1-x-sin(x) = 0的[0,1]上的根') disp('方程1-x-sinx = 0的根是 x = ') disp(x) disp('迭代次数') disp (time) 简单迭代法函数: function [y,time] = iteration(f,a,b,eps) x0 = (a+b)/2; D = 1; time = 0; while abs(D)>=eps x1 = feval(f,x0); D = x1-x0; x0 = x1; time = time+1; end y = x0; 艾特肯加速法函数 function [y,time] = iteration_aitken(f,a,b,eps) x0 = (a+b)/2; D = 1; t = 0; while abs(D)>=eps

方程的加速迭代法

2013-2014(1)专业课程实践论文题目:方程的加速迭代方法

一、算法理论 Aitken 加速迭代算法基本原理: 对于收敛的迭代过程,只要迭代足够多次,就可以使结果达到任意的精度。但有时迭代过程收敛缓慢,从而使计算量变得很大,因此,迭代过程的加速是个重要的过程。 设0x 是跟*x 的某个预测值,只迭代公式校正一次)(01x f x =,而由微分中值定理有:)x (x (t)f x x **-?'=-01(其中t 介于*x 与0x 之间) 。 假定()x f '改变不大,近似的取某个近似值L ,则由)(*0*1x x L x x -?≈-得到 L x L L x x -?- -= 1101 *,可以期望按上式右端求得 ()L x x L x L L x L x x --?+ =-?--= 11101101 2是比1x 更好的近似值,将每得到一次改进值算做一步,并用k x '和k x 分别表示第K 步的校正值和改进值,则加速迭代计算方案可表述如下: 校正:1+'k x ()k x f = 改进:=+1k x ()L x x L x k k k --'?+'++111 然而上述加速公式有个缺点,由于其中含有倒数()x f '的有关信息L ,实际使用不便。 仍设已知*x 的某个猜测值为0x ,将校正值()01x f x =,再校正一次,又得 ()12x f x =。由于≈-*2x x ()*1L x x -?将它与式 = *x L x L L x -?- -1101 联立,消去未知L ,然后有 =*x ()2 102 1222x x x x x x +?--- 这样构造出的改进公式确定不再含有关于导数的

Aitken加速迭代法

Aitken加速迭代法 function [x,k]=aitken(f,x0,ep) y=f(x0);z=f(y); x=x0-(y-x0)^2/(x0-2*y+z); k=0; N=5000; while (norm(x-x0)>ep & k> f=@(x)exp(-x);x0=0;ep=0.5e-10; >> [x,k]=aitken(f,x0,ep) x = 0.5671432904 k = 4 向量函数的aitken加速法 function [x,k]=aitken1(f,x0,ep) y=f(x0(1),x0(2));z=f(y(1),y(2)); x=x0-(y-x0).^2./(x0-2*y+z); k=0; N=5000; while (norm(x-x0)>ep & k> f=@(x,y)[exp(-x-y);exp(x*y)];x0=[0;0];ep=0.5e-10; >> [x,k]=aitken1(f,x0,ep) x = k = 0.2138547983 110 1.328603209

非线性方程的简单迭代法和Steffensen迭代法

《数值计算方法》实验报告 实验名称:实验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|

Atiken加速 一般迭代和牛顿迭代法

第二次上机实验报告 实验一:①.用不动点迭代法求f x=x3?x?1=0的根 发散的迭代格式:x k+1=x k3?1,其中k=0,1,2…… 3,其中k=0,1,2…… 收敛的迭代格式:x k+1=x k+1 当使用第二种格式迭代,且精度为10^(-12)时,程序如下: #include #include #include using namespace std; #define h 0.000000000001 double f(double x) { double f1 = pow(x + 1, 1.0 / 3); return f1; } int main() { double x1, x2; int n=0; cout<< "input first data:" <> x1; x2 = f(x1); while (fabs(x2 - x1) > h) { n++; x1 = x2; cout<

②对迭代格式使用Aitken加速,观察其收敛散性质变化 对迭代格式一使用Aitken加速,收敛 对迭代格式二使用Aitken加速,收敛速度变快 程序如下: #include #include #include #define h 0.000000000001 usingnamespace std; double f(double x) { double f1 = pow(x,3)-1; return f1; } int main() { double x0,x1, x2; int n = 0; cout<<"please input the first number:"<> x0; x1 = f(x0); while (fabs(x0-f(x0))>h) { n++; x2 = f(x1); x0 = x2 - (x2 - x1)*(x2 - x1) / (x2 - 2 * x1 + x0); x1 = x2; cout<

相关主题
文本预览
相关文档 最新文档