2013-02-18 11 views
5

私はMatlabで関数を最適化する関数を持っています。この関数は、最適化する必要のある変数(xなど)と、最適化する必要のない1つのパラメータ(たとえばQ)に依存します。関数Function(x、Q)。言い換えれば、私はQの値の配列を持っており、各Qの最適なx値を見つけたいと思いますが、最適化関数で関数ハンドル@Functionを使用すると、それらのQ値を渡す方法を見つけることができません。Matlabの関数ハンドルを介して追加の引数を渡す

私の質問は、たとえば、fmincon(@ Function、x0、A、b)のような最適化関数で関数ハンドルを使用するときに、それらのQ値を渡す方法ですか?

+1

は 'のfmincon(@関数、X0、Q、Aい、b) '仕事? –

+0

@DennisJaheruddinいいえ、動作しません。残念ながら。 – Tomas

答えて

4

匿名関数使用してみてください:MATLABのドキュメントで説明したよう

x = cell(1, numel(Q)); 
for qi = 1:numel(Q) 
    x{qi} = fmincon(@(x) Function(x, Q(qi)), A, b); 
end 
+1

ありがとう、それは魅力のように働いた! – Tomas

4

を、この問題の3つのソリューション実際にあります。

  1. 無名関数はShai's answerに記述されている
    この投稿の
  2. ネストされた関数
    このアプローチでは、外部関数はすべての引数を受け入れ、内部関数は最適化のためのパラメータのみを受け入れます。
    これは、MATLABドキュメントから取った例である:あなたがワークスペースにglobalとして目的関数に必要なパラメータを定義し、それらを宣言すると、目的関数でそれらを使用する必要があり、このアプローチでは function [x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0); % Nested function that computes the objective function function y = nestedfun(x) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) +... (-c + cx(2)^2)*x(2)^2; end end
  3. グローバル変数
    グローバルとしてここ
    は、MATLABドキュメントから再び例である:目的関数を定義
    • function y = globalfun(x) global a b c y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) + ... (-c + cx(2)^2)*x(2)^2; end
    • 最適化: global a b c; a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; [x,fval] = fminunc(@globalfun,x0)
関連する問題