フィッティングの問題で困っています。私が得たエラーから、境界が正しく定義されておらず、解決策を見つけることができなかったと思います。どんな助けでも大歓迎です。
同じ問題を解決するための別の方法も受け入れられます。
説明
次のタイプの非線形関数のパラメーターを推定する必要があります。
A*y(x) + B*EXP(C*y(x)) + g(x,D) = 0
パラメータPAR = [A,B,C,D]
が範囲内にあることを前提としています
LB < PAR < UB
コード
問題を解決するために、Matlab 関数lsqnonlin
とを使用していますfzero
。使用された単純化されたコードを以下に報告します。
問題は次の 4 つの関数に分けられます。
parameterEstimation
- (lsqnonlin 関数のラッパー)objectiveFunction_lsq
- (パラメータ推定の目的関数)yFun
- (変数 y の値を返す関数)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;