3

フィッティングの問題で困っています。私が得たエラーから、境界が正しく定義されておらず、解決策を見つけることができなかったと思います。どんな助けでも大歓迎です。

同じ問題を解決するための別の方法も受け入れられます。

説明

次のタイプの非線形関数のパラメーターを推定する必要があります。

A*y(x) + B*EXP(C*y(x)) + g(x,D) = 0

パラメータPAR = [A,B,C,D]が範囲内にあることを前提としています

LB < PAR < UB

コード

問題を解決するために、Matlab 関数lsqnonlinとを使用していますfzero。使用された単純化されたコードを以下に報告します。

問題は次の 4 つの関数に分けられます。

  1. parameterEstimation- (lsqnonlin 関数のラッパー)
  2. objectiveFunction_lsq- (パラメータ推定の目的関数)
  3. yFun- (変数 y の値を返す関数)
  4. objectiveFunction_zero- (y の計算に使用される非線形方程式の目的関数)

エラー

データに対してコードを実行すると、この警告が表示されます

警告: 下限の長さが > length(x) です。余分な境界を無視する

そしてこのエラー

ユーザーが指定した最初の目的関数の評価に失敗しました。LSQNONLIN は続行できません

これにより、境界が正しく使用されていないか、正しく呼び出されていないと思いますが、問題は別の場所にある可能性があります。


function Done = parameterEstimation()
    %read inputs
    Xmeas = xlsread('filepath','worksheet','range');
    Ymeas = xlsread('filepath','worksheet','range');

    %inital values and boundary conditions
    initialGuess = [1,1,1,1]; %model parameters initial guess
    LB = [0,0,0,0]; %model parameters lower boundaries
    UB = [2,2,2,2]; %model parameters upper boundaries

    %parameter estimation
    calcParam = lsqnonlin(@objectiveFunction_lsq_2,initialGuess,LB,UB,[],Xmeas,Ymeas);
    Done = calcParam;

function diff = objectiveFunction_lsq_2(PAR,Xmeas,Ymeas)
    y_calculated = yFun(PAR,Xmeas);
    diff = y_calculated-Ymeas;

function result = yFun(PAR,X)
    y_0 = 2;
    val = fzero(@(y)objfun_y(y,PAR,X),y_0);
    result = val;

function result = objfun_y(y,PAR,X)
    A = PAR(1);
    B = PAR(2);
    A = PAR(3);
    C = PAR(4);
    D = PAR(5);

    val = A*y+B*exp(y*C)+g(D,X);
    result = val;
4

1 に答える 1

0

私は最適化ツールボックスを持っていませんが、そのような定数を渡すことができますか?

代わりにこれを行います:

calcParam = lsqnonlin(@(PAR) objectiveFunction_lsq_2(PAR,Xmeas,Ymeas),initialGuess,LB,UB);
于 2012-11-08T13:47:46.443 に答える