Optimization[LSSolve](Matrix Form) - 行列の形で与えれれる最小二乗問題を解く
使い方
LSSolve([c, G], lc, bd, opts)
LSSolve([n, q], p, nc, nlc, lc, bd, opts)
LSSolve([n, q], p, lc, bd, opts)
パラメータ
c - ベクトル; 線形最小二乗ベクトル
G - 行列; 線形最小二乗行列
lc - (オプション) リスト; 線形制約条件
bd - (オプション) リスト; 境界条件
n - 正の整数; 変数の個数
q - 正の整数; 残差の個数
p - 手続き; 最上二乗目的関数
nc - (オプション) 非負整数; 制約条件の個数のリスト
nlc - (オプション) 手続き; 非線形制約条件
opts - (オプション) option = value は次の形。 option は assume, constraintjacobian, feasibilitytolerance, infinitebound, initialpoint, iterationlimit, method, objectivejacobian, optimalitytolerance, または output
|
説明
|
|
•
|
LPSolve コマンドはのもと以下で示す形ののを計算する (LS) 問題を解きます。
問題でない限り、的最小値を返します。
|
•
|
LSSolve は次の形で与えられる線形制約条件つき線形 LS 問題を解きます。
|
|
最小化 (1/2) ||c - G x||^2
制約条件
A x <= b (線形不等式制約条件)
Aeq x = beq (線形等式制約条件)
bl <= x <= bu (境界条件)
|
|
ただし、x は変数ベクトル ; c, b, beq, bl および bu はベクトル、および G, A および Aeq は行列です。
|
|
LSSolve はまた次の形で与えられる非線形 LS 問題を解きます。
|
|
最小化 F(x) = (1/2)(f1(x)^2 + f2(x)^2 + ... + fq(x)^2)
制約条件
v(x) <= 0 (非線形不等式制約条件)
w(x) = 0 (非線形等式制約条件)
A x <= b (線形不等式制約条件)
Aeq x = beq (線形等式制約条件)
bl <= x <= bu (境界条件)
|
|
ただし、fi(x) は x の実関数;v(x) と w(x) は x の関数ベクトル;他の要素は上で説明したものです。LSSolve により使われる算法は fi(x) および制約条件が 2 階連続微分可能であることを仮定します。LSSolve はこの条件を満たさなくても計算できることがあります。
|
•
|
線形制約条件つき線形 LS 問題について使い方を考えます。第 1 引数 [c, G] はベクトルと行列のリストで与えます。
第 2 引数 lc は線形制約条件のリストでオプションとして与えます。一般には A と Aeq を行列、b と beq をベクトルとするとき、[A, b, Aeq, beq] の形で与えます。不等式または等式制約条件がない場合、別の形で与えることができます。線形制約条件の入力方法について詳しくは、Optimization/MatrixForm を参照ください。
第 3 引数 bd は上界と下界のリスト [bl, bu] でオプションとして与えます。bl と bu は n 次元でなければいけません。Optimization/MatrixForm には境界条件がない場合の代わりの形および、ベクトルのよりよい入力について述べられています。
はじめ、変数は非負であることを仮定しませんが、assume = nonnegative オプションで指定することができます。
|
•
|
非線形 LS 問題の使い方についてです。各引数の入力方法については Optimization/MatrixForm を参照ください。
第 1 引数 [n, q] は残差の数係数と変数の係数をあらわすリストを入力します。
第 2 引数 p は残差の値を計算する手続き proc(x, y) ... end proc です。ベクトル x を入力し y に f1(x), f2(x), ..., fq(x) の値を返します。
第 3 引数 nc は非線形不等式制約条件および非線形不等式制約条件の数のリストです。等式制約条件がない場合、nc は非線形不等式制約条件の数を入力します。
第 4 引数 nlc は非線形制約条件をあらわす手続き proc(x, y) ... end proc です。ベクトル x の値に対して v(x) および w(x) の値をベクトルパラメータ y で返す手続きです。
第 5 引数 lc は線形制約条件であり、第 6 引数 bd は境界条件です。
|
•
|
残差が非線形で非線形制約条件がないとき、 nc and nlc は省略することができます。
|
•
|
Maple は解として最小値 (最大値) とそれを満たす点 (極値) のリストを返します。output = solutionmodule オプションを指定されているときは、モジュールを返します。詳しくは Optimization/Solution を参照ください。
|
|
|
注意
|
|
•
|
assume = nonnegative -- すべての変数を非負と仮定します。
|
•
|
feasibilitytolerance = realcons(positive) -- 許容できる誤差の量を指定します。
|
•
|
infinitebound = realcons(positive) -- infinitebound より大きい値を infinity とみなします。
|
•
|
initialpoint = list(numeric) -- 初期点を n 次元ベクトルで与えます。
|
•
|
iterationlimit = posint -- 最大反復回数を指定します。
|
•
|
optimalitytolerance = realcons(positive) -- 最適な値を見つけるため精度を指定します。このオプションは線形問題で使うことができません。
|
|
|
注意
|
|
•
|
LSSolve コマンドは Numerical Algorithms Group (NAG) によって組み込まれたいろいろな算法を使います。詳しくは Optimization/Methods を参照ください。ソルバは反復法であり初期点を必要とします。非線形計画問題の解は選んだ点に依存するので、initialpoint オプション使って指定することを推奨します。指定しない場合は点を自動的に生成します。
|
•
|
計算は浮動小数で行います。それゆえデータは実数で与える必要があり、また正確な値を入力しても結果は浮動小数で返されます。最適な計算を行うためには、ベクトルおよび行列を datatype = float のオプションで構成し、 evalhf の上で計算を行います。ソルバは複素数が出てくるとエラーを出すので、ある場合には目的関数および制約条件が常に実数値を取るように制約条件を追加する必要があります。最適化パッケージの数値による計算および行列に入力を使って最適な計算を行うには Optimization/Computation を参照ください。
|
•
|
非線形計画問題を解くいくつかの算法は、目的関数の微分を使うことで計算がより効率的になります。指定するためには objectivejacobian および constraintjacobian オプションを使います。算法について詳しくは Optimization/Methods を参照ください。
|
•
|
asumme=nonnegative を使うことができますが、 最適化パッケージでは一般の仮定は提供されていません。
|
•
|
条件が満たされ反復が収束したとき、答えを返します。
通常、局所的最小値を返しますが、 を返すときもあります。初期点を変えて解の妥当性を検証することを推奨します。
ときどき、ソルバは反復が収束しなくても解を返すことがありますが、この値は条件を満たしています。infolevel[Optimization] を 1 以上にすることで計算の様子をメッセージとして生成することができます。
|
•
|
LSSolve は解が見つからないときエラーを返します。そのときは初期点をまたは制約条件を減らすなどして再計算することを推奨します。
|
|
|
例
|
|
目的関数 (1/2)*((2-7*x)^2+(-3-5*x)^2) の最小値を行列の形で入力して計算するには、LSSolve を使います。
>
|
c := Vector([2,-3], datatype = float):
G := Matrix([[7],[5]], datatype = float):
LSSolve([c, G]);
|
| (4.1) |
制約条件 6*x+3*y<=1 および x<=0 のもと (1/2)*((1-x)^2+(1-y)^2+(1-z)^2) の最小値を計算します。
>
|
c := Vector([1,1,1], datatype = float):
G := Matrix([[1,0,0], [0,1,0], [0,0,1]], datatype = float):
A := Matrix([[6,3,0], [1,0,0]], datatype = float):
b := Vector([1,0], datatype = float):
lc := [A, b]:
LSSolve([c, G], lc);
|
| (4.2) |
|
|