このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
目的関数または制約関数は独立変数のほかにパラメーターをもつことがあります。追加パラメーターではデータを使用したり,最適化中に変化しない変数を表したりできます。これらのパラメーターを渡す方法は3つあります。
グローバル変数は,関数内で名前を再利用することができないので注意深く記述しなければなりません。そのため他の2つの方法のどちらかを使用することを推奨します。
一般的に,問題ベースの最適化の場合,自然な方法で追加パラメーターを渡します。詳細は,問題ベースのアプローチでの追加パラメーターの受け渡しを参照してください。
たとえば,次の関数を最小化するとします。
(1) |
a、bおよびcの異なる値に対して最小化を行います。ソルバーは目的関数を受け入れ,この目的関数は1つの変数(この場合はx)にのみ従属します。以下の節は追加パラメーターa, b, cを与える方法を説明します。解法は,パラメーター値一个= 4,b = 2.1,c = 4とし,fminunc
を使用してx0= (0.5 - 0.5)の近くで解きます。
無名関数を使用してパラメーターを渡します。
以下のコードを含むファイルを記述します。
函数y = parameterfun (x, a, b, c) y = x (a - b * (1) ^ 2 + x (1) ^ 4/3) * x (1) ^ 2 + x(1) *(2) +…(- c + c * x (2) ^ 2) * x (2) ^ 2;
MATLAB®プロンプトに以下のコマンドを入力し,パラメーターに値を代入し,無名関数に関数ハンドルf
を定義します。
= 4;b = 2.1;c = 4;%赋值参数x0 = [0.5,0.5];f = @ (x) parameterfun (x, a, b, c);
無名関数を使ってソルバーfminunc
を呼び出します。
[x, fval] = fminunc (f, x0)
局部最小值。优化完成,因为梯度的大小小于默认值的功能公差。X = -0.0898 0.7127 fval = -1.0316
メモ
無名関数に渡されるパラメーターは以下になり,無名関数が作成されたときには存在します。例を考えてみましょう。
= 4;b = 2.1;c = 4;f = @ (x) parameterfun (x, a, b, c)
次に一个
を3に変更して実行します。
[x, fval] = fminunc (f, x0)
parameterfun
では一个= 4
(f
が作成された時の値)が使用されるため,解は変更前と同じになります。
関数に渡すパラメーターを変更するには,無名関数を入力しなおして新たに無名関数を作成します。
= 3;f = @ (x) parameterfun (x, a, b, c)
複数の引数をもつ無名関数を作成できます。たとえば,lsqcurvefit
を使用するために2つの入力引数x
とxdata
をもつ関数を作成します。
跳频= @ (x, xdata) (sin (x)。* xdata + (x ^ 2)。* cos (xdata));x =π;xdata =π*(4;2、3);Fh (x, xdata) ans = 9.8696 9.8696 -9.8696
lsqcurvefit
を呼び出します。x = lsqcurvefit(fh,x,xdata,ydata)
入れ子関数を使って式 1にパラメーターを渡すには以下のような1つのファイルを記述します。
一个
、b
、c
、x0
を入力とする
入れ子関数として目的関数を指定する
fminunc
を呼び出す
以下はこの例の関数ファイルのコードです。
函数[x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0);%计算目标函数的嵌套函数函数y =嵌套fun(x) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) +…(- c + c * x (2) ^ 2) * x (2) ^ 2;结束结束
nestedfun
です。この関数は変数一个
、b
、c
にアクセスします。
最適化を実行するために以下を入力します。
= 4;b = 2.1;%赋值参数x0 = [0.5,0.5];[x, fval] = runnested (a, b, c, x0)
グローバル変数はトラブルの原因となるため,なるべく利用しないことをお薦めします。また,グローバル変数は並列計算では失敗します。詳細は,結果に影響を与える要因を参照してください。
グローバル変数を使用するには,ワークスペースと(グローバル変数を使用する)関数で変数がグローバルになることを宣言します。
次の関数ファイルを書き込みます。
函数y = globalfun全球a b c (x) y = x (a - b * (1) ^ 2 + x (1) ^ 4/3) * x (1) ^ 2 + x(1) *(2) +…(- c + c * x (2) ^ 2) * x (2) ^ 2;
MATLABワークスペースで変数を定義し,fminunc
を実行します。
全局a、b、c;= 4;b = 2.1;c = 4;%赋值参数x0 = [0.5,0.5];[x, fval] = fminunc (x0 @globalfun)
出力結果は無名関数と同じです。