当前位置:文档之家› Newton迭代法求解非线性方程

Newton迭代法求解非线性方程

Newton迭代法求解非线性方程一、 Newton 迭代法概述构造迭代函数的一条重要途径是用近似方程来代替原方程去求根。

因此,如果能将非线性方程f (x )=0用线性方程去代替,那么,求近似根问题就很容易解决,而且十分方便。

牛顿(Newton)法就是一种将非线性方程线化的一种方法。

设k x 是方程f (x )=0的一个近似根,把如果)(x f 在k x 处作一阶Taylor 展开,即:)x x )(x ('f )x (f )x (f k k k -+≈ (1-1)于是我们得到如下近似方程:0)x x )(x ('f )x (f k k k =-+ (1-2)设0)('≠k x f ,则方程的解为:x ̅=x k +f(x k )f(x k )́ (1-3)取x ~作为原方程(1.1)的新近似根1+k x ,即令: )x ('f )x (f x x k k k 1k -=+, k=0,1,2,… (1-4) 上式称为牛顿迭代格式。

用牛顿迭代格式求方程的根的方法就称为牛顿迭代法,简称牛顿法。

牛顿法具有明显的几何意义。

方程:)x x )(x ('f )x (f y k k k -+= (1-5) 是曲线)x (f y =上点))x (f ,x (k k 处的切线方程。

迭代格式(1-4)就是用切线式(1-5)的零点来代替曲线的零点。

正因为如此,牛顿法也称为切线法。

牛顿迭代法对单根至少是二阶局部收敛的,而对于重根是一阶局部收敛的。

一般来说,牛顿法对初值0x 的要求较高,初值足够靠近*x 时才能保证收敛。

若要保证初值在较大范围内收敛,则需对)x (f 加一些条件。

如果所加的条件不满足,而导致牛顿法不收敛时,则需对牛顿法作一些改时,即可以采用下面的迭代格式:)x ('f )x (f x x k k k 1k λ-=+,⋯=,2,1,0k (1-6)上式中,10<λ<,称为下山因子。

因此,用这种方法求方程的根,也称为牛顿下山法。

牛顿法对单根收敛速度快,但每迭代一次,除需计算)x (f k 之外,还要计算)x ('f k 的值。

如果)x (f 比较复杂,计算)x ('f k 的工作量就可能比较大。

为了避免计算导数值,我们可用差商来代替导数。

通常用如下几种方法: 1. 割线法 如果用1k k 1k k x x )x (f )x (f ----代替)x ('f k ,则得到割线法的迭代格式为:)x (f )x (f )x (f x x x x k 1k k 1k k k 1k --+---= (1-7)2. 拟牛顿法 如果用)x (f ))x (f x (f )x (f k 1k k k ---代替)x ('f k ,则得到拟牛顿法的迭代格式为:))x (f x (f )x (f )x (f x x 1k k k k 2k 1k -+---= (1-8) 3. Steffenson 法如果用)x (f )x (f ))x (f x (f k k k k -+代替)x ('f k ,则得到拟牛顿法的迭代格式为:)x (f ))x (f x (f )x (f x x k k k k 2k 1k -+-=+ (1-9) 二、 算法分析1. 割线法割线法的迭代公式为:)x (f )x (f )x (f x x x x k 1k k 1k k k 1k --+---=,k=0,1,2,…割线法是超线性收敛,其程序流程图为:2. 拟牛顿法牛顿拟迭代法迭代公式为:))x (f x (f )x (f )x (f x x 1k k k k 2k 1k -+---= (1) 对单根条件下,牛顿拟迭代法平方收敛,牛顿拟迭代法程序框图如下所示:(2) 对重根条件下,此时迭代公式修改为:))x (f x (f )x (f )x (f mx x 1k k k k 2k 1k -+---=,m 为根的重数 此时,牛顿迭代法至少平方收敛。

3. Steffenson 法Steffenson 迭代法程序流程图与牛顿拟迭代法类似。

三、 牛顿法的程序给定初值0p ,用牛顿法格式)p ('f )p (f p p 1k 1k 1k k ---=,⋯=,2,1k ,求解非线性方程0)x (f =。

*********************************************************************function [p1,err,k,y] = newton(f1041,df1041,p0,delta,max1) % f1041是非线性函数。

% df1041是f1041的微商。

% p0是初始值。

% delta 是给定允许误差。

% max1是迭代的最大次数。

% p1是牛顿法求得的方程的近似解。

% err 是p0的误差估计。

% k 是迭代次数。

% y = f(p1)p0, feval('f1041',p0) for k = 1:max1p1 = p0 - feval('f1041', p0)/feval('df1041', p0); err = abs(p1-p0); p0 = p1;p1, err, k, y = feval('f1041', p1) if (err < delta) | (y == 0),break, endp1, err, k, y = feval('f1041', p1) end*********************************************************************四、程序实例与计算结果例 用上述程序求方程0233=+-x x 的一个近似解,给定初值为1.2,误差界为610-。

解:先用m文件先定义二个名为f1041.m和df1041.m的函数文件。

function y = f1041(x)y = x^3 – 3*x + 2;function y=df1041(x)y=3*x^2-3;建立一个主程序prog1041.mclearnewton('f1041','df1041',1.2, 10^(-6), 18) 然后在MATLAB命令窗口运行上述主程序,即:>> prog1041计算结果如下:p0 = 1.2000 ans = 0.1280 p1 = 1.1030 err = 0.0970 k = 1y = 0.0329 p1 = 1.1030 err = 0.0970 k = 1y = 0.0329 p1 = 1.0524 err = 0.0507 k = 2y = 0.0084 p1 = 1.0524 err = 0.0507 k = 2y = 0.0084 p1 = 1.0264 err = 0.0260 k = 3y = 0.0021p1 = 1.0264 err = 0.0260 k = 3y = 0.0021p1 = 1.0133 err = 0.0131 k = 4y = 5.2963e-004 p1 = 1.0133 err = 0.0131 k = 4y = 5.2963e-004 p1 = 1.0066 err = 0.0066 k = 5y = 1.3270e-004p1 = 1.0066 err = 0.0066k = 5y = 1.3270e-004 p1 = 1.0033 err = 0.0033k = 6y = 3.3211e-005 p1 = 1.0033 err = 0.0033k = 6y = 3.3211e-005 p1 = 1.0017 err = 0.0017k = 7y = 8.3074e-006 p1 = 1.0017 err = 0.0017k = 7y = 8.3074e-006 p1 = 1.0008 err = 8.3157e-004 k = 8y = 2.0774e-006 p1 = 1.0008 err = 8.3157e-004 k = 8y = 2.0774e-006 p1 = 1.0004 err = 4.1596e-004 k = 9y = 5.1943e-007 p1 = 1.0004 err = 4.1596e-004 k = 9y = 5.1943e-007 p1 = 1.0002 err = 2.0802e-004 k = 10y = 1.2987e-007 p1 = 1.0002 err = 2.0802e-004 k = 10y = 1.2987e-007 p1 = 1.0001 err = 1.0402e-004 k = 11y = 3.2468e-008 p1 = 1.0001 err = 1.0402e-004 k = 11y = 3.2468e-008 p1 = 1.0001 err = 5.2014e-005 k = 12y = 8.1170e-009 p1 = 1.0001 err = 5.2014e-005 k = 12y = 8.1170e-009p1 = 1.0000 err = 2.6008e-005 k = 13y = 2.0293e-009 p1 = 1.0000 err = 2.6008e-005 k = 13y = 2.0293e-009 p1 = 1.0000 err = 1.3004e-005 k = 14y = 5.0732e-010 p1 = 1.0000 err = 1.3004e-005 k = 14y = 5.0732e-010 p1 = 1.0000 err = 6.5020e-006 k = 15y = 1.2683e-010 p1 = 1.0000 err = 6.5020e-006 k = 15 y = 1.2683e-010 p1 = 1.0000 err = 3.2510e-006 k = 16y = 3.1708e-011 p1 = 1.0000 err = 3.2510e-006 k = 16y = 3.1708e-011 p1 = 1.0000 err = 1.6255e-006 k = 17y = 7.9270e-012 p1 = 1.0000 err = 1.6255e-006 k = 17y = 7.9270e-012 p1 = 1.0000 err = 8.1277e-007 k = 18y = 1.9817e-012 ans = 1.0000这说明,经过18次迭代得到满足精度要求的值。

相关主题