以前に MATLAB で使用した Octave の fminsearch 関数を使用しようとしています。この関数は (少なくとも私にとっては) 十分に文書化されていないようで、実際に最小化するようにオプションを設定する方法がわかりません。
このメッセージの最後にあるコードを使用して、非常に単純な指数関数を当てはめてみました。次のことが必要です:
MATLAB と同じように、関数が x 値と y 値を入力として受け取るようにします。さらに、オプションをある程度制御して、実際に最小化するようにします (つまり、最小化します!)。
もちろん、最終的には指数関数よりも複雑な関数を当てはめたいと思っていますが、少なくとも指数関数を当てはめたいと思っています。
fminsearch にはいくつかの問題があります。
x値とy値を関数に渡そうとしましたが、次のようなmatlabスタイルのものです:
[xx,fval]=fminsearch(@exponential,[1000 1],x,y);
また
[xx,fval]=fminsearch(@exponential,[33000 1],options,x,y)
エラーが発生します:
エラー: options(6) は既知のアルゴリズムに対応していません
エラー: 呼び出し元:
エラー: /opt/local/share/octave/packages/optim-1.0.6/fmins.m 行 72、列 16
エラー: /opt/ local/share/octave/packages/optim-1.0.6/fminsearch.m 29 行目、4 列目または、それぞれ (上記の 2 番目のケースの場合):
エラー: 行 4 列 3 付近で「x」が未定義
エラー: 呼び出し元:
エラー: 行 4、列 2 の
/Users/paul/exponential.m エラー: /opt/local/share/octave/packages/optim-1.0.6 /nmsmax.m 行 63、列 6
エラー: /opt/local/share/octave/packages/optim-1.0.6/fmins.m 行 77、列 9
エラー: /opt/local/share/octave/packages /optim-1.0.6/fminsearch.m 29 行目、4 列目どうやら、引数を
fminsearch
取る順序が MATLAB のものとは異なります。さて、この順番は??値とオプションを取得
するにはどうすればよいですか?fminsearch
関数が値を取らないという問題の回避策を見つけました。x 値と y 値をグローバルとして定義しました。エレガントではありませんが、少なくとも関数で値を使用できます。
それにもかかわらず、fminsearch
適切に最小化されません。
これを以下に示します。関数は次のとおりです。
function f=exponential(coeff) global x global y X=x; Y=y; a= coeff(1); b= coeff(2); Y_fun = a .* exp(-X.*b); DIFF = Y_fun - Y; SQ_DIFF = DIFF.^2; f=sum(SQ_DIFF); end
コードは次のとおりです。
global x global y x=[0:1:200]; y=4930*exp(-0.0454*x); options(10)=10000000; [cc,fval]=fminsearch(@exponential,[5000 0.01])
これは出力です:
cc =
4930.0 5184.6
fval = 2.5571e+08
なぜ
fminsearch
解決策が見つからないのですか?