変数と初期条件

関数FindMinimumFindMaximumFindRootはすべて同じ形式で変数を指定する.関数FindFitはパラメータの指定に同じ形式を使う.

FindMinimum[f,vars]vars で与えられる変数について,f の極小値を求める
FindMaximum[f,vars]vars で与えられる変数について,f の極大値を求める
FindRoot[f,vars]vars で与えられる変数について,根 を求める
FindRoot[eqns,vars]vars で与えられる変数について,方程式 eqns の根を求める
FindFit[data,expr,pars,vars]dataexpr が最高のフィットを与えるようにするパラメータ pars の値を vars の関数として求める

関数の変数とパラメータ.

リスト varsFindFitでは pars)は個別の変数指定のリストでなければならない.各変数指定は次の形式でなければならない.

{var,st}変数 var が初期値 st を持つ
{var,st1,st2}変数 var が2つの初期値 を持つ.2番目の初期条件は主軸法と割線法でしか用いられない
{var,st,rl,ru}変数 var が初期値 st を持つ.探索は var の値が区間の外に出ると終了される
{var,st1,st2,rl,ru}変数 var が2つの初期値 を持つ.探索は var の値が区間の外に出ると終了される

関数における個々の変数の指定.

vars の指定にはすべて,同じ数の初期値が含まれていなければならない.領域の境界が指定されていないときは,有界ではない,すなわち とみなされる.

ベクトル値と行列値の変数

変数の最も一般的な使用法は,数を表すことである.しかし,変数入力文法はベクトル,行列,高階のテンソルとして扱われる変数もサポートする.一般に,コマンドでは,変数は,それに与えられた初期条件と同じ矩形構造をした値を取るものと見なされている.FindFitの場合は例外で,現在スカラー変数しか使えない.

これは行列である.
In[1]:=
Click for copyable input
FindRootを使っての固有値と,それに対応する正規化された固有ベクトルを求める.
In[2]:=
Click for copyable input
Out[2]=

もちろん,これが固有値を求める最高の方法ではないが,どのようにして初期値から変数の次元が拾われるのかは示している. の初期値は1なので,スカラーであると見なされる.一方 に与えられた初期値は長さ3のベクトルなので,こちらは常に長さ3のベクトルであると見なされる.

変数に複数の初期値を使う場合は,それらの値の次元が一定であること,また初期値の各要素が互いに異なっていることが必要である.

以下では各変数に2つの初期条件を用いて,異なる固有値を求めている.
In[3]:=
Click for copyable input
Out[3]=

ベクトル値と行列値が取れる変数の利点のひとつは,大規模問題および/または異なるサイズの問題の自動処理に非常に効率がよい関数が書けることである.

以下でUnconstrainedProblemsパッケージの問題に相当する目的関数を与える関数を定義する.この関数は,値として2行の行列である を想定している.
In[4]:=
Click for copyable input

の構造が正しくなければ関数の値は無意味なので,この定義はその構造を持つ引数に限られる.例えば,関数を任意のパターンについて定義し,次いで未定義のシンボルで評価すると(FindMinimumが行うのはこういうことである),予期せぬ無意味な結果が返される.ベクトル値の変数についての関数を使っている場合は,しばしば定義を制限しなければならないことがある.上記の定義は正しい構造の記号的な値は排除しない点に注意のこと.例えばはスカラー , ...に対して関数の記号的な表記を与える.

以下では,問題のサイズに対して標準的な値があたえられると,FindMinimumを使って問題を解く.異なるサイズの問題を解くときは,他の何も変えずに の値だけを変更することができる.
In[5]:=
Click for copyable input
Out[7]=

Mathematica がこの関数の記号導関数を得ることができず,正確ではない有限差分を使わなければならなかったので,解はデフォルトの許容範囲に達していない.

ベクトル値あるいは行列値の変数を使う際の欠点は,現時点では Mathematica でこれらの記号的な導関数が計算できないという点である.正しい導関数を与える関数を展開するのがそれほど困難ではないこともある.これに失敗したが,本当にこれ以上の確度が必要である場合は,より高階の有限差分を使うことができる.

次は関数の勾配を返す関数を定義する.勾配は変数の位置に対応する行列を平坦化することで得られるベクトルである点に注意のこと.
In[8]:=
Click for copyable input
次は勾配の記号的値を使って問題を解く.
In[9]:=
Click for copyable input
Out[11]=

ヤコビ行列とヘッセ行列の導関数は疎であることが多い.適切な場合に,これらの導関数の疎な構造を指定することもできる.この指定により,全体的な解の複雑さをかなり軽減することができる.

New to Mathematica? Find your learning path »
Have a question? Ask support »