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

📄 optim_private_snls.c

📁 ASUFIT-Matlab-全局拟合程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 * MATLAB Compiler: 2.0.1
 * Date: Tue May 08 21:28:22 2001
 * Arguments: "-B" "sgl" "-m" "-W" "mainhg" "-L" "C" "asufit.m" "absfun.m"
 * "absfunfree.m" "absfunshift.m" "absfunwidth.m" "dispfit.m" "dispfitdisp.m"
 * "dispfitfree.m" "dispfitwidth.m" "seqmodfree.m" "spcfun.m" "spcfun1.m"
 * "atamult.m" "aprecon.m" 
 */
#include "optim_private_snls.h"
#include "color.h"
#include "optim_private_definev.h"
#include "optim_private_display1.h"
#include "optim_private_perturb.h"
#include "sfdnls.h"
#include "optim_private_startx.h"
#include "optim_private_trdog.h"
#include "optim_private_xplot.h"

/*
 * The function "Moptim_private_snls" is the implementation version of the
 * "optim/private/snls" M-function from file
 * "C:\MATLABR11\toolbox\optim\private\snls.m" (lines 1-424). It contains the
 * actual compiled code for that M-function. It is a static function and must
 * only be called from one of the interface functions, appearing below.
 */
/*
 * function[xcurr,fvec,LAMBDA,JACOB,EXITFLAG,OUTPUT]=snls(funfcn,xstart,l,u,verb,options,fval,JACval,YDATA,caller,Jstr,computeLambda,varargin)
 */
static mxArray * Moptim_private_snls(mxArray * * fvec,
                                     mxArray * * LAMBDA,
                                     mxArray * * JACOB,
                                     mxArray * * EXITFLAG,
                                     mxArray * * OUTPUT,
                                     int nargout_,
                                     mxArray * funfcn,
                                     mxArray * xstart,
                                     mxArray * l,
                                     mxArray * u,
                                     mxArray * verb,
                                     mxArray * options,
                                     mxArray * fval,
                                     mxArray * JACval,
                                     mxArray * YDATA,
                                     mxArray * caller,
                                     mxArray * Jstr,
                                     mxArray * computeLambda,
                                     mxArray * varargin) {
    mxArray * xcurr = mclGetUninitializedArray();
    mxArray * A = mclGetUninitializedArray();
    mxArray * D = mclGetUninitializedArray();
    mxArray * DS = mclGetUninitializedArray();
    mxArray * Z = mclGetUninitializedArray();
    mxArray * active_tol = mclGetUninitializedArray();
    mxArray * ans = mclInitializeAns();
    mxArray * arg = mclGetUninitializedArray();
    mxArray * arg2 = mclGetUninitializedArray();
    mxArray * argl = mclGetUninitializedArray();
    mxArray * argu = mclGetUninitializedArray();
    mxArray * aug = mclGetUninitializedArray();
    mxArray * bndfeas = mclGetUninitializedArray();
    mxArray * currOutput = mclGetUninitializedArray();
    mxArray * dd = mclGetUninitializedArray();
    mxArray * degen = mclGetUninitializedArray();
    mxArray * del = mclGetUninitializedArray();
    mxArray * delbnd = mclGetUninitializedArray();
    mxArray * delta = mclGetUninitializedArray();
    mxArray * diff = mclGetUninitializedArray();
    mxArray * dnewt = mclGetUninitializedArray();
    mxArray * dv = mclGetUninitializedArray();
    mxArray * errmsg = mclGetUninitializedArray();
    mxArray * ex = mclGetUninitializedArray();
    mxArray * fdata = mclGetUninitializedArray();
    mxArray * figtr = mclGetUninitializedArray();
    mxArray * findiffevals = mclGetUninitializedArray();
    mxArray * formatstr = mclGetUninitializedArray();
    mxArray * g = mclGetUninitializedArray();
    mxArray * gopt = mclGetUninitializedArray();
    mxArray * grad = mclGetUninitializedArray();
    mxArray * gradflag = mclGetUninitializedArray();
    mxArray * group = mclGetUninitializedArray();
    mxArray * header = mclGetUninitializedArray();
    mxArray * it = mclGetUninitializedArray();
    mxArray * itb = mclGetUninitializedArray();
    mxArray * kmax = mclGetUninitializedArray();
    mxArray * lsotframe = mclGetUninitializedArray();
    mxArray * maxfunevals = mclGetUninitializedArray();
    mxArray * mm = mclGetUninitializedArray();
    mxArray * mtxmpy = mclGetUninitializedArray();
    mxArray * n = mclGetUninitializedArray();
    mxArray * nbnds = mclGetUninitializedArray();
    mxArray * newA = mclGetUninitializedArray();
    mxArray * newfvec = mclGetUninitializedArray();
    mxArray * newgrad = mclGetUninitializedArray();
    mxArray * newval = mclGetUninitializedArray();
    mxArray * newx = mclGetUninitializedArray();
    mxArray * npcg = mclGetUninitializedArray();
    mxArray * nrmsx = mclGetUninitializedArray();
    mxArray * numFunEvals = mclGetUninitializedArray();
    mxArray * numGradEvals = mclGetUninitializedArray();
    mxArray * numberOfVariables = mclGetUninitializedArray();
    mxArray * oposdef = mclGetUninitializedArray();
    mxArray * optnrm = mclGetUninitializedArray();
    mxArray * oval = mclGetUninitializedArray();
    mxArray * p = mclGetUninitializedArray();
    mxArray * pcflags = mclGetUninitializedArray();
    mxArray * pcgit = mclGetUninitializedArray();
    mxArray * pcgtol = mclGetUninitializedArray();
    mxArray * pcmtx = mclGetUninitializedArray();
    mxArray * pert = mclGetUninitializedArray();
    mxArray * posdef = mclGetUninitializedArray();
    mxArray * pp = mclGetUninitializedArray();
    mxArray * prev_diff = mclGetUninitializedArray();
    mxArray * qp = mclGetUninitializedArray();
    mxArray * r = mclGetUninitializedArray();
    mxArray * ratio = mclGetUninitializedArray();
    mxArray * showstat = mclGetUninitializedArray();
    mxArray * snod = mclGetUninitializedArray();
    mxArray * sx = mclGetUninitializedArray();
    mxArray * theta = mclGetUninitializedArray();
    mxArray * tol = mclGetUninitializedArray();
    mxArray * tol1 = mclGetUninitializedArray();
    mxArray * tol2 = mclGetUninitializedArray();
    mxArray * totls = mclGetUninitializedArray();
    mxArray * typx = mclGetUninitializedArray();
    mxArray * v = mclGetUninitializedArray();
    mxArray * val = mclGetUninitializedArray();
    mxArray * vdeg = mclGetUninitializedArray();
    mxArray * vflops = mclGetUninitializedArray();
    mxArray * voptnrm = mclGetUninitializedArray();
    mxArray * vpcg = mclGetUninitializedArray();
    mxArray * vpos = mclGetUninitializedArray();
    mxArray * vval = mclGetUninitializedArray();
    mxArray * warnstr = mclGetUninitializedArray();
    mxArray * x = mclGetUninitializedArray();
    mxArray * xold = mclGetUninitializedArray();
    mclValidateInputs(
      "optim/private/snls",
      12,
      &funfcn,
      &xstart,
      &l,
      &u,
      &verb,
      &options,
      &fval,
      &JACval,
      &YDATA,
      &caller,
      &Jstr,
      &computeLambda);
    mclCopyArray(&xstart);
    mclCopyArray(&l);
    mclCopyArray(&u);
    /*
     * %SNLS  Sparse nonlinear least squares solver.
     * %   
     * %   Locate a local solution
     * %   to the box-constrained nonlinear least-squares problem:
     * %
     * %              min { ||F(x)||^2 :  l <= x <= u}.
     * %
     * %   where F:R^n -> R^m, m > n, and || || is the 2-norm.
     * %
     * % x=SNLS(fname,xstart) solves the unconstrained nonlinear least
     * % squares problem. The vector function is 'fname' and the
     * % starting point is xstart. 
     * %
     * % x=SNLS(fname,xstart,options) solves the unconstrained or
     * % box constrained nonlinear least squares problem. Bounds and
     * % parameter settings are handled through the named parameter list
     * % options.
     * %
     * % x=SNLS(fname,xstart,options,Jstr) indicates the structure
     * % of the sparse Jacobian matrix -- sparse finite differencing
     * % is used to compute the Jacobian when Jstr is not empty.
     * %
     * % x=SNLS(fname,xstart,options,Jstr,fdata) supplies a matrix
     * % fdata to the objective function fdata.o%
     * %
     * % [x,fvec] =SNLS(fname,xstart, ...)  returns the final value of the
     * % vector function F.
     * %
     * % [x,fvec,gopt] = SNLS(fname,xstart, ...) returns the first-order
     * % optimality vector.
     * %
     * % [x,fvec,gopt,it] = SNLS(fname,xstart, ...) returns the number of
     * % major iterations used.
     * %
     * % [x,fvec,gopt,it,npcg] =  SNLS(fname,xstart, ...) returns the
     * % total number of CG iterations used.
     * %
     * % [x,fvec,gopt,it,npcg,ex] = SNLS(fname,xstart, ...) returns the 
     * % termination code.
     * 
     * %   Copyright (c) 1990-98 by The MathWorks, Inc.
     * %   $Revision: 1.16 $  $Date: 1998/09/11 19:29:49 $
     * 
     * %   Extract input parameters etc.
     * l=l(:); u = u(:);
     */
    mlfAssign(&l, mlfIndexRef(l, "(?)", mlfCreateColonIndex()));
    mlfAssign(&u, mlfIndexRef(u, "(?)", mlfCreateColonIndex()));
    /*
     * xcurr=xstart;  % save shape of xstart for user function
     */
    mlfAssign(&xcurr, xstart);
    /*
     * xstart = xstart(:);  % make it a vector
     */
    mlfAssign(&xstart, mlfIndexRef(xstart, "(?)", mlfCreateColonIndex()));
    /*
     * 
     * %   Initialize
     * dnewt = []; fdata = [];
     */
    mlfAssign(&dnewt, mclCreateEmptyArray());
    mlfAssign(&fdata, mclCreateEmptyArray());
    /*
     * A = []; 
     */
    mlfAssign(&A, mclCreateEmptyArray());
    /*
     * fvec = []; 
     */
    mlfAssign(fvec, mclCreateEmptyArray());
    /*
     * gopt = [];
     */
    mlfAssign(&gopt, mclCreateEmptyArray());
    /*
     * n = length(xstart); 
     */
    mlfAssign(&n, mlfLength(xstart));
    /*
     * it= 1;  
     */
    mlfAssign(&it, mlfScalar(1.0));
    /*
     * numFunEvals = 1;  % done in calling function lsqnonlin
     */
    mlfAssign(&numFunEvals, mlfScalar(1.0));
    /*
     * numGradEvals = 1; % done in calling function
     */
    mlfAssign(&numGradEvals, mlfScalar(1.0));
    /*
     * totls = 0;
     */
    mlfAssign(&totls, mlfScalar(0.0));
    /*
     * header = sprintf(['\n                                         Norm of      First-order \n',...
     */
    mlfAssign(
      &header,
      mlfSprintf(
        NULL,
        mlfHorzcat(
          mxCreateString(
            "\\n                                  "
            "       Norm of      First-order \\n"),
          mxCreateString(
            " Iteration  Func-count     f(x)          s"
            "tep          optimality   CG-iterations"),
          NULL),
        NULL));
    /*
     * ' Iteration  Func-count     f(x)          step          optimality   CG-iterations']);
     * formatstr = ' %5.0f      %5.0f   %13.6g  %13.6g   %12.3g      %7.0f';
     */
    mlfAssign(
      &formatstr,
      mxCreateString(" %5.0f      %5.0f   %13.6g  %13.6g   %12.3g      %7.0f"));
    /*
     * 
     * if n == 0, 
     */
    if (mlfTobool(mlfEq(n, mlfScalar(0.0)))) {
        /*
         * error('n must be positive'), 
         */
        mlfError(mxCreateString("n must be positive"));
    /*
     * end
     */
    }
    /*
     * 
     * if isempty(l), 
     */
    if (mlfTobool(mlfIsempty(l))) {
        /*
         * l = -inf*ones(n,1); 
         */
        mlfAssign(
          &l, mlfMtimes(mlfUminus(mlfInf()), mlfOnes(n, mlfScalar(1.0), NULL)));
    /*
     * end
     */
    }
    /*
     * if isempty(u), 
     */
    if (mlfTobool(mlfIsempty(u))) {
        /*
         * u = inf*ones(n,1); 
         */
        mlfAssign(&u, mlfMtimes(mlfInf(), mlfOnes(n, mlfScalar(1.0), NULL)));
    /*
     * end
     */
    }
    /*
     * arg = (u >= 1e10); 
     */
    mlfAssign(&arg, mlfGe(u, mlfScalar(1e10)));
    /*
     * arg2 = (l <= -1e10);
     */
    mlfAssign(&arg2, mlfLe(l, mlfScalar(-1e10)));
    /*
     * u(arg) = inf;
     */
    mlfIndexAssign(&u, "(?)", arg, mlfInf());
    /*
     * l(arg2) = -inf;
     */
    mlfIndexAssign(&l, "(?)", arg2, mlfUminus(mlfInf()));
    /*
     * if any(u == l) 
     */
    if (mlfTobool(mlfAny(mlfEq(u, l), NULL))) {
        /*
         * errmsg=sprintf('%s',...
         */
        mlfAssign(
          &errmsg,
          mlfSprintf(
            NULL,
            mxCreateString("%s"),
            mxCreateString("Equal upper and lower bounds not permitted."),
            NULL));
        /*
         * 'Equal upper and lower bounds not permitted.');
         * error(errmsg)
         */
        mlfError(errmsg);
    /*
     * elseif min(u-l) <= 0
     */
    } else if (mlfTobool(
                 mlfLe(
                   mlfMin(NULL, mlfMinus(u, l), NULL, NULL), mlfScalar(0.0)))) {
        /*
         * error('Inconsistent bounds.')
         */
        mlfError(mxCreateString("Inconsistent bounds."));
    /*
     * end
     */
    }
    /*
     * if min(min(u-xstart),min(xstart-l)) < 0
     */
    if (mlfTobool(
          mlfLt(
            mlfMin(
              NULL,
              mlfMin(NULL, mlfMinus(u, xstart), NULL, NULL),
              mlfMin(NULL, mlfMinus(xstart, l), NULL, NULL),
              NULL),
            mlfScalar(0.0)))) {
        /*
         * xstart = startx(u,l);    
         */
        mlfAssign(&xstart, mlfOptim_private_startx(u, l));
    /*
     * end
     */
    }
    /*
     * 
     * %
     * % get options out
     * active_tol = optimget(options,'ActiveConstrTol',sqrt(eps));
     */
    mlfAssign(
      &active_tol,
      mlfOptimget(
        options, mxCreateString("ActiveConstrTol"), mlfSqrt(mlfEps())));
    /*
     * gradflag =  strcmp(optimget(options,'Jacobian'),'on');
     */
    mlfAssign(
      &gradflag,
      mlfStrcmp(
        mlfOptimget(options, mxCreateString("Jacobian"), NULL),
        mxCreateString("on")));
    /*
     * typx = optimget(options,'typicalx') ;
     */
    mlfAssign(&typx, mlfOptimget(options, mxCreateString("typicalx"), NULL));
    /*
     * % In case the defaults were gathered from calling: optimset('quadprog'):
     * numberOfVariables = n;
     */
    mlfAssign(&numberOfVariables, n);
    /*

⌨️ 快捷键说明

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