主要内容

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

追加パラメーターの受け渡し

追加パラメーター、固定変数、またはデータ

目的関数または制約関数は独立変数のほかにパラメーターをもつことがあります。追加パラメーターではデータを使用したり、最適化中に変化しない変数を表したりできます。これらのパラメーターを渡す方法は 3.つあります。

グローバル変数は、関数内で名前を再利用することができないので注意深く記述しなければなりません。そのため他の 2.つの方法のどちらかを使用することを推奨します。

一般的に、問題ベースの最適化の場合、自然な方法で追加パラメーターを渡します。詳細は、問題ベースのアプローチでの追加パラメーターの受け渡しを参照してください。

たとえば、次の関数を最小化するとします。

F ( x ) = ( A. B x 1. 2. + x 1. 4. / 3. ) x 1. 2. + x 1. x 2. + ( C + C x 2. 2. ) x 2. 2. (1)

a、 乙,および Cの異なる値に対して最小化を行います。ソルバーは目的関数を受け入れ、この目的関数は 1.つの変数 (この場合は 十)にのみ従属します。以下の節は追加パラメーター a、 b,cを与える方法を説明します。解法は、パラメーター値a=4,b=2.1,c=4とし、fminuncを使用してx0= [0.5 0.5]の近くで解きます。

無名関数

無名関数を使用してパラメーターを渡します。

  1. 以下のコードを含むファイルを記述します。

    函数y=parameterfun(x,a,b,c)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;

  2. MATLAB®プロンプトに以下のコマンドを入力し、パラメーターに値を代入し、無名関数に関数ハンドルFを定義します。

    a=4;b=2.1;c=4;%分配参数值x0=[0.5,0.5];f=@(x)参数fun(x,a,b,c);

  3. 無名関数を使ってソルバーfminuncを呼び出します。

    [x,fval]=fminunc(f,x0)
    以下の出力がコマンド ウィンドウに表示されます。
    找到局部最小值。已完成优化,因为渐变的大小小于函数公差的默认值。x=-0.0898 0.7127 fval=-1.0316

メモ

無名関数に渡されるパラメーターは以下になり、無名関数が作成されたときには存在します。例を考えてみましょう。

a=4;b=2.1;c=4;f=@(x)参数fun(x,a,b,c)

次にA.を 3.に変更して実行します。

[x,fval]=fminunc(f,x0)

参数乐趣ではa=4(Fが作成された時の値) が使用されるため、解は変更前と同じになります。

関数に渡すパラメーターを変更するには、無名関数を入力しなおして新たに無名関数を作成します。

a=3;f=@(x)参数fun(x,a,b,c)

複数の引数をもつ無名関数を作成できます。たとえば、最小二乘拟合を使用するために、2.つの入力引数x外部数据存储器をもつ関数を作成します。

fh=@(x,扩展数据)(sin(x)。*xdata+(x.^2)。*cos(扩展数据));x=pi;xdata=pi*[4;2;3];fh(x,扩展数据)ans=9.8696 9.8696-9.8696
次に最小二乘拟合を呼び出します。
%假设ydata存在x=lsqcurvefit(fh,x,扩展数据,ydata)

入れ子関数

入れ子関数を使って式 1.にパラメーターを渡すには以下のような 1.つのファイルを記述します。

  • A.BCx0を入力とする

  • 入れ子関数として目的関数を指定する

  • fminuncを呼び出す

以下はこの例の関数ファイルのコードです。

函数[x,fval]=runnested(a,b,c,x0)[x,fval]=fminunc(@nestedfun,x0);%计算目标函数y=nestedfun(x)y=(a-b*x(1)^2+x(1)^4/3)*x(1)^2+x(1)*x(2)+…(-c+c*x(2)^2)^2;结束
目的関数は入れ子関数雀巢乐趣です。この関数は変数A.BCにアクセスします。

最適化を実行するために以下を入力します。

a=4;b=2.1;c=4;%分配参数值x0=[0.5,0.5];[x,fval]=runnested(a,b,c,x0)
出力結果は無名関数と同じです。

グローバル変数

グローバル変数はトラブルの原因となるため、なるべく利用しないことをお薦めします。また、グローバル変数は並列計算では失敗します。詳細は、結果に影響を与える要因を参照してください。

グローバル変数を使用するには、ワークスペースと (グローバル変数を使用する) 関数で変数がグローバルになることを宣言します。

  1. 次の関数ファイルを書き込みます。

    函数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+c*x(2)^2)*x(2)^2;

  2. MATLABワークスペースで変数を定義し、fminuncを実行します。

    全局a b c;a=4;b=2.1;c=4;%分配参数值x0=[0.5,0.5];[x,fval]=fminunc(@globalfun,x0)

出力結果は無名関数と同じです。

関連するトピック