Optimization[NLPSolve](Matrix Form) - 行列の形で与えた非線形計画問題を解く
使い方
NLPSolve(n, p, nc, nlc, lc, bd, opts)
NLPSolve(n, p, lc, bd, opts)
パラメータ
n - 正の整数; 変数の個数
p - 手続き; 目的関数
nc - (オプション) 非負整数 または 非負の数のリスト; 非線形制約条件の個数
nlc - (オプション) 手続き; 非線形制約条件
lc - (オプション) リスト; 線形制約条件
bd - (オプション) リスト; 境界条件
opts - (オプション) option = value は次の形。 option は assume, constraintjacobian, feasibilitytolerance, infinitebound, initialpoint, iterationlimit, maximize, method, objectivegradient, optimalitytolerance, または output
|
説明
|
|
•
|
NLPSolve コマンドはのもとの () を計算する (NLP) を解きます。一般に、計画問題でなければ的最小値を返します。しかし、注意の章にあるように限られた状況では的な探索をすることができます。NLP は次の形で与えられます:
|
|
最小化 (最大化) f(x)
制約
v(x) <= 0 (非線形不等式制約条件)
w(x) = 0 (非線形等式制約条件)
A x <= b (線形不等式制約条件)
Aeq x = beq (線形等式制約条件)
bl <= x <= bu (境界条件)
|
|
ただし、x は変数のベクトル;f(x) は x の実関数;v(x) とw(x) は x の関数ベクトル;b, beq, bl および bu はベクトルであり、A と Aeq は行列です。
NLPSolve により使われる算法の多くは目的関数および制約条件が 2 階連続微分可能であることを仮定します。しかし、NLPSolve はこの条件を満たさなくても計算できることがあります。
|
•
|
第 1 引数 n は変数の数です。第 2 引数 p は x をあらわす長さ n の変数ベクトルを入力したとき f(x) を返す手続きです。
第 3 引数 nc は非線形不等式制約条件および非線形等式条件のそれぞれの数ををあらわす 2 つの数のリストです。不等式制約条件がない場合、nc は線形等式条件の数を入力します。
第 4 引数 nlc は proc(x, y) ... end proc で与えられる非線形制約条件をあらわす手続きです。ベクトル x に対し w(x) に従う v(x) の値をベクトルパラメータ y で返します。
第 5 引数 lc は線形計画条件のリストを入力します。A および Aeq を行列、b および beq をベクトルとするとき、引数は [A, b, Aeq, beq] の形で与えます。線形制約条件の入力について詳しくは Optimization/MatrixForm を参照ください。
第 6 引数 bd は上界と下界のリスト [bl, bu] をオプションで入力します。bl and bu は n-次元ベクトルでなければいけません。Optimization/MatrixForm には境界条件がない場合の代わりの入力、および、ベクトルのよりよい入力について述べられています。。はじめ、変数の非負性は仮定されていませんが、assume = nonnegative オプション指定することで使うことができます。
|
•
|
非線形制約条件がない場合、nc および nlc を省略することができます。
|
•
|
Maple は解として最小値 (最大値) およびそれを満たす点 (極値) のリストを返します。output = solutionmodule オプションを指定することでモジュールを解として返します。詳しくは Optimization/Solution を参照ください。
|
|
|
オプション
|
|
•
|
assume = nonnegative -- すべての変数を非負と仮定します。
|
•
|
constraintjacobian = procedure -- 制約条件のを計算した手続きを入力するために使います。手続きを必要とする形について詳しくは Optimization/MatrixForm の非変形制約条件の章を参照ください。
|
•
|
evaluationlimit = posint -- 目的関数の評価する最大数を指定指定します。このオプションは method オプションとして、branchandbound, modifiednewton, nonlinearsimplex または quadratic を指定したときのみ使うことができます。
|
•
|
feasibilitytolerance = realcons(positive) --許容できる誤差の量を指定します。
|
•
|
infinitebound = realcons(positive) -- infinitebound より大きい値を infinity とみなします。
|
•
|
initialpoint = list(numeric) -- 初期点の指定を代数式の入力のときは varname=value のリストで、オペレータのときは n の値のリストで指定をします。2 次補間法を指定するとこのオプションは無視されます。詳しくは Optimization/Methods を参照ください。
|
•
|
iterationlimit = posint -- 反復回数の最大値を指定します。このオプションは method オプションで pcg または sqp を指定したときのみ使うことができます。
|
•
|
maximize または maximize = truefalse -- true のとき最大値を計算し、false のとき最小値を計算します。'maximize' オプションは maximize = true と同じです。はじめは maximize = false が指定されています。
|
•
|
method = branchandbound, modifiednewton, nonlinearsimplex, pcg, quadratic, または sqp -- 算法を指定します。詳しくは Optimization/Methods を参照ください。
|
•
|
nodelimit = posint --分岐木を探索するノードの最大値を指定します。このオプションは method = branchandbound オプションを指定したときのみ使うことができます。
|
•
|
objectivegradient = procedure -- 目的関数のを計算する手続きを指定するために使います。手続きを必要とする形については Optimization/MatrixForm の非線形目的関数を参照ください。
|
•
|
objectivetarget = realcons -- 目的関数が指定した値に到達したとき大域探索を終了します。このオプションは method = branchandbound オプションを指定したときのみ使うことができます。
|
•
|
optimalitytolerance = realcons(positive) -- 最適な値を見つけるため精度を指定します。
|
|
|
注意
|
|
•
|
NLPSolve コマンドは Numerical Algorithms Group (NAG) によって組み込まれたいろいろな算法を使って問題を解きます。詳しくは Optimization/Methods を参照ください。算法は反復法であり、初期点を必要とします。解は選んだ点に依存するので、initialpoint オプションを使って初期点を指定することを推奨します。指定しないときは自動的に生成します。
|
•
|
NLPSolve コマンドは 1 つの変数について境界条件が与えられ制約条件がない場合大域探索を使います。method = branchandbound オプションによって指定し、大域解を返します。
|
•
|
計算は浮動小数上で行います。データは realcons の型で与える必要があり、また問題が正確に与えられたとしても解は浮動小数で返されます。最適な計算を行うためには、ベクトルおよび行列は datatype = float オプションを用いて構成し、すべての手続きは evalh を使って行います。複素数を入力するとソルバはエラーを出すので、目的関数および制約条件は実数値をとる必要があります。最適化パッケージでの数値での計算、および行列の形の入力でよりより計算をする方法について詳しくは Optimization/Computation を参照ください。
|
•
|
算法によっては、NLPSolve をより効率的にするために、objectivegradient および constraintjacobian オプションを使って目的関数および制約条件のそれぞれの微分の入力を推奨します。微分を使う算法について詳しくは Optimization/Methods を参照ください。
|
•
|
assume = nonnegative は指定できますが、最適化パッケージで一般に使われるような仮定は提供されていません。
|
•
|
条件が満たされ反復が収束したとき、答えを返します。
通常、局所的最小値を返しますが、 を返すときもあります。初期点を変えて解の妥当性を検証することを推奨します。
ときどき、ソルバは反復が収束しなくても解を返すことがありますが、この値は条件を満たしています。infolevel[Optimization] を 1 以上にすることで計算の様子をメッセージとして生成することができます。
線形計画問題に対する問題でないとき、非線形の場合の有界でないことを決めることは難しく NLPSolve は警告を出します。解の値が大きくなったり小さくなる場合、解が有界でない可能性があります。
|
•
|
NLPSolve は解がないときエラーを返し、そのときは違う初期点で再度計算することやパラメータを減らすことを推奨します。
|
|
|
例
|
|
例は行列の形で与え非線形計画問題の与え方を説明し、NLPSolve コマンドを使って解きます。
目的関数 w^3*(v-w)^2+(w-x-1)^2+(x-y-2)^2+(y-z-3)^2 と制約条件 w+x+y+z<=5 および 3*z+2*v-3=0 を考えます。
変数 v, x, w, y および z を要素とするパラメータベクトル V を使って目的関数の手続きをあらわします。
>
|
p := proc (V)
V[3]^3*(V[1]-V[3])^2+(V[3]-V[2]-1)^2+
(V[2]-V[4]-2)^2+(V[4]-V[5]-3)^2
end proc:
|
上で推奨したように、目的関数の勾配を objectivegradient を使って入力します。他に VectorCalculus[Gradient] のようなコマンドが手続きの構成に役立ちます。
>
|
objgrd := proc (V, W)
W[1] := 2*V[3]^3*(V[1]-V[3]);
W[2] :=-2*V[3]+4*V[2]-2-2*V[4];
W[3] := 3*V[3]^2*(V[1]-V[3])^2-2*V[3]^3*(V[1]-V[3])+
2*V[3]-2*V[2]-2;
W[4] :=-2*V[2]+4*V[4]-2-2*V[5];
W[5] :=-2*V[4]+2*V[5]+6
end proc:
|
行列の形で線形制約条件をあらわします。
>
|
A := Matrix([[0,1,1,1,1]], datatype = float):
b := Vector([5], datatype = float):
Aeq := Matrix([[2,0,0,0,3]], datatype = float):
beq := Vector([3], datatype = float):
lc := [A, b, Aeq, beq]:
|
非負変数のもと NLPSolve を使って問題を解きます。
>
|
Optimization[NLPSolve](5, p, lc, objectivegradient = objgrd, assume = nonnegative);
|
| (4.1) |
|
|
参照
|
|
evalhf, Optimization, Optimization/Computation, Optimization[LPSolve], Optimization[LSSolve], Optimization[NLPSolve], Optimization[QPSolve], Optimization/MatrixForm, Optimization/Methods, Optimization/Options, Optimization/Solution, realcons
|
|