メインコンテンツ

lsqlin

R2026b

制約付き線形最小二乗問題を解く

説明

範囲制約と線形制約をもつ線形最小二乗法問題のソルバー。

以下の形式の最小二乗曲線近似問題を解きます。

minx12‖C⋅x−d‖22 such that {A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub.

メモ

lsqlin は、ソルバーベースのアプローチのみに適用されます。問題ベースのアプローチの場合は、solve を使用してください。2 つの最適化アプローチの詳細については、はじめに問題ベース アプローチまたはソルバーベース アプローチを選択を参照してください。

x = lsqlin(C,d,A,b) は、A*x ≤ b の制約の下で線形システム C*x = d を最小二乗法的に解きます。

例

x = lsqlin(C,d,A,b,Aeq,beq,lb,ub) は、線形等式制約 Aeq*x = beq と範囲 lb ≤ x ≤ ub を追加します。Aeq や beq など特定の制約が必要でない場合、これらを [] に設定します。x(i) の下に非有界の場合は lb(i) = -Inf を設定してください。x(i) の上に非有界の場合は ub(i) = Inf を設定してください。

例

x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options) は、初期点 x0 および options で指定された最適化オプションを使用して最小化を行います。optimoptions を使用してこれらのオプションを設定してください。初期点を含めない場合は引数 x0 を [] に設定します。ただし、"active-set" アルゴリズムには空でない x0 が必要です。

例

x = lsqlin(problem) は、problem で説明されている構造体 problem の最小値を求めます。ドット表記または struct 関数を使用して problem 構造体を作成します。または、prob2struct を使用して OptimizationProblem オブジェクトから構造体 problem を作成します。

[x,resnorm,residual,exitflag,output,lambda] = lsqlin(___) は、前述のすべての入力引数に対して次を返します。

  • 残差の 2 乗ノルム resnorm = ‖C⋅x−d‖22

  • 残差 residual = C*x - d

  • 終了条件を指定する値 exitflag

  • 最適化プロセスに関する情報を含む構造体 output

  • ラグランジュ乗数を含む構造体 lambda

    問題の定義の因子 ½ は、lambda 構造体の値に影響します。

例

[wsout,resnorm,residual,exitflag,output,lambda] = lsqlin(C,d,A,b,Aeq,beq,lb,ub,ws) は、ws のオプションを使用し、ウォーム スタート オブジェクト ws の中のデータから lsqlin を起動します。返された引数 wsout は、wsout.X の解点を含みます。この後のソルバーの呼び出しで、最初のウォーム スタート オブジェクトとして wsout を使用することにより、lsqlin の動作は速くなります。

例

例

すべて折りたたむ

線形不等式制約のある過決定問題について、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   2.775558e-17   6.098561e-11     4.295807e-04  
    6    1.764630e-02   1.387779e-16   1.606243e-12     3.102849e-05  
    7    1.758561e-02   1.110223e-16   3.719247e-15     1.138721e-07  
    8    1.758538e-02   2.775558e-17   2.914335e-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)
ws = 
  LsqlinWarmStart with properties:

          X: [15×1 double]
    Options: [1×1 optim.options.Lsqlin]

    Code generation limitations

fval = 
1.7644e+03
exitflag = 
1
output = struct with fields:
          algorithm: 'active-set'
         iterations: 8
    constrviolation: 0
      firstorderopt: 3.5527e-15
            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.137228e-16,↵is less than options.OptimalityTolerance = 1.000000e-08 and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-08.'
       linearsolver: []
       cgiterations: []

toc
Elapsed time is 0.047678 seconds.

線形制約を追加してもう一度問題を解きます。

A = ones(1,n);
b = -10;
tic
[ws,fval,~,exitflag,output] = lsqlin(C,d,A,b,[],[],lb,ub,ws)
ws = 
  LsqlinWarmStart with properties:

          X: [15×1 double]
    Options: [1×1 optim.options.Lsqlin]

    Code generation limitations

fval = 
1.7667e+03
exitflag = 
1
output = struct with fields:
          algorithm: 'active-set'
         iterations: 10
    constrviolation: 1.7764e-15
      firstorderopt: 5.3291e-15
            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.705842e-16,↵is less than options.OptimalityTolerance = 1.000000e-08 and the relative maximum constraint↵violation, 1.184238e-16, is less than options.ConstraintTolerance = 1.000000e-08.'
       linearsolver: []
       cgiterations: []

toc
Elapsed time is 0.017402 seconds.

入力引数

すべて折りたたむ

乗数行列は double の行列として指定されます。C は、式 C*x - d における解 x の乗数を表します。C は M 行 N 列で、M は方程式の数、N は x の要素数です。

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: C = [1,4;2,5;7,8]

データ型: single | double

定数ベクトルは double のベクトルとして指定されます。d は、式 C*x - d 内の加法定数項を表します。d は M 行 1 列で、M は方程式の数です。

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: 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];

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: 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];

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: x の成分の和が 1 以下であることを指定するには、A = ones(1,N) と b = 1 を使用します。

データ型: single | double

実数行列として指定される線形等式制約です。Aeq は Me 行 N 列の行列で、Me は等式の数、N は変数の数 (x0 の要素数) です。スパース データをサポートするアルゴリズムを使用する大規模な問題の場合は、Aeq をスパース行列として渡します。最適化アルゴリズムのスパース性を参照してください。

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];

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N) と beq = 1 を使用します。

データ型: single | double

実数ベクトルで指定される線形等式制約です。beq は、行列 Aeq に関連する Me 要素ベクトルです。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];

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: x の成分の和が 1 であることを指定するには、Aeq = ones(1,N) と beq = 1 を使用します。

データ型: single | double

下限。double 型のベクトルまたは配列として指定します。lb は lb ≤ x ≤ ub の要素ごとの下限を表します。

lsqlin は配列 lb をベクトル lb(:) に内部的に変換します。

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: lb = [0;-Inf;4] は x(1) ≥ 0, x(3) ≥ 4 を意味します。

データ型: single | double

上限。double 型のベクトルまたは配列として指定します。ub は lb ≤ x ≤ ub の要素ごとの上限を表します。

lsqlin は配列 ub をベクトル ub(:) に内部的に変換します。

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: 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 は、範囲を満たすようにこれらの要素を設定します。

この引数は、コード生成の場合 (または UseCodegenSolver オプションを true に設定した場合) にのみ単精度にできます。

例: x0 = [4;-3]

データ型: single | double

optimoptions 関数の出力としてまたは optimset などによって作成された構造体として指定された lsqlin 用のオプション。

一部のオプションは、optimoptions に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細については、最適化オプションの表示を参照してください。

すべてのアルゴリズム

Algorithm

アルゴリズムを選択します。

  • "interior-point" (既定の設定)

  • "trust-region-reflective"

  • "active-set"

"trust-region-reflective" アルゴリズムは上限と下限のみを許可します。線形不等式や線形等式は必要ありません。"trust-region-reflective" アルゴリズムと線形制約の両方を指定した場合、lsqlin は "interior-point" アルゴリズムを使用します。

"trust-region-reflective" アルゴリズムは上限と下限を同じ値に設定できません。

問題に制約がない場合、lsqlin は内部的に mldivide を呼び出します。

多数の線形制約があるものの変数の数は多くない場合は、"active-set" アルゴリズムを試してください。

アルゴリズムの選択の詳細については、アルゴリズムの選択を参照してください。

Diagnostics

最小化または計算する関数に関する情報を表示します。選択肢は "on" または "off" (既定の設定) です。

Display

コマンド ラインに返される表示のレベル。

  • "off" または "none" — 出力を表示しない。

  • "final" (既定の設定) — 最終出力のみを表示する。

"interior-point" アルゴリズムおよび "active-set" アルゴリズムでは次の値も指定できます。

  • "iter" — 各反復の出力を表示する。

  • "iter-detailed" — 各反復の出力を表示し、詳細な終了メッセージを与える。

  • "final-detailed" — 最終出力のみを表示し、詳細な終了メッセージを与える。

MaxIterations

反復の最大許容回数 (非負の整数)。既定の値は "active-set" アルゴリズムでは 2000、他のアルゴリズムでは 200 です。

optimset の場合、オプションの名前は MaxIter です。新旧のオプション名を参照してください。

trust-region-reflective アルゴリズムのオプション

FunctionTolerance

関数値に関する終了許容誤差 (非負のスカラー)。既定値は 100*eps、約 2.2204e-14 です。

optimset の場合、オプションの名前は TolFun です。新旧のオプション名を参照してください。

JacobianMultiplyFcn

ヤコビ乗算関数。関数ハンドルとして指定されます。大規模構造化問題に対して、この関数は実際に C を計算しないで、ヤコビ行列乗算 C*Y、C'*Y、C'*(C*Y) のいずれかを計算します。以下の形式で関数を記述します。

W = jmfun(Jinfo,Y,flag)

ここで、Jinfo は C*Y (または C'*Y か C'*(C*Y)) の計算に使用される行列を含んでいます。

jmfun は、lsqlin が渡す flag の値によって、3 種類の乗算のうち、1 つを計算しなければなりません。

  • flag == 0 の場合、W = C'*(C*Y) です。

  • flag > 0 の場合、W = C*Y です。

  • flag < 0 の場合、W = C'*Y です。

どの場合でも jmfun は C の形式を陽的に必要としません。lsqlin は Jinfo を使用して前提条件子を計算します。必要に応じて余分なパラメーターを与える方法については 追加パラメーターの受け渡し を参照してください。

例については、線形最小二乗付きヤコビ乗算関数 を参照してください。

optimset の場合、オプションの名前は JacobMult です。新旧のオプション名を参照してください。

MaxPCGIter

PCG (前処理付き共役勾配) 法の反復の最大回数です (正のスカラー)。既定値は max(1,floor(numberOfVariables/2)) です。詳細については、信頼領域 Reflective 法アルゴリズムを参照してください。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は 100*eps、約 2.2204e-14 です。1 次の最適性の尺度を参照してください。

optimset の場合、オプションの名前は TolFun です。新旧のオプション名を参照してください。

PrecondBandWidth

PCG (前処理付き共役勾配法) における前提条件子の帯域幅の上限。既定では、対角型の前提条件を使用します (帯域幅の上限 0)。一部の問題では、帯域幅を上げることで、PCG 法の反復回数を減らします。PrecondBandWidth を Inf に設定すると、共役勾配 (CG) ではなく、直接因子分解 (コレスキー因子) が使用されます。直接因子分解では CG より計算量が増加しますが、解を求めるためのステップの質が向上します。詳細については、信頼領域 Reflective 法アルゴリズムを参照してください。

SubproblemAlgorithm

反復ステップの計算方法を定義します。既定の設定である "cg" のステップは "factorization" より高速ですが、精度の点で劣ります。信頼領域 Reflective 法の最小二乗を参照してください。

TolPCG

PCG (前処理付き共役勾配法) 反復に関する終了許容誤差 (正のスカラー)。既定値は 0.1 です。

TypicalX

典型的な x の値です。TypicalX の要素数は、変数の数と等しくなります。既定値は ones(numberofvariables,1) です。lsqlin はスケーリング用に TypicalX を内部的に使用します。TypicalX は、x が非有界の成分をもつ場合や、非有界の成分 TypicalX 値が 1 より大きい場合にのみ有効です。

interior-point アルゴリズムのオプション

ConstraintTolerance

制約違反に関する許容誤差 (非負のスカラー)。既定値は 1e-8 です。

optimset の場合、オプションの名前は TolCon です。新旧のオプション名を参照してください。

LinearSolver

アルゴリズムの内部的な線形ソルバーのタイプ

  • "auto" (既定) — 行列 C がスパースである場合は "sparse"、そうでない場合は "dense" を使用。

  • "sparse" — スパースな線形代数を使用。スパース行列を参照してください。

  • "dense" — 密な線形代数を使用。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は 1e-8 です。1 次の最適性の尺度を参照してください。

optimset の場合、オプションの名前は TolFun です。新旧のオプション名を参照してください。

StepTolerance

x に関する終了許容誤差 (非負のスカラー)。既定値は 1e-12 です。

optimset の場合、オプションの名前は TolX です。新旧のオプション名を参照してください。

"active-set" アルゴリズムのオプション

ConstraintTolerance

制約違反に関する許容誤差 (正のスカラー)。既定値は 1e-8 です。

optimset の場合、オプションの名前は TolCon です。新旧のオプション名を参照してください。

ObjectiveLimit

スカラーの許容誤差 (停止条件) です。目的関数値が ObjectiveLimit を下回り、現在の点が実行可能な場合、問題が非有界であると推定されるため、その反復は中止されます。既定値は -1e20 です。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (正のスカラー)。既定値は 1e-8 です。1 次の最適性の尺度を参照してください。

optimset の場合、名前は TolFun です。新旧のオプション名を参照してください。

StepTolerance

x に関する許容誤差 (正のスカラー)。既定値は 1e-8 です。

optimset の場合、オプションの名前は TolX です。新旧のオプション名を参照してください。

UseCodegenSolver

ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。true または false (既定の設定) として指定します。このオプションを使用すると、コードを生成する前またはコードをハードウェアに展開する前に、ソルバーの動作を確認できます。コード生成時にこのオプションを含めることができます。このオプションはコード生成には影響しませんが、オプションを含めたままにしておくと、削除する手間が省けます。生成されるコードは MATLAB® コードと同じですが、リンクされている数学ライブラリが異なる可能性があるため、結果は若干異なる場合があります。

単精度コード生成

Algorithm

"active-set" でなければなりません。

ConstraintTolerance

制約違反に関する許容誤差 (正のスカラー)。既定値は 1e-4 です。

optimset の場合、オプションの名前は TolCon です。新旧のオプション名を参照してください。

MaxIterations

反復の最大許容回数 (非負の整数)。既定値は 10*(nVar + mConstr) です。ここで、nVar は問題変数の数、mConstr は制約の数です。

ObjectiveLimit

スカラーの許容誤差 (停止条件) です。目的関数値が ObjectiveLimit を下回り、現在の点が実行可能な場合、問題が非有界であると推定されるため、その反復は中止されます。既定値は -1e20 です。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (正のスカラー)。既定値は 1e-4 です。1 次の最適性の尺度を参照してください。

optimset の場合、名前は TolFun です。新旧のオプション名を参照してください。

StepTolerance

x に関する許容誤差 (正のスカラー)。既定値は 1e-4 です。

optimset の場合、オプションの名前は TolX です。新旧のオプション名を参照してください。

UseCodegenSolver

ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。true または false (既定の設定) として指定します。このオプションを使用すると、コードを生成する前またはコードをハードウェアに展開する前に、ソルバーの動作を確認できます。コード生成時にこのオプションを含めることができます。このオプションはコード生成には影響しませんが、オプションを含めたままにしておくと、削除する手間が省けます。生成されるコードは MATLAB コードと同じですが、リンクされている数学ライブラリが異なる可能性があるため、結果は若干異なる場合があります。

最適化問題は、次のフィールドを含む構造体として指定されます。

C

行列乗数 (項 C*x - d)

d

加法定数 (項 C*x - d)

Aineq

線形不等式制約の行列

bineq

線形不等式制約のベクトル

Aeq

線形等式制約の行列

beq

線形等式制約のベクトル
lb下限のベクトル
ub上限のベクトル

x0

x の初期点

solver

"lsqlin"

options

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

残差の変化が、指定された許容誤差 options.FunctionTolerance より小さい値でした (trust-region-reflective アルゴリズム)。

2

ステップ サイズが options.StepTolerance より小さく、制約は満たされました (interior-point アルゴリズム)。

1

関数が解 x に収束したことを示します。

0

反復数が options.MaxIterations を超過しています。

-2

問題が実行不可能。また、interior-point アルゴリズムの場合、ステップ サイズは options.StepTolerance より小さいが、制約は満たされません。

-3問題が非有界です。

-4

悪条件のため、さらに最適化を行うことができないことを示します。

-8

ステップ方向を計算できません。

interior-point アルゴリズムの終了メッセージは、許容誤差の超過など、lsqlin が停止した理由に関する情報をより詳細に提供します。終了フラグと終了メッセージを参照してください。

最適化プロセスに関する情報を含む構造体として返された解法プロセスの概要。

iterations

ソルバーが実行した反復の回数。

algorithm

次のいずれかのアルゴリズム。

  • 'interior-point'

  • 'trust-region-reflective'

  • 'direct' (制約のない問題の場合)

制約のない問題の場合は iterations = 0 となり、output 構造体の残りのエントリは空になります。

constrviolation

違反された制約について明らかな制約違反 ('trust-region-reflective' アルゴリズムについては返されない)。

constrviolation = max([0;norm(Aeq*x-beq, inf);(lb-x);(x-ub);(A*x-b)])

message

終了メッセージ。

firstorderopt

解における 1 次の最適性。1 次の最適性の尺度を参照してください。

linearsolver

内部的な線形ソルバーのタイプ、'dense' または 'sparse' ('interior-point' アルゴリズムのみ)

cgiterations

ソルバーが実行した共役勾配反復の回数。値が空でないのは 'trust-region-reflective' アルゴリズムの場合のみです。

出力構造体を参照してください。

ラグランジュ乗数は以下のフィールドを含む構造体として返されます。

lower

下限 lb

upper

上限 ub

ineqlin

線形不等式

eqlin

線形等式

ラグランジュ乗数構造体を参照してください。

ヒント

  • 制約のない問題では、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 アルゴリズムのオプションを参照してください。

アルゴリズム

すべて折りたたむ

代替機能

アプリ

[最適化] ライブ エディター タスクが lsqlin にビジュアル インターフェイスを提供します。

拡張機能

すべて展開する

バージョン履歴

R2006a より前に導入

すべて展開する