方程求根——开方法

导论

        开方法与划界法相比,仅仅需要一个或两个初始值,并不要求包含根的区间。这样,有时该方法会发散,随着计算的推进会越来越远离真正的根,但当开方法收敛时,其会比划界法的收敛速度快得多。

简单不动点迭代

        将函数f(x) = 0进行简单整理,得到如下形式:

x = g(x)

上式的作用是提供一个预测新值的公式,将新值表示为旧值的函数,过程表示为如下函数:

x_{i+1} = g(x_i)

近似误差表示为:

\varepsilon_a=|\frac{x_{i+1}-x_i}{x_{i+1}}|

简单不动点迭代的四种情况如下:

可以看出,当|g^{'}|<1时,方法收敛。

牛顿-拉弗森方法

        其方法思想可通过下图表示:

新值可通过如下公式(牛顿-拉弗森公式)得出:

x_{i+1} = x_i-\frac{f(x_i)}{f^{'}(x_i)}

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
  • 每次迭代之后,准确的有效数字几乎翻倍,即具有二次收敛特性
  • 牛顿-拉弗森方法的一个潜在问题是需要计算函数的导数,这可以通过下面的方法(割线法)解决。

割线法

        割线法的思想是使用差分代替微分,替换后的公式为(其与试位法相同):

x_{i+1} = x_i- \frac{f(x_i)(x_{i-1}-x_i)}{f(x_{i-1})-f(x_i)}

此即为割线法,该方式需要两个初始估计值,一种改进公式如下:

x_{i+1} = x_i-\frac{dxf(x_i)}{f(x_i+dx)-f(x_i)}

此为改进割线法,它既具有牛顿-拉弗森方法的高效性,又不需要计算导数。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值