推荐-Broyden方法求解非线性方程组的Matlab实现 精品

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Broyden方法求解非线性方程组的Matlab实现

注:matlab代码来自网络,仅供学习参考。

1.把以下代码复制在一个.m文件上

function [sol, it_hist, ierr] = brsola(x,f,tol, parms)

% Broyden's Method solver, globally convergent

% solver for f(x) = 0, Armijo rule, one vector storage

%

% This code es with no guarantee or warranty of any kind.

%

% function [sol, it_hist, ierr] = brsola(x,f,tol,parms)

%

% inputs:

% initial iterate = x

% function = f

% tol = [atol, rtol] relative/absolute

% error tolerances for the nonlinear iteration

% parms = [maxit, maxdim]

% maxit = maxmium number of nonlinear iterations

% default = 40

% maxdim = maximum number of Broyden iterations

% before restart, so maxdim-1 vectors are

% stored

% default = 40

%

% output:

% sol = solution

% it_hist(maxit,3) = scaled l2 norms of nonlinear residuals % for the iteration, number function evaluations,

% and number of steplength reductions

% ierr = 0 upon successful termination

% ierr = 1 if after maxit iterations

% the termination criterion is not satsified.

% ierr = 2 failure in the line search. The iteration

% is terminated if too many steplength reductions

% are taken.

%

%

% internal parameter:

% debug = turns on/off iteration statistics display as

% the iteration progresses

%

% alpha = 1.d-4, parameter to measure sufficient decrease %

% maxarm = 10, maximum number of steplength reductions before % failure is reported

%

% set the debug parameter, 1 turns display on, otherwise off

%

debug=1;

%

% initialize it_hist, ierr, and set the iteration parameters

%

ierr = 0; maxit=40; maxdim=39;

it_histx=zeros(maxit,3);

maxarm=10;

%

if nargin == 4

maxit=parms(1); maxdim=parms(2)-1;

end

rtol=tol(2); atol=tol(1); n = length(x); fnrm=1; itc=0; nbroy=0; %

% evaluate f at the initial iterate

% pute the stop tolerance

%

f0=feval(f,x);

fc=f0;

fnrm=norm(f0)/sqrt(n);

it_hist(itc+1)=fnrm;

it_histx(itc+1,1)=fnrm; it_histx(itc+1,2)=0;

it_histx(itc+1,3)=0;

fnrmo=1;

stop_tol=atol + rtol*fnrm;

outstat(itc+1, :) = [itc fnrm 0 0];

%

% terminate on entry?

%

if fnrm < stop_tol

sol=x;

return

end

%

% initialize the iteration history storage matrices

%

stp=zeros(n,maxdim);

stp_nrm=zeros(maxdim,1);

lam_rec=ones(maxdim,1);

%

% Set the initial step to -F, pute the step norm

%

lambda=1;

stp(:,1) = -fc;

stp_nrm(1)=stp(:,1)'*stp(:,1);

%

% main iteration loop

%

while(itc < maxit)

%

nbroy=nbroy+1;

%

% keep track of successive residual norms and

% the iteration counter (itc)

%

fnrmo=fnrm; itc=itc+1;

%

% pute the new point, test for termination before

% adding to iteration history

%

xold=x; lambda=1; iarm=0; lrat=.5; alpha=1.d-4;

x = x + stp(:,nbroy);

fc=feval(f,x);

fnrm=norm(fc)/sqrt(n);

ff0=fnrmo*fnrmo; ffc=fnrm*fnrm; lamc=lambda;

%

%

% Line search, we assume that the Broyden direction is an

% ineact Newton direction. If the line search fails to

% find sufficient decrease after maxarm steplength reductions % brsola returns with failure.

%

% Three-point parabolic line search

%

while fnrm >= (1 - lambda*alpha)*fnrmo && iarm < maxarm

% lambda=lambda*lrat;

if iarm==0

lambda=lambda*lrat;

else

lambda=parab3p(lamc, lamm, ff0, ffc, ffm);

相关文档
最新文档