导论
开方法与划界法相比,仅仅需要一个或两个初始值,并不要求包含根的区间。这样,有时该方法会发散,随着计算的推进会越来越远离真正的根,但当开方法收敛时,其会比划界法的收敛速度快得多。
简单不动点迭代
将函数进行简单整理,得到如下形式:
上式的作用是提供一个预测新值的公式,将新值表示为旧值的函数,过程表示为如下函数:
近似误差表示为:
简单不动点迭代的四种情况如下:
可以看出,当时,方法收敛。
牛顿-拉弗森方法
其方法思想可通过下图表示:
新值可通过如下公式(牛顿-拉弗森公式)得出:
function [root, ea, iter] = newtraph(func, dfunc, xr, es, maxit, varargin)
% 牛顿-拉弗森方法
if nargin<3, error('至少输入三个参数:函数名,函数导数,初始化猜测值'), end
if nargin<4||isempty(es), es = 0.0001;end
if nargin<5||isempty(maxit), maxit = 50; end
iter = 0;
while(1)
xrold = xr;
xr = xr - func(xr, varargin{:})/dfunc(xr);
iter = iter+1;
if xr~=0, ea = abs((xr-xrold)/xr)*100; end
if ea<=es||iter>=maxit, break; end
end
root = xr;
end
- 每次迭代之后,准确的有效数字几乎翻倍,即具有二次收敛特性
- 牛顿-拉弗森方法的一个潜在问题是需要计算函数的导数,这可以通过下面的方法(割线法)解决。
割线法
割线法的思想是使用差分代替微分,替换后的公式为(其与试位法相同):
此即为割线法,该方式需要两个初始估计值,一种改进公式如下:
此为改进割线法,它既具有牛顿-拉弗森方法的高效性,又不需要计算导数。
function [root, ea, iter] = gexian(func, xr, es, maxit, varargin)
% 改进割线方法
if nargin<2, error('至少输入两个参数:函数名,初始化猜测值'), end
if nargin<3||isempty(es), es = 0.0001;end
if nargin<4||isempty(maxit), maxit = 50; end
iter = 0; dx = 0.001;
while(1)
xrold = xr;
fr = func(xr, varargin{:});
fdr = func(xr+dx, varargin{:});
xr = xr - dx*fr/(fdr-fr);
iter = iter+1;
if xr~=0, ea = abs((xr-xrold)/xr)*100; end
if ea<=es||iter>=maxit, break; end
end
root = xr;
end