亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? optim.pas

?? Delphi 的數學控件
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
          end;
        X[I] := Temp1;
      end;
  end;

  function ParamConv(OldX, X        : TVector;
                     Lbound, Ubound : Integer;
                     Tol            : Float) : Boolean;
{ ----------------------------------------------------------------------
  Check for convergence on parameters
  ---------------------------------------------------------------------- }
  var
    I : Integer;
    Conv : Boolean;
  begin
    I := Lbound;
    Conv := True;
    repeat
      Conv := Conv and (Abs(X[I] - OldX[I]) < Max(Tol, Tol * Abs(OldX[I])));
      Inc(I);
    until (Conv = False) or (I > Ubound);
    ParamConv := Conv;
  end;

  function Marquardt(Func           : TFuncNVar;
                     HessGrad       : THessGrad;
                     X              : TVector;
                     Lbound, Ubound : Integer;
                     MaxIter        : Integer;
                     Tol            : Float;
                     var F_min      : Float;
                     H_inv          : TMatrix) : Integer;
  const
    LAMBDA0   = 1.0E-2;   { Initial lambda value }
    LAMBDAMAX = 1.0E+3;   { Highest lambda value }
    FTOL      = 1.0E-10;  { Tolerance on function decrease }
  var
    Lambda,
    Lambda1   : Float;    { Marquardt's lambda }
    I         : Integer;  { Loop variable }
    OldX      : TVector;  { Old parameters }
    G         : TVector;  { Gradient vector }
    H         : TMatrix;  { Hessian matrix }
    A         : TMatrix;  { Modified Hessian matrix }
    Det       : Float;    { Determinant of A }
    DeltaX    : TVector;  { New search direction }
    F1        : Float;    { New minimum }
    Lambda_Ok : Boolean;  { Successful Lambda decrease }
    Conv      : Boolean;  { Convergence reached }
    Done      : Boolean;  { Iterations done }
    Iter      : Integer;  { Iteration count }
    ErrCode   : Integer;  { Error code }
  begin
    if WriteLogFile then
      begin
        CreateLogFile;
        WriteLn(LogFile, 'Marquardt');
        WriteLn(LogFile, 'Iter         F            Lambda');
      end;

    Lambda := LAMBDA0;

    DimVector(OldX, Ubound);
    DimVector(G, Ubound);
    DimMatrix(H, Ubound, Ubound);
    DimMatrix(A, Ubound, Ubound);
    DimVector(DeltaX, Ubound);

    F_min := Func(X);    { Initial function value }
    LinObjFunc := Func;  { Function for line minimization }

    Iter := 1;
    Conv := False;
    Done := False;

    repeat
      if WriteLogFile then
        WriteLn(LogFile, Iter:4, '   ', F_min:12, '   ', Lambda:12);

      { Save current parameters }
      CopyVector(OldX, X, Lbound, Ubound);

      { Compute Gradient and Hessian }
      HessGrad(Func, X, Lbound, Ubound, G, H);
      CopyMatrix(A, H, Lbound, Lbound, Ubound, Ubound);

      { Change sign of gradient }
      for I := Lbound to Ubound do
        G[I] := - G[I];

      if Conv then  { Newton-Raphson iteration }
        begin
          ErrCode := GaussJordan(A, G, Lbound, Ubound, H_inv, DeltaX, Det);
          if ErrCode = MAT_OK then
            for I := Lbound to Ubound do
              X[I] := OldX[I] + DeltaX[I];
          Done := True;
        end
      else          { Marquardt iteration }
        begin
          repeat
            { Multiply each diagonal term of H by (1 + Lambda) }
            Lambda1 := 1.0 + Lambda;
            for I := Lbound to Ubound do
              A[I,I] := Lambda1 * H[I,I];
            Lambda_OK := False;
            ErrCode := GaussJordan(A, G, Lbound, Ubound, H_inv, DeltaX, Det);

            if ErrCode = MAT_OK then
              begin
                { Initialize parameters }
                CopyVector(X, OldX, Lbound, Ubound);

                { Minimize in the direction specified by DeltaX }
                ErrCode := LinMin(Func, X, DeltaX,
                                  Lbound, Ubound, 100, 0.01, F1);

                { Check that the function has decreased. Otherwise
                  increase Lambda, without exceeding LAMBDAMAX }
                Lambda_Ok := (F1 - F_min) < F_min * FTOL;
                if not Lambda_Ok then Lambda := 10.0 * Lambda;
                if Lambda > LAMBDAMAX then ErrCode := OPT_BIG_LAMBDA;
              end;
          until Lambda_Ok or (ErrCode <> MAT_OK);

          { Check for convergence }
          Conv := ParamConv(OldX, X, Lbound, Ubound, Tol);

          { Prepare next iteration }
          Lambda := 0.1 * Lambda;
          F_min := F1;
        end;

      Inc(Iter);
      if Iter > MaxIter then ErrCode := OPT_NON_CONV;
    until Done or (ErrCode <> OPT_OK);

    if WriteLogFile then
      Close(LogFile);

    if ErrCode = MAT_SINGUL then ErrCode := OPT_SING;
    Marquardt := ErrCode;
  end;

  function BFGS(Func           : TFuncNVar;
                Gradient       : TGradient;
                X              : TVector;
                Lbound, Ubound : Integer;
                MaxIter        : Integer;
                Tol            : Float;
                var F_min      : Float;
                H_inv          : TMatrix) : Integer;
  var
    I, J, Iter                                              : Integer;
    DeltaXmax, Gmax, P1, P2, R1, R2                         : Float;
    OldX, DeltaX, dX, G, OldG, dG, HdG, R1dX, R2HdG, U, P2U : TVector;
    Conv                                                    : Boolean;

  function AbsMax(V : TVector; Lbound, Ubound : Integer) : Float;
  { Returns the component with maximum absolute value }
  var
    I    : Integer;
    AbsV : TVector;
  begin
    DimVector(AbsV, Ubound);
    for I := Lbound to Ubound do
      AbsV[I] := Abs(V[I]);
    AbsMax := Max(AbsV, Lbound, Ubound);
  end;

  begin
    if WriteLogFile then
      begin
        CreateLogFile;
        WriteLn(LogFile, 'BFGS');
        WriteLn(LogFile, 'Iter         F');
      end;

    DimVector(OldX, Ubound);
    DimVector(DeltaX, Ubound);
    DimVector(dX, Ubound);
    DimVector(G, Ubound);
    DimVector(OldG, Ubound);
    DimVector(dG, Ubound);
    DimVector(HdG, Ubound);
    DimVector(R1dX, Ubound);
    DimVector(R2HdG, Ubound);
    DimVector(U, Ubound);
    DimVector(P2U, Ubound);

    Iter := 0;
    Conv := False;
    LinObjFunc := Func;  { Function for line minimization }

    { Initialize function }
    F_min := Func(X);

    { Initialize inverse hessian to unit matrix }
    for I := Lbound to Ubound do
      for J := Lbound to Ubound do
        if I = J then H_inv[I,J] := 1.0 else H_inv[I,J] := 0.0;

    { Initialize gradient }
    Gradient(Func, X, Lbound, Ubound, G);
    Gmax := AbsMax(G, Lbound, Ubound);

    { Initialize search direction }
    if Gmax > MACHEP then
      for I := Lbound to Ubound do
        DeltaX[I] := - G[I]
    else
      Conv := True;  { Quit if gradient is already small }

    while (not Conv) and (Iter < MaxIter) do
      begin
        if WriteLogFile then
          WriteLn(LogFile, Iter:4, '   ', F_min:12);

        { Normalize search direction to avoid excessive displacements }
        DeltaXmax := AbsMax(DeltaX, Lbound, Ubound);
        if DeltaXmax > 1.0 then
          for I := Lbound to Ubound do
            DeltaX[I] := DeltaX[I] / DeltaXmax;

        { Save old parameters and gradient }
        CopyVector(OldX, X, Lbound, Ubound);
        CopyVector(OldG, G, Lbound, Ubound);

        { Minimize along the direction specified by DeltaX }
        LinMin(Func, X, DeltaX, Lbound, Ubound, 100, 0.01, F_min);

        { Compute new gradient }
        Gradient(Func, X, Lbound, Ubound, G);

        { Compute differences between two successive
          estimations of parameter vector and gradient vector }
        for I := Lbound to Ubound do
          begin
            dX[I] := X[I] - OldX[I];
            dG[I] := G[I] - OldG[I];
          end;

        { Multiply by inverse hessian }
        for I := Lbound to Ubound do
          begin
            HdG[I] := 0.0;
            for J := Lbound to Ubound do
              HdG[I] := HdG[I] + H_inv[I,J] * dG[J];
          end;

        { Scalar products in denominator of BFGS formula }
        P1 := 0.0; P2 := 0.0;
          for I := Lbound to Ubound do
            begin
              P1 := P1 + dX[I] * dG[I];
              P2 := P2 + dG[I] * HdG[I];
            end;

        if (P1 = 0.0) or (P2 = 0.0) then
          Conv := True
        else
          begin
            { Inverses of scalar products }
            R1 := 1.0 / P1; R2 := 1.0 / P2;

            { Compute BFGS correction terms }
            for I := Lbound to Ubound do
              begin
                R1dX[I] := R1 * dX[I];
                R2HdG[I] := R2 * HdG[I];
                U[I] := R1dX[I] - R2HdG[I];
                P2U[I] := P2 * U[I];
              end;

            { Update inverse hessian }
            for I := Lbound to Ubound do
              for J := Lbound to Ubound do
                H_inv[I,J] := H_inv[I,J] + R1dX[I] * dX[J]
                                 - R2HdG[I] * HdG[J] + P2U[I] * U[J];

            { Update search direction }
            for I := Lbound to Ubound do
              begin
                DeltaX[I] := 0.0;
                for J := Lbound to Ubound do
                  DeltaX[I] := DeltaX[I] - H_inv[I,J] * G[J];
              end;

            { Test convergence and update iteration count }
            Conv := ParamConv(OldX, X, Lbound, Ubound, Tol);
            Inc(Iter);
          end;
      end;

    if WriteLogFile then
      Close(LogFile);

    if Iter > MaxIter then
      BFGS := OPT_NON_CONV
    else
      BFGS := OPT_OK;
  end;

begin
  Eps := Power(MACHEP, 0.333);
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲第一搞黄网站| 91丨九色丨蝌蚪丨老版| 中文字幕一区日韩精品欧美| 欧美无人高清视频在线观看| www国产成人免费观看视频 深夜成人网| 国产成人一级电影| 亚欧色一区w666天堂| 另类人妖一区二区av| 7777精品伊人久久久大香线蕉 | 国产精品美女视频| 久久尤物电影视频在线观看| 久久久午夜电影| 亚洲精选在线视频| 另类专区欧美蜜桃臀第一页| 亚洲激情一二三区| 亚洲女子a中天字幕| 国产三级三级三级精品8ⅰ区| 色综合婷婷久久| 久久久久久久久久久久久女国产乱 | 激情综合色播五月| 欧美午夜宅男影院| 中文字幕日本乱码精品影院| 欧美精品免费视频| 久久久久久**毛片大全| 日韩中文字幕区一区有砖一区 | 4438x成人网最大色成网站| 久久精品久久99精品久久| 亚洲三级在线播放| 青青国产91久久久久久| 亚洲成a人在线观看| 91国偷自产一区二区使用方法| 国产精品五月天| 国产呦萝稀缺另类资源| 蜜臀久久久久久久| 亚洲国产精品久久人人爱| 亚洲欧美一区二区三区国产精品 | 欧美激情综合五月色丁香小说| 久久嫩草精品久久久精品一| 日日摸夜夜添夜夜添亚洲女人| 91激情在线视频| 99综合电影在线视频| 欧美国产日韩在线观看| 国产又黄又大久久| 国产成人亚洲精品青草天美| 久久免费的精品国产v∧| 精品国产123| 国产乱码精品一区二区三区五月婷| 美女久久久精品| 精品嫩草影院久久| 狠狠色丁香婷综合久久| 日韩一区二区三区电影| 日韩视频一区在线观看| 国产精品18久久久久久vr| 中文字幕av一区二区三区免费看| 久久久777精品电影网影网 | 欧洲一区在线电影| 成人av高清在线| 色综合夜色一区| 成人免费视频在线观看| 一区二区在线观看不卡| 欧美在线观看18| 奇米影视在线99精品| 久久尤物电影视频在线观看| 国产精品影音先锋| 中文字幕一区二区三区四区 | 懂色av一区二区夜夜嗨| 国产校园另类小说区| 久久久91精品国产一区二区精品 | 日韩美女视频19| 欧美精品丝袜中出| 精品国产一区二区三区av性色| 国产98色在线|日韩| 国产精品久久影院| 五月天网站亚洲| 久久精品夜色噜噜亚洲a∨| 欧美在线看片a免费观看| 在线播放日韩导航| 亚洲精品中文在线影院| 日韩激情av在线| 日本一区二区三区高清不卡| 亚洲黄色录像片| 久久色.com| 亚洲综合激情网| 久久久国产午夜精品| 亚洲欧美另类小说| 欧美大白屁股肥臀xxxxxx| 成人av手机在线观看| 7777精品伊人久久久大香线蕉| 看国产成人h片视频| av一区二区三区在线| 日韩精品每日更新| 自拍偷拍亚洲欧美日韩| 日本v片在线高清不卡在线观看| 国产亚洲精品bt天堂精选| 国产高清不卡二三区| 欧美日韩日日摸| 成人精品视频网站| 日韩欧美一区二区不卡| 91老师片黄在线观看| 久久综合久久99| 亚洲天堂2014| 国产精品欧美一区喷水| 精品久久国产字幕高潮| 一二三区精品福利视频| 国产精品女人毛片| 另类小说视频一区二区| 日韩一区在线看| 韩日欧美一区二区三区| 欧美一区二区黄色| 欧美专区日韩专区| 国产精品国产三级国产普通话三级| 精品国产一二三| 欧美日韩电影在线播放| 一区在线播放视频| 国产婷婷精品av在线| 久久久久久久久久久电影| 青娱乐精品视频在线| 97久久精品人人做人人爽50路| 免费观看日韩电影| 亚洲精品ww久久久久久p站| 国产三级欧美三级| 国产毛片精品一区| 精品在线播放免费| 日本特黄久久久高潮| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美a一区二区| 日韩精品一级中文字幕精品视频免费观看 | 东方aⅴ免费观看久久av| 99在线精品免费| 成人国产视频在线观看| 一区二区成人在线观看| 99久久精品99国产精品| 国产精品色在线观看| 国产精品青草久久| 欧美激情一区三区| 国产高清久久久久| 成人精品视频一区二区三区 | eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 国产69精品久久99不卡| 欧美激情综合五月色丁香| 1000部国产精品成人观看| 亚洲一区二区三区激情| 欧美性猛交xxxx黑人交| 国产精品视频第一区| 午夜精品福利视频网站| 成人h动漫精品一区二| 在线免费亚洲电影| 国产精品久久777777| 成人一级片网址| 国产成+人+日韩+欧美+亚洲| 韩日av一区二区| 国产成人啪免费观看软件| 久久九九久久九九| 国产精品第四页| 欧美在线视频你懂得| 欧美成人vps| 国产91清纯白嫩初高中在线观看| 激情深爱一区二区| 国产精品丝袜一区| 亚洲高清视频中文字幕| 日韩欧美在线影院| 日本一区二区三区国色天香 | 国产一区二区中文字幕| 日韩精品一区二区三区在线观看| 极品少妇xxxx精品少妇| 成人免费高清在线| 亚洲成人精品在线观看| 国产在线精品一区在线观看麻豆| 中文字幕av在线一区二区三区| 日本韩国欧美国产| 国产在线播放一区三区四| 国产精品久久久久9999吃药| 亚洲图片自拍偷拍| 激情综合色综合久久| 综合激情网...| 欧美精品色一区二区三区| 国产一区二区三区四区五区美女| 91在线播放网址| 午夜激情一区二区三区| 久久丝袜美腿综合| 日韩电影在线免费观看| 亚洲国产电影在线观看| 秋霞影院一区二区| 国产精品三级av| 性做久久久久久久久| 欧美国产视频在线| 91精品中文字幕一区二区三区| 精品国产一区二区三区久久影院| 99国产精品久久| 欧美www视频| 欧美在线短视频| 国产成人午夜电影网| 欧美日韩不卡一区二区| 亚洲欧美日本韩国| 久久影院午夜论| 欧美日韩免费高清一区色橹橹 | www.一区二区| 久久久综合网站| 日韩高清不卡一区二区| 国产精品理论片|