このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
lsqlin
制約付き線形最小二乗問題を解く
構文
説明
範囲制約と線形制約をもつ線形最小二乗法問題のソルバー。
以下の形式の最小二乗曲線近似問題を解きます。
メモ
lsqlin
は、ソルバーベースのアプローチのみに適用されます。問題ベースのアプローチの場合は、solve
を使用してください。2 つの最適化アプローチの詳細については、はじめに問題ベース アプローチまたはソルバーベース アプローチを選択を参照してください。
は、x
= lsqlin(problem
)problem
で説明されている構造体 problem
の最小値を求めます。ドット表記または struct
関数を使用して problem
構造体を作成します。または、prob2struct
を使用して OptimizationProblem
オブジェクトから構造体 problem
を作成します。
例
線形不等式制約のある過決定問題について、C*x - d
のノルムを最小化する x
を求めます。
問題と制約を指定します。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936]; d = [0.0578 0.3528 0.8131 0.0098 0.1388]; A = [0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462]; b = [0.5251 0.2026 0.6721];
lsqlin
を呼び出してこの問題を解きます。
x = lsqlin(C,d,A,b)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 4×1
0.1299
-0.5757
0.4251
0.2438
線形等式制約と線形不等式制約および範囲指定のある過決定問題について、C*x - d
のノルムを最小化する x
を求めます。
問題と制約を指定します。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936]; d = [0.0578 0.3528 0.8131 0.0098 0.1388]; A =[0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462]; b =[0.5251 0.2026 0.6721]; Aeq = [3 5 7 9]; beq = 4; lb = -0.1*ones(4,1); ub = 2*ones(4,1);
lsqlin
を呼び出してこの問題を解きます。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 4×1
-0.1000
-0.1000
0.1599
0.4090
この例では、線形最小二乗法に対して既定ではないオプションを使用する方法を説明します。
'interior-point'
アルゴリズムを使用し、反復表示を提供するようにオプションを設定します。
options = optimoptions('lsqlin','Algorithm','interior-point','Display','iter');
線形最小二乗問題を設定します。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936]; d = [0.0578 0.3528 0.8131 0.0098 0.1388]; A = [0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462]; b = [0.5251 0.2026 0.6721];
問題を実行します。
x = lsqlin(C,d,A,b,[],[],[],[],[],options)
Iter Resnorm Primal Infeas Dual Infeas Complementarity 0 6.545534e-01 1.600492e+00 6.150431e-01 1.000000e+00 1 6.545534e-01 8.002458e-04 3.075216e-04 2.430833e-01 2 1.757343e-01 4.001229e-07 1.537608e-07 5.945636e-02 3 5.619277e-02 2.000615e-10 1.196168e-08 1.370933e-02 4 2.587604e-02 9.997558e-14 1.006395e-08 2.548273e-03 5 1.868939e-02 1.665335e-16 6.098591e-11 4.295807e-04 6 1.764630e-02 2.775558e-17 1.606174e-12 3.102849e-05 7 1.758561e-02 1.387779e-16 3.913536e-15 1.138721e-07 8 1.758538e-02 2.498002e-16 1.804112e-16 5.693297e-11 Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 4×1
0.1299
-0.5757
0.4251
0.2438
lsqlin
のすべての出力を取得して解釈します。
線形不等式制約と範囲指定のある問題を定義します。行列 C
は 4 つの列をもちますが、行が 5 つあるので過決定問題となります。これは、問題に線形制約と範囲指定を含める以前に、4 つの未知数と 5 つの条件があることを意味します。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936]; d = [0.0578 0.3528 0.8131 0.0098 0.1388]; A = [0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462]; b = [0.5251 0.2026 0.6721]; lb = -0.1*ones(4,1); ub = 2*ones(4,1);
'interior-point'
アルゴリズムを使用するためのオプションを設定します。
options = optimoptions('lsqlin','Algorithm','interior-point');
'interior-point'
アルゴリズムは初期点を使用しないので、x0
は []
に設定します。
x0 = [];
すべての出力をもつ lsqlin
を呼び出します。
[x,resnorm,residual,exitflag,output,lambda] = ...
lsqlin(C,d,A,b,[],[],lb,ub,x0,options)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 4×1
-0.1000
-0.1000
0.2152
0.3502
resnorm = 0.1672
residual = 5×1
0.0455
0.0764
-0.3562
0.1620
0.0784
exitflag = 1
output = struct with fields:
message: 'Minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative dual feasibility, 1.956421e-17,↵is less than options.OptimalityTolerance = 1.000000e-08, the complementarity measure,↵1.693156e-10, is less than options.OptimalityTolerance, and the relative maximum constraint↵violation, 7.799094e-17, is less than options.ConstraintTolerance = 1.000000e-08.'
algorithm: 'interior-point'
firstorderopt: 1.6932e-10
constrviolation: 0
iterations: 6
linearsolver: 'dense'
cgiterations: []
lambda = struct with fields:
ineqlin: [3×1 double]
eqlin: [0×1 double]
lower: [4×1 double]
upper: [4×1 double]
ゼロでないラグランジュ乗数フィールドを詳しく検査します。まず、線形不等式制約のラグランジュ乗数を確認します。
lambda.ineqlin
ans = 3×1
0.0000
0.2392
0.0000
ラグランジュ乗数は、解が対応する制約の境界上にある場合のみ、ゼロ以外の値を取ります。言い換えれば、対応する制約がアクティブなときはラグランジュ乗数が非ゼロとなります。lambda.ineqlin(2)
は非ゼロです。したがって、制約がアクティブであるため、A*x
の第 2 要素が b
の第 2 要素に等しいことを意味します。
[A(2,:)*x,b(2)]
ans = 1×2
0.2026 0.2026
次に、範囲制約の下限と上限のラグランジュ乗数を確認します。
lambda.lower
ans = 4×1
0.0409
0.2784
0.0000
0.0000
lambda.upper
ans = 4×1
0
0
0
0
lambda.lower
の最初の 2 つの要素は非ゼロです。x(1)
と x(2)
の値はその下限 -0.1
になっているのがわかります。基本的に lambda.upper
の全要素がゼロであり、x
の要素はすべてその上限である 2
より低いことがわかります。
変更した問題を迅速に解くためのウォーム スタート オブジェクトを作成します。ウォーム スタートをサポートするために、反復表示をオフにするオプションを設定します。
rng default % For reproducibility options = optimoptions('lsqlin','Algorithm','active-set','Display','off'); n = 15; x0 = 5*rand(n,1); ws = optimwarmstart(x0,options);
最初の問題を作成し、解きます。求解時間を確認します。
r = 1:n-1; % Index for making vectors v(n) = (-1)^(n+1)/n; % Allocating the vector v v(r) =( -1).^(r+1)./r; C = gallery('circul',v); C = [C;C]; r = 1:2*n; d(r) = n-r; lb = -5*ones(1,n); ub = 5*ones(1,n); tic [ws,fval,~,exitflag,output] = lsqlin(C,d,[],[],[],[],lb,ub,ws) toc
Elapsed time is 0.005117 seconds.
線形制約を追加してもう一度問題を解きます。
A = ones(1,n); b = -10; tic [ws,fval,~,exitflag,output] = lsqlin(C,d,A,b,[],[],lb,ub,ws) toc
Elapsed time is 0.001491 seconds.
入力引数
乗数行列は double の行列として指定されます。C
は、式 C*x - d
における解 x
の乗数を表します。C
は M
行 N
列で、M
は方程式の数、N
は x
の要素数です。
例: C = [1,4;2,5;7,8]
データ型: single
| double
定数ベクトルは double のベクトルとして指定されます。d
は、式 C*x - d
内の加法定数項を表します。d
は M
行 1
列で、M
は方程式の数です。
例: d = [5;0;-12]
データ型: single
| double
実数行列として指定される線形不等式制約です。A
は M
行 N
列の行列で、M
は不等式の数、N
は変数の数 (x0
の要素数) です。スパース データをサポートするアルゴリズムを使用する大規模な問題の場合は、A
をスパース行列として渡します。最適化アルゴリズムのスパース性を参照してください。
A
は M
個の線形不等式を符号化します。
A*x <= b
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、b
は M
個の要素をもつ列ベクトルです。
たとえば、次の不等式を考えてみましょう。
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,
次の制約を入力することによって、不等式を指定します。
A = [1,2;3,4;5,6]; b = [10;20;30];
例: x の成分の和が 1 以下であることを指定するには、A = ones(1,N)
と b = 1
を使用します。
データ型: single
| double
実数ベクトルで指定される線形不等式制約です。b
は、行列 A
に関連する M
要素ベクトルです。b
を行ベクトルとして渡す場合、ソルバーは b
を列ベクトル b(:)
に内部的に変換します。
b
は M
個の線形不等式を符号化します。
A*x <= b
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、A
は M
行 N
列の行列です。
たとえば、次の不等式を考えてみましょう。
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.
次の制約を入力することによって、不等式を指定します。
A = [1,2;3,4;5,6]; b = [10;20;30];
例: x の成分の和が 1 以下であることを指定するには、A = ones(1,N)
と b = 1
を使用します。
データ型: single
| double
実数行列として指定される線形等式制約です。Aeq
は Me
行 N
列の行列で、Me
は等式の数、N
は変数の数 (x0
の要素数) です。スパース データをサポートするアルゴリズムを使用する大規模な問題の場合は、A
をスパース行列として渡します。最適化アルゴリズムのスパース性を参照してください。
Aeq
は Me
個の線形等式を符号化します。
Aeq*x = beq
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、beq
は Me
個の要素をもつ列ベクトルです。
たとえば、次の不等式を考えてみましょう。
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,
次の制約を入力することによって、不等式を指定します。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N)
と beq = 1
を使用します。
データ型: single
| double
実数ベクトルで指定される線形等式制約です。beq
は、行列 Aeq
に関連する Me
要素ベクトルです。beq
を行ベクトルとして渡す場合、ソルバーは beq
を列ベクトル beq(:)
に内部的に変換します。
beq
は Me
個の線形等式を符号化します。
Aeq*x = beq
,
ここで、x
は N
個の変数 x(:)
の列ベクトル、Aeq
は Me
行 N
列の行列です。
たとえば、次の等式を考えてみましょう。
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.
次の制約を入力することによって、等式を指定します。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N)
と beq = 1
を使用します。
データ型: single
| double
下限。double 型のベクトルまたは配列として指定します。lb
は lb
≤ x
≤ ub
の要素ごとの下限を表します。
lsqlin
は配列 lb
をベクトル lb(:)
に内部的に変換します。
例: lb = [0;-Inf;4]
は x(1) ≥ 0
, x(3) ≥ 4
を意味します。
データ型: single
| double
上限。double 型のベクトルまたは配列として指定します。ub
は lb
≤ x
≤ ub
の要素ごとの上限を表します。
lsqlin
は配列 ub
をベクトル ub(:)
に内部的に変換します。
例: ub = [Inf;4;10]
は x(2) ≤ 4
, x(3) ≤ 10
を意味します。
データ型: single
| double
解法プロセスの初期点。実数ベクトルまたは配列として指定します。
'interior-point'
アルゴリズムではx0
は使用されません。x0
は'trust-region-reflective'
アルゴリズムではオプションの引数です。既定では、このアルゴリズムはx0
をすべてがゼロのベクトルに設定します。これらの要素のいずれかが範囲制約に違反すると、lsqlin
は既定のx0
全体を、範囲を満たすベクトルにリセットします。既定ではないx0
のいずれかの要素が範囲に違反すると、lsqlin
は、範囲を満たすようにこれらの要素を設定します。空でない
x0
は'active-set'
アルゴリズムに必須の引数です。x0
のいずれかの要素が範囲に違反すると、lsqlin
は、範囲を満たすようにこれらの要素を設定します。
例: x0 = [4;-3]
データ型: single
| double
optimoptions
関数の出力としてまたは optimset
などによって作成された構造体として指定された lsqlin
用のオプション。
一部のオプションは、optimoptions
に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細については、最適化オプションの表示を参照してください。
すべてのアルゴリズム
| アルゴリズムを選択します。
問題に制約がない場合、 多数の線形制約があるものの変数の数は多くない場合は、 アルゴリズムの選択の詳細については、アルゴリズムの選択を参照してください。 |
Diagnostics | 最小化または計算する関数に関する情報を表示します。選択肢は |
Display | コマンド ラインに返される表示のレベル。
|
MaxIterations | 反復の最大許容回数 (非負の整数)。既定の値は
|
trust-region-reflective
アルゴリズムのオプション
FunctionTolerance | 関数値に関する終了許容誤差 (非負のスカラー)。既定値は
|
JacobianMultiplyFcn | ヤコビ乗算関数。関数ハンドルとして指定されます。大規模構造化問題に対して、この関数は実際に W = jmfun(Jinfo,Y,flag) ここで、
どの場合でも 例については、線形最小二乗付きヤコビ乗算関数 を参照してください。
|
MaxPCGIter | PCG (前処理付き共役勾配) 法の反復の最大回数です (正のスカラー)。既定値は |
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は
|
PrecondBandWidth | PCG (前処理付き共役勾配法) における前提条件子の帯域幅の上限。既定では、対角型の前提条件を使用します (帯域幅の上限 0)。一部の問題では、帯域幅を上げることで、PCG 法の反復回数を減らします。 |
SubproblemAlgorithm | 反復ステップの計算方法を定義します。既定の設定である |
TolPCG | PCG (前処理付き共役勾配法) 反復に関する終了許容誤差 (正のスカラー)。既定値は |
TypicalX | 典型的な |
interior-point
アルゴリズムのオプション
ConstraintTolerance | 制約違反に関する許容誤差 (非負のスカラー)。既定値は
|
LinearSolver | アルゴリズムの内部的な線形ソルバーのタイプ |
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は
|
StepTolerance |
|
'active-set'
アルゴリズムのオプション
ConstraintTolerance | 制約違反に関する許容誤差 (正のスカラー)。既定値は
|
ObjectiveLimit | スカラーの許容誤差 (停止条件) です。目的関数値が |
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (正のスカラー)。既定値は
|
StepTolerance |
|
UseCodegenSolver | ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。 |
単精度コード生成
Algorithm |
|
ConstraintTolerance | 制約違反に関する許容誤差 (正のスカラー)。既定値は
|
MaxIterations | 反復の最大許容回数 (非負の整数)。既定値は |
ObjectiveLimit | スカラーの許容誤差 (停止条件) です。目的関数値が |
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (正のスカラー)。既定値は
|
StepTolerance |
|
UseCodegenSolver | ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。 |
最適化問題は、次のフィールドを含む構造体として指定されます。
| 行列乗数 (項 C*x - d ) |
| 加法定数 (項 C*x - d ) |
| 線形不等式制約の行列 |
| 線形不等式制約のベクトル |
| 線形等式制約の行列 |
| 線形等式制約のベクトル |
lb | 下限のベクトル |
ub | 上限のベクトル |
| x の初期点 |
| 'lsqlin' |
| optimoptions で作成されたオプション |
メモ
引数 problem
とウォーム スタートを一緒に使用することはできません。
データ型: struct
ウォーム スタート オブジェクト。optimwarmstart
で作成したオブジェクトとして指定します。ウォーム スタート オブジェクトには、開始点とオプションに加え、コード生成におけるメモリ サイズ用のオプション データが含まれます。詳細については、ウォーム スタートのベスト プラクティスを参照してください。
例: ws = optimwarmstart(x0,options)
出力引数
解は、すべての範囲制約および線形制約に従って C*x-d
のノルムを最小化するベクトルとして返されます。
解ウォーム スタート オブジェクト。LsqlinWarmStart
オブジェクトとして返されます。解点は wsout.X
です。
この後の lsqlin
の呼び出しでは、wsout
を入力ウォーム スタート オブジェクトとして使用できます。
目的値はスカラー値 norm(C*x-d)^2
として返されます。
解の残差はベクトル C*x-d
として返されます。
アルゴリズムの停止条件。アルゴリズムの停止理由を識別する整数として返されます。exitflag
の値と lsqlin
が停止した対応する理由を以下に示します。
| 残差の変化が、指定された許容誤差 |
| ステップ サイズが |
| 関数が解 |
| 反復数が |
| 問題が実行不可能。また、 |
-3 | 問題が非有界です。 |
| 悪条件のため、さらに最適化を行うことができないことを示します。 |
| ステップ方向を計算できません。 |
interior-point
アルゴリズムの終了メッセージは、許容誤差の超過など、lsqlin
が停止した理由に関する情報をより詳細に提供します。詳細については、終了フラグと終了メッセージを参照してください。
最適化プロセスに関する情報を含む構造体として返された解法プロセスの概要。
| ソルバーが実行した反復の回数。 |
| 次のいずれかのアルゴリズム。
制約のない問題の場合は |
| 違反された制約について明らかな制約違反 (
|
| 終了メッセージ。 |
| 解における 1 次の最適性。詳細については、1 次の最適性の尺度を参照してください。 |
linearsolver | 内部的な線形ソルバーのタイプ、 |
| ソルバーが実行した共役勾配反復の回数。値が空でないのは |
詳細については、出力構造体を参照してください。
ラグランジュ乗数は以下のフィールドを含む構造体として返されます。
| 下限 |
| 上限 |
| 線形不等式 |
| 線形等式 |
詳細については、ラグランジュ乗数構造体を参照してください。
ヒント
制約のない問題では、
mldivide
(行列の左除算) またはlsqminnorm
の使用を検討してください。制約がない場合、lsqlin
はx = C\d
を返します。解かれる問題が常に凸型なので、
lsqlin
は必ずしも一意ではないがグローバルな解を見つけます。問題に多数の線形制約があるものの変数の数は少ない場合は、
'active-set'
アルゴリズムを試してください。詳細については、多数の線形制約がある場合の二次計画法を参照してください。lb
およびub
を陰的に使用する代わりに、Aeq
およびbeq
を陽的に使用することで等式を指定する場合、より良い数値結果が出力されます。trust-region-reflective
アルゴリズムは上限と下限を同じ値に設定できません。そのような場合は別のアルゴリズムを使用してください。問題の指定された入力範囲が矛盾する場合、出力
x
はx0
、出力resnorm
とresidual
は[]
です。行列
C
が大きすぎてメモリが不足する場合など、一部の大規模な構造の問題は、trust-region-reflective
アルゴリズムでヤコビ乗算関数を使用して解くことができます。詳細については、trust-region-reflective アルゴリズムのオプションを参照してください。
アルゴリズム
この方法は、部分空間信頼領域法であり、[1] で説明する interior-reflective ニュートン法に基づいています。各反復は、前処理付き共役勾配 (PCG) 法を使用する大型線形システムの近似解を伴います。信頼領域 Reflective 法の最小二乗と、特に大規模な線形最小二乗法を参照してください。
'interior-point'
アルゴリズムは quadprog
'interior-point-convex'
アルゴリズムに基づいています。詳細については、線形最小二乗法: 内点法または有効制約法を参照してください。
'active-set'
アルゴリズムは quadprog
'active-set'
アルゴリズムに基づいています。詳細については、線形最小二乗法: 内点法または有効制約法とactive-set quadprog アルゴリズムを参照してください。
制約なし問題の場合、lsqlin
は decomposition
を使用して C
係数行列の分解を実行します。lsqlin
で行列 C
が悪条件であることを検出すると、lsqlin
は QR 分解を使用して問題を解きます。
参照
[1] Coleman, T. F. and Y. Li. “A Reflective Newton Method for Minimizing a Quadratic Function Subject to Bounds on Some of the Variables,” SIAM Journal on Optimization, Vol. 6, Number 4, pp. 1040–1058, 1996.
[2] Gill, P. E., W. Murray, and M. H. Wright. Practical Optimization, Academic Press, London, UK, 1981.
ウォーム スタート オブジェクトは、前回解いた問題のアクティブな制約のリストを維持します。ソルバーは、アクティブな制約情報を可能な限り多く引き継いで、現在の問題を解きます。前回の問題と現在の問題が違いすぎる場合、アクティブ セットの情報は再利用されません。この場合、ソルバーは効率的にコールド スタートを実行して、アクティブな制約のリストを再構築します。
代替機能
アプリ
[最適化] ライブ エディター タスクが lsqlin
にビジュアル インターフェイスを提供します。
拡張機能
使用上の注意および制限:
lsqlin
は、関数codegen
(MATLAB Coder) または MATLAB® Coder™ アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。ターゲット ハードウェアは、標準的な倍精度浮動小数点計算または標準的な単精度浮動小数点計算をサポートしていなければなりません。
コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。
コードを生成する前に MATLAB でコードをテストするには、
UseCodegenSolver
オプションをtrue
に設定します。これにより、ソルバーがコード生成で作成されるものと同じコードを使用するようになります。MATLAB で制約なし問題や劣決定問題の解を求める場合、
lsqlin
がmldivide
を呼び出すことで、基底解が返ります。コード生成で返ってくるのは最小ノルム解で、これは通常、一意に定まることはありません。コード生成の場合、
lsqlin
はproblem
引数をサポートしていません。[x,fval] = lsqlin(problem) % Not supported
lsqlin
の入力行列 (A
、Aeq
、lb
、ub
など) はすべて完全 (非スパース) でなければなりません。関数full
を使用することで、スパース行列を完全な行列に変換できます。lb
引数とub
引数は、C
の列数と同じ数のエントリをもつか、空[]
でなければなりません。ターゲット ハードウェアが無限境界をサポートしていない場合は、
optim.coder.infbound
を使用します。組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。
lsqlin
のオプションを含め、関数optimoptions
を使用して指定しなければなりません。オプションにはAlgorithm
オプションを含め、'active-set'
に設定しなければなりません。options = optimoptions("lsqlin",Algorithm="active-set"); [x,fval,exitflag] = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options);
コード生成では次のオプションをサポートしています。
Algorithm
—'active-set'
でなければなりませんConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
UseCodegenSolver
生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、ドット表記ではなく、
optimoptions
を使用することを推奨します。opts = optimoptions('lsqlin','Algorithm','active-set'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
オプションはファイルから読み込まないでください。そうした場合、コード生成に失敗することがあります。代わりに、コード内でオプションを作成してください。
サポートされていないオプションを指定すると、通常はコード生成の際にそのオプションは無視されます。信頼できる結果を得るために、サポートされているオプションのみを指定します。
バージョン履歴
R2006a より前に導入新しい UseCodegenSolver
オプションを true
に設定すると、lsqlin
は、コード生成で作成されるものと同じバージョンのソフトウェアを使用します。このオプションを使用すると、コードを生成する前またはコードをハードウェアに展開する前に、ソルバーの動作を確認できます。単精度コード生成をサポートするソルバーの場合は、生成されたコードでも単精度ハードウェアをサポートできます。コード生成時にこのオプションを含めることができます。このオプションはコード生成には影響しませんが、オプションを含めたままにしておくと、削除する手間が省けます。生成されるコードは MATLAB コードと同じですが、リンクされている数学ライブラリが異なる可能性があるため、結果は若干異なる場合があります。
lsqlin
を使用して単精度浮動小数点ハードウェア用のコードを生成できます。手順については、単精度コード生成を参照してください。
正方入力行列 C
(行数と列数が等しい行列) をもつ悪条件の制約なし問題を解くときに、ソルバーで追加のステップが実行されるようになりました。これにより、結果の精度が向上し、Inf
または NaN
の結果になる可能性が低くなっています。
制約なし問題の output.algorithm
フィールドは、以前の 'mldivide'
ではなく 'direct'
になっています。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)