⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brsol.m

📁 This folder contains all the codes based on Matlab Language for the book <《Iterative Methods for
💻 M
字号:
function [sol, it_hist, ierr] = brsol(x,f,tol, parms)% Broyden's Method solver, locally convergent % solver for f(x) = 0%% C. T. Kelley, June 29, 1994%% This code comes with no guarantee or warranty of any kind.%% function [sol, it_hist, ierr] = brsol(x,f,tol,parms)%% inputs:%        initial iterate = x%        function = f%        tol = [atol, rtol] relative/absolute%            error tolerances for the nonlinear iteration%        parms = [maxit, maxdim, linprob]%            maxit = maxmium number of nonlinear iterations%                default = 40%            maxdim = maximum number of Broyden iterations%                before restart, so maxdim+3 vectors are %                stored (see text). By making the code a bit more%                subtle (putting z and F in the same place) one can%                reduce this overhead to maxdim+2 vectors. %                default = 40%            linprob = 0 for nonlinear problem%                    = 1 for linear problem%            if linprob = 1 an increase in the residual does%                 not result in termination %                 default = 0%% output:%        sol = solution%        it_hist(maxit) = scaled l2 norms of nonlinear residuals%        ierr = 0 upon successful termination%        ierr = 1 if either after maxit iterations%             the termination criterion is not satsified%             or the ratio of successive nonlinear residuals%             exceeds 1. In this latter case, the iteration%             is terminated.%%% internal parameter:%       debug = turns on/off iteration statistics display as%               the iteration progresses%% 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; linprob = 0; it_histx=zeros(maxit);%if nargin == 4    maxit=parms(1); maxdim=parms(2)-1; linprob=parms(3);endrtol=tol(2); atol=tol(1); n = length(x); fnrm=1; itc=0; nbroy=0;%% evaluate f at the initial iterate% compute the stop tolerance%f0=feval(f,x);fc=f0;fnrm=norm(f0)/sqrt(n);it_hist(itc+1)=fnrm;fnrmo=1;stop_tol=atol + rtol*fnrm;outstat(itc+1, :) = [itc fnrm 0];%% initialize the iteration history storage matrices%stp=zeros(n,maxdim);stp_nrm=zeros(maxdim,1);%% Set the initial step to -F, compute the step norm%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;%%   compute the new point, test for termination before%   adding to iteration history%    x = x + stp(:,nbroy);    fc=feval(f,x);    fnrm=norm(fc)/sqrt(n);    it_hist(itc+1)=fnrm;     rat=fnrm/fnrmo;    outstat(itc+1, :) = [itc fnrm rat];    if debug==1        disp(outstat(itc+1,:))    end%%   test for termination before computing the next w%    if fnrm <= stop_tol         sol=x;        return;    end%% if residual norms increase, terminate, set error flag%    if rat >= 1 & linprob == 0        ierr=1;        disp('increase in residual')        disp(outstat)        return;    end%%   if there's room, compute the step and step norm and%   add to the iteration history %    if nbroy < maxdim+1        z=-fc;        if nbroy > 1            for kbr = 1:nbroy-1                 z=z+stp(:,kbr+1)*((stp(:,kbr)'*z)/stp_nrm(kbr));            end        end%%       store the new step and step norm%        zz=stp(:,nbroy)'*z;        zz=zz/stp_nrm(nbroy);        stp(:,nbroy+1)=z/(1-zz);        stp_nrm(nbroy+1)=stp(:,nbroy+1)'*stp(:,nbroy+1);%%%    else%%   out of room, time to restart%        stp(:,1)=-fc;        stp_nrm(1)=stp(:,1)'*stp(:,1);        nbroy=0;%%%    end%% end whileendsol=x;if debug==1    disp(outstat)end%% on failure, set the error flag%if fnrm > stop_tol    ierr = 1;end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -