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

📄 nesolve.m

📁 computation of conformal maps to polygonally bounded regions
💻 M
字号:
function [xf,termcode,path] = nesolve(fvec,x0,details,fparam,jac,scale)%FSOLVE Solution to a system of nonlinear equations.%       X = FSOLVE('f',X0) starts at X0 and produces a new vector X which%       solves for f(x) = 0.  'f' is a string containing the name of the%       function to be solved, normally an M-file.  For example, to%       find the x, y, and z that solve the simultaneous equations%%            sin(x) + y^2 + log(z) - 7 = 0%            3*x + 2^y - z^3 + 1 = 0%            x + y + z - 5 = 0%%       Use X = FSOLVE('xyz',[1 1 1]') where XYZ is the M-file%%         function q = xyz(p)%         x = p(1); y = p(2); z = p(3);%         q = zeros(3,1);%         q(1) = sin(x) + y^2 + log(z) - 7;%         q(2) = 3*x + 2^y - z^3 + 1;%         q(3) = x + y + z - 5;%%       FSOLVE can take many other optional parameters; see the M-file%       for more information.%       Copyright (c) 1988 by the MathWorks, Inc.%       Coded in MATLAB by Richard T. Behrens, April 1988.%       Revised 11/27/88 JNL%       Hookstep option added 8/21/90 RTB.%  [XF,TERMCODE,PATH] = FSOLVE(FVEC,X0,DETAILS,FPARAM,JAC,SCALE)%%  This function is for solving systems of nonlinear equations.  For more%  information see a users guide.%%  ^* INPUTS ^*%  FVEC     - The name of a function which maps n-vectors into n-vectors.%  X0       - An initial guess of a solution (starting point for iterations).%  DETAILS  - (optional) A vector whose elements select various algorithmic%             options and specify various tolerances.%  FPARAM   - (optional) A set of parameters (constants) which, if nonempty,%             is passed on as a second argument to FVEC and JAC.%  JAC      - (optional) The name of a function which implements the jacobian%             matrix (if available) of the function named in FVEC.%  SCALE    - (optional) 'Typical' values of X (1st column) and F (2nd col.)%             for scaling purposes (no zeros in SCALE, please).% ^* OUTPUTS ^*%  XF       - The final approximation of the solution.%  TERMCODE - (optional) Indicates the stopping reason (equals 1 for normal%             termination).%  PATH     - (optional) Returns the sequence of iterates.%%  --> NOTE:  All vectors must be column-vectors.%  Based on Algorithm D6.1.3:  Part of the modular software system from the%  appendix of the book "Numerical Methods for Unconstrained Optimization and%  Nonlinear Equations" by Dennis & Schnabel, 1983.  Please refer to that book%  if you need more detailed information about the algorithms.% Initialization.%if (nargin < 3)   details = zeros(16,1);endi = length(details);if (i < 16)   details((i+1):16,1) = zeros(16-i,1);  % For unspecified details.endif (nargin < 4)   details(15) = 0;                      % No parameters to pass.elseif isempty(fparam)   details(15) = 0;else   details(15) = 1;endif (details(15) == 0)   fparam = [];endif (nargin < 5)   details(4) = 0;                       % No analytic jacobian.elseif isempty(jac)   details(4) = 0;endif (details(4) == 0)   jac = '';endif (nargin < 6)   scale = [];                           % No scaling given.   if (details(16) == 2)      details(16) = 1;   endendif (nargout < 3)   details(14) = 0;                      % No path output.else   details(14) = 1;endif details(14), path = x0.'; endif (details(1) == 2), btrack = []; endnofun = 0;              % Number of function evaluations.trustvars = zeros(4,1); % variables for trust region methods.FVc = 0;%% Algorithm step 2.%if (details(16) > 0)     % Might need F(x0) for scaling.   if details(15)      [fc,FVplus,nofun] = nefn(x0,ones(length(x0),1),fvec,nofun,fparam);   else      [fc,FVplus,nofun] = nefn(x0,ones(length(x0),1),fvec,nofun);   endelse   FVplus = zeros(length(x0),1);end[details,Sx,SF,termcode] = neinck(x0,FVplus,details,scale);%% Algorithm step 3.%if (termcode < 0)   xf = x0;   if details(14), path = [path;xf.']; end   returnend%% Algorithm step 4.%itncount = 0;%% Algorithm step 5.%if details(15)   [fc,FVplus,nofun] = nefn(x0,SF,fvec,nofun,fparam);else   [fc,FVplus,nofun] = nefn(x0,SF,fvec,nofun);end%% Algorithm step 6.%%[termcode,consecmax] = nestop0(x0,FVplus,SF,details(8));consecmax = 0;if (max(SF .* abs(FVplus)) <= 1E-2 * details(8))   termcode = 1;else   termcode = 0;end%% Algorithm step 7.%if (termcode > 0)   xf = x0;   if (details(14)), path = [path;xf.']; endelse   if details(4)      if details(15)         [Jc,addfun] = feval(jac,x0,fparam);      else         [Jc,addfun] = feval(jac,x0);      end      nofun = nofun + addfun;   else      [Jc,nofun] = nefdjac(fvec,FVplus,x0,Sx,details,nofun,fparam);   end   gc = Jc' * (FVplus .* (SF.^2));   FVc = FVplus;end%% Algorithm step 8.%xc = x0;%% Algorithm step 9.%restart = 1;norest = 0;%% Algorithm step 10 (iteration).%%%if (details(1) > 0), clc, endif details(1)  %disp('ITN    F-COUNT    MAX(ABS(F))')  wbh = waitbar(0,'Solution progress:');  normFV0 = max(abs(FVc));end  while (termcode == 0)   if details(1)      %disp(sprintf('%3d %8d %16g',itncount,nofun,max(abs(FVc))))      fracdone = log(max(abs(FVc))/normFV0)/log(details(8)/normFV0);      waitbar(fracdone)      drawnow   end   itncount = itncount + 1;   if (details(4) | details(3) | (1-details(5)))      [M,Hc,sN] = nemodel(FVc,Jc,gc,SF,Sx,details(2));   else      error('Factored model not implemented.')%     [] = nemodfac();   end   if (details(2) == 1)      [retcode,xplus,fplus,FVplus,maxtaken,nofun,btrack] = ...      nelnsrch(xc,fc,fvec,gc,sN,Sx,SF,details,nofun,btrack,fparam);   elseif (details(2) == 2)      [retcode,xplus,fplus,FVplus,maxtaken,details,trustvars,nofun] = ...         nehook(xc,fc,fvec,gc,tril(M),Hc,sN,Sx,SF,details,itncount,trustvars,...         nofun,fparam);   else      error('Dogleg not implemented.')%     [] = nedogdrv();   end   if ((retcode ~= 1) | (restart) | (details(4)) | (details(3)))      if (details(4))         if details(15)            [Jc,addfun] = feval(jac,xplus,fparam);         else            [Jc,addfun] = feval(jac,xplus);         end         nofun = nofun + addfun;      elseif (details(3))         [Jc,nofun] = nefdjac(fvec,FVplus,xplus,Sx,details,nofun,fparam);      elseif (details(5))         error('Factored secant method not implemented.')%        [] = nebroyf();      else         Jc = nebroyuf(Jc,xc,xplus,FVc,FVplus,Sx,details(13));  % Broyden update      end      if (details(5))         error('Gradient calculation for factored method not implemented.')         % Calculate gc using QR factorization (see book).      else         gc = Jc' * (FVplus .* (SF.^2));      end      [consecmax,termcode] = nestop(xc,xplus,FVplus,fplus,gc,Sx,SF,retcode,...                                details,itncount,maxtaken,consecmax);   end   if (((retcode == 1) | (termcode == 2)) & (1-restart) & ...                                     (1-details(4)) & (1-details(3)))      [Jc,nofun] = nefdjac(fvec,FVc,xc,Sx,details,nofun,fparam);      gc = Jc' * (FVc .* (SF.^2));      if ((details(2) == 2) | (details(2) == 3))         details(7) = -1;      end      restart = 1;      norest = norest + 1;      if termcode==2, termcode = 0; end %***added by TAD   else      if (termcode > 0)         xf = xplus;         if (details(14)), path = [path;xf.']; end      else         restart = 0;         if (details(14)), path = [path;xplus.']; end      end      xc = xplus;      fc = fplus;      FVc = FVplus;%%      if (details(1) > 0)%%         clc%%         disp('The current iteration is: ')%%         xc%%      end   endendif details(1)  close(wbh)  drawnowendif (details(1) == 2)   %%disp('Press CR to see statistics . . .')   %%fprintf([' ',7])   %%pause   %%clc   %%format compact   disp(' ')   %%disp('Function: ')   %%fvec   %%disp('Starting point: ')   %%x0.'   %%disp('Termination condition: ')   %%termcode   disp(sprintf('Number of iterations: %d',itncount))   disp(sprintf('Number of function evaluations: %d',nofun))   disp(sprintf('Final norm(F(x)): %.6g',max(abs(FVc))))   if ((1-details(3)) & (1-details(4)))      disp(sprintf('Number of restarts for secant methods: %d',norest))   end%%   if (details(2) == 1)%%      disp('Backtrack information: ')%%      btrack%%   end%%   pauseend

⌨️ 快捷键说明

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