メインコンテンツ

issatisfied

最適化問題の一連の点における制約満足度

R2024a 以降

説明

制約満足度をチェックします。

issatisfied は、複数の引数タイプについて、ある点または一連の点における制約満足度をチェックします。

  • 制約オブジェクト。OptimizationConstraint オブジェクト、OptimizationEquality オブジェクト、または OptimizationInequality オブジェクトです。制約オブジェクトの場合、issatisfied は単一の点ですべての制約をチェックします。

  • 問題オブジェクト。OptimizationProblem オブジェクトまたは EquationProblem オブジェクトです。制約を含む問題オブジェクトの場合、issatisfied は複数の点における複数の制約の満足度をチェックでき、範囲制約と整数制約についてもチェックします。整数制約の定義については、var を参照してください。

  • 最適化変数。OptimizationVariable オブジェクトです。最適化変数の場合、issatisfied は変数の範囲制約と整数制約が点において満たされているかどうかをチェックします。ここで、整数制約とは、整数、半整数、または半連続の制約を意味します。整数制約の定義については、var を参照してください。

すべての引数タイプについて、issatisfied は設定可能な許容誤差内で制約満足度をチェックできます。

allsat = issatisfied(prob,pts) は、長さが pts の点の数である logical ベクトルを返します。allsat のエントリは、prob のすべての制約が pts の対応する点において既定の許容誤差 1e-6 内で満たされている場合に true になります。それ以外の場合、エントリは false です。

allsat = issatisfied(var,pt) または allsat = issatisfied(cons,pt) は、点 pt において var のすべての変数がその範囲と型の制約を満たしているかどうか、または cons のすべての制約が満たされているかどうかを示す logical スカラーを返します。

allsat = issatisfied(___,tol) は、前述の任意の入力引数について、制約が点において値 tol 内で満たされている場合は true、それ以外の場合は false を返します。

[allsat,sat] = issatisfied(___) は、引数 sat も返します。これは、問題オブジェクトのチェック時は OptimizationValues オブジェクト、変数または制約オブジェクトのチェック時は logical 配列になります。OptimizationValues オブジェクトには Constraints プロパティまたは Equation プロパティが含まれています。これらは、関連付けられている制約または方程式の対応する評価点における制約満足度を示す logical の指標です。また、Variables プロパティが含まれ、これらは prob の変数のサイズに一致する logical 配列で、範囲制約と整数制約の満足度を示します。

すべて折りたたむ

いくつかの線形制約と非線形制約を含む最適化問題を作成します。

x = optimvar("x");
y = optimvar("y");
obj = (10*(y - x^2))^2 + (1 - x)^2;
cons1 = x^2 + y^2 <= 1;
cons2 = x + y >= 0;
cons3 = y <= sin(x);
cons4 = 2*x + 3*y <= 2.5;
prob = optimproblem(Objective=obj);
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
prob.Constraints.cons4 = cons4;

100 個のテスト ポイントをランダムに作成します。

rng default % For reproducibility
xvals = randn(1,100);
yvals = randn(1,100);

点を問題の OptimizationValues オブジェクトに変換し、それらの点の中からすべての制約を満たす点を特定します。

vals = optimvalues(prob,x=xvals,y=yvals);
allsat = issatisfied(prob,vals);

実行可能な (満たされている) 点を緑の円、実行不可能な点を赤の x 印でプロットします。

xsat = xvals(allsat);
ysat = yvals(allsat);
xnosat = xvals(~allsat);
ynosat = yvals(~allsat);
plot(xsat,ysat,"go",xnosat,ynosat,"rx")

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

2 つの最適化変数と 3 行 2 列の不等式制約の配列を作成します。

x = optimvar("x");
y = optimvar("y");
cons = optimconstr(3,2);
cons(1,1) = x^2 + y^2/4 <= 2;
cons(1,2) = 3*x + y <= 4;
cons(2,1) = -x - y^3 <= -3;
cons(2,2) = 2*x^2 + x*y + 4*y^2 <= 6;
cons(3,1) = 2*x + 4*x*y + y^2 <= 5;
cons(3,2) = (4 + x*y)^2 <= 24;

x = 1/2y = -1/2 ですべての制約が満たされているかどうかをチェックします。

pt.x = 1/2;
pt.y = -1/2;
allsat = issatisfied(cons,pt)
allsat = logical
   0

すべての制約は満たされていません。どれが満たされているかを調べます。

[allsat,sat] = issatisfied(cons,pt)
allsat = logical
   0

sat = 3×2 logical array

   1   1
   0   1
   1   1

constraint(2,1) 以外はすべて満たされています。

いくつかの線形制約と非線形制約を含む最適化問題を作成します。

x = optimvar("x");
y = optimvar("y");
obj = (10*(y - x^2))^2 + (1 - x)^2;
cons1 = x^2 + y^2 <= 1;
cons2 = x + y >= 0;
cons3 = y <= sin(x);
cons4 = 2*x + 3*y <= 2.5;
prob = optimproblem(Objective=obj);
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
prob.Constraints.cons4 = cons4;

100 個のテスト ポイントをランダムに作成します。

rng default % For reproducibility
xvals = randn(1,100);
yvals = randn(1,100);

点を問題の OptimizationValues オブジェクトに変換し、それらの点の中からすべての制約を満たす点を特定します。

vals = optimvalues(prob,x=xvals,y=yvals);
allsat = issatisfied(prob,vals);

実行可能な (満たされている) 点を緑の円、実行不可能な点を赤の x 印でプロットします。

xsat = xvals(allsat);
ysat = yvals(allsat);
xnosat = xvals(~allsat);
ynosat = yvals(~allsat);
plot(xsat,ysat,"go",xnosat,ynosat,"rx")

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

既定の 1e-6 ではなく、許容誤差 1 に関して実行可能な点を特定します。

tol = 1;
allsat1 = issatisfied(prob,vals,tol);

実行可能な (満たされている) 点を緑の円、実行不可能な点を赤の x 印でプロットします。

xsat1 = xvals(allsat1);
ysat1 = yvals(allsat1);
xnosat1 = xvals(~allsat1);
ynosat1 = yvals(~allsat1);
plot(xsat1,ysat1,"go",xnosat1,ynosat1,"rx")

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

制約満足度の定義を緩くすると、より多くの点が実行可能になります。

いくつかの線形制約と非線形制約を含む最適化問題を作成します。

x = optimvar("x");
y = optimvar("y");
obj = (10*(y - x^2))^2 + (1 - x)^2;
cons1 = x^2 + y^2 <= 1;
cons2 = x + y >= 0;
cons3 = y <= sin(x);
cons4 = 2*x + 3*y <= 2.5;
prob = optimproblem(Objective=obj);
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
prob.Constraints.cons4 = cons4;

100 個のテスト ポイントをランダムに作成します。

rng default % For reproducibility
xvals = randn(1,100);
yvals = randn(1,100);

点を問題の OptimizationValues オブジェクトに変換します。

vals = optimvalues(prob,x=xvals,y=yvals);

点で制約を評価します。issatisfied は、すべての制約満足度をすべてのテスト ポイントで同時に評価します。

[~,sat] = issatisfied(prob,vals);

最初の制約について、実行可能な (満たされている) 点を緑の円、実行不可能な点を赤の x 印でプロットします。

x1sat = xvals(sat.cons1);
y1sat = yvals(sat.cons1);
x1nosat = xvals(~sat.cons1);
y1nosat = yvals(~sat.cons1);
plot(x1sat,y1sat,"go",x1nosat,y1nosat,"rx")
title("Constraint 1 Satisfaction")

Figure contains an axes object. The axes object with title Constraint 1 Satisfaction contains 2 objects of type line. One or more of the lines displays its values using only markers

この処理を他の 3 つの制約について繰り返します。

x2sat = xvals(sat.cons2);
y2sat = yvals(sat.cons2);
x2nosat = xvals(~sat.cons2);
y2nosat = yvals(~sat.cons2);
plot(x2sat,y2sat,"go",x2nosat,y2nosat,"rx")
title("Constraint 2 Satisfaction")

Figure contains an axes object. The axes object with title Constraint 2 Satisfaction contains 2 objects of type line. One or more of the lines displays its values using only markers

x3sat = xvals(sat.cons3);
y3sat = yvals(sat.cons3);
x3nosat = xvals(~sat.cons3);
y3nosat = yvals(~sat.cons3);
plot(x3sat,y3sat,"go",x3nosat,y3nosat,"rx")
title("Constraint 3 Satisfaction")

Figure contains an axes object. The axes object with title Constraint 3 Satisfaction contains 2 objects of type line. One or more of the lines displays its values using only markers

x4sat = xvals(sat.cons4);
y4sat = yvals(sat.cons4);
x4nosat = xvals(~sat.cons4);
y4nosat = yvals(~sat.cons4);
plot(x4sat,y4sat,"go",x4nosat,y4nosat,"rx")
title("Constraint 4 Satisfaction")

Figure contains an axes object. The axes object with title Constraint 4 Satisfaction contains 2 objects of type line. One or more of the lines displays its values using only markers

プロットは、制約ごとに異なる満足度の領域を示します。

範囲制約、整数制約、半連続制約をもつ最適化変数を作成します。

x = optimvar("x",LowerBound=-2,UpperBound=2,Type="integer");
y = optimvar("y",LowerBound=1/2,Type="semi-continuous");

いくつかの線形制約と非線形制約を含む最適化問題を作成します。

obj = (10*(y - x^2))^2 + (1 - x)^2;
cons1 = x^2 + y^2 <= 1;
cons2 = x + y >= 0;
cons3 = y <= sin(x);
cons4 = 2*x + 3*y <= 2.5;
prob = optimproblem(Objective=obj);
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
prob.Constraints.cons4 = cons4;

変数の範囲制約と整数制約を考慮せずに 50 個のテスト ポイントをランダムに作成します。また、変数の範囲制約と整数制約に従った点を 50 個作成します。

rng default % For reproducibility
xvals = randn(1,50);
yvals = randn(1,50);
xvals2 = randi(5,1,50) - 3; % Row vector, integer values from -2 to 2
yvals2 = abs(randn(1,50)); % Can violate the semicontinuous constraint
yvals2(yvals2 <= 1/2) = 0; % No violation of semicontinuous constraint
xvals = [xvals xvals2];
yvals = [yvals yvals2];

点を問題の OptimizationValues オブジェクトに変換します。

vals = optimvalues(prob,x=xvals,y=yvals);

点で制約を評価します。issatisfied は、すべての制約満足度をすべてのテスト ポイントで同時に評価します。

[allsat,sat] = issatisfied(prob,vals);

すべての制約を満たす点を探します。

idx = find(allsat)
idx = 1×6

    55    58    80    93    94   100

このセットの最初の点を調べます。

i1 = idx(1);
vals(i1)
ans = 
  OptimizationValues with properties:

   Variables properties:
            x: 1
            y: 0

   Objective properties:
    Objective: NaN

   Constraints properties:
        cons1: NaN
        cons2: NaN
        cons3: NaN
        cons4: NaN

yVariables プロパティは false です。この変数の xy の値を調べます。

[xvals(i1),yvals(i1)]
ans = 1×2

     1     0

y 変数は範囲制約を満たさないため、その変数プロパティは false です。ただし、y は半連続制約を満たすため、変数の満足度はすべての制約満足度と同じく true です。

sat(i1)
ans = 
  OptimizationValues with properties:

   Variables properties:
            x: 1
            y: 1

   Objective properties:
    Objective: NaN

   Constraints properties:
        cons1: 1
        cons2: 1
        cons3: 1
        cons4: 1

他の制約の満足度に関するプロットについては、満たされている制約の特定を参照してください。

2 つの最適化変数で一連の方程式を作成します。

x = optimvar("x");
y = optimvar("y");
prob = eqnproblem;
prob.Equations.eq1 = x^2 + y^2/4 == 2;
prob.Equations.eq2 = x^2/4 + 2*y^2 == 2;

x=1,y=1/2 から始めて連立方程式を解きます。

x0.x = 1;
x0.y = 1/2;
sol = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>
sol = struct with fields:
    x: 1.3440
    y: 0.8799

x0sol で方程式を評価します。

vars = optimvalues(prob,x=[x0.x sol.x],y=[x0.y sol.y]);
vals = evaluate(prob,vars)
vals = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1.3440]
      y: [0.5000 0.8799]

   Equation properties:
    eq1: [0.9375 8.4322e-10]
    eq2: [1.2500 6.7431e-09]

最初の点 x0 は、eq1eq2 の両方の方程式の値が非ゼロです。2 つ目の点 sol は、解に期待されるとおり、それらの方程式の値がほぼゼロになります。

issatisfied を使用して方程式の満足度を調べます。

[satisfied details] = issatisfied(prob,vars)
satisfied = 1×2 logical array

   0   1

details = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1]
      y: [1 1]

   Equation properties:
    eq1: [0 1]
    eq2: [0 1]

最初の点 x0 は解ではなく、その点の satisfied0 です。2 つ目の点 sol は解であり、その点の satisfied1 です。方程式のプロパティは、最初の点ではどちらの方程式も満たされず、2 つ目の点では両方が満たされることを示しています。

入力引数

すべて折りたたむ

評価対象のオブジェクト。OptimizationProblem オブジェクトまたは EquationProblem オブジェクトとして指定します。関数 issatisfied は、prob のプロパティに含まれる目的関数と制約を pts の点で評価します。

例: prob = optimproblem(Objective=obj,Constraints=constr)

prob について評価する点。構造体または OptimizationValues オブジェクトとして指定します。

  • pts のフィールド名は prob の目的関数と制約式の対応する変数名と一致しなければならない。

  • pts の値は prob の対応する変数と同じサイズの数値配列でなければならない。

メモ

現在、ptsOptimizationValues オブジェクトにできるのは、probEquationProblem オブジェクトまたは OptimizationProblem オブジェクトの場合のみです。

pts に構造体を使用する場合、pts に含めることができる点は 1 つだけになります。つまり、複数の点を同時に評価する場合は、ptsOptimizationValues オブジェクトでなければなりません。

例: pts = optimvalues(prob,x=xval,y=yval)

制約。OptimizationConstraint オブジェクト、OptimizationEquality オブジェクト、または OptimizationInequality オブジェクトとして指定します。これらの制約オブジェクトに issatisfied が適用されるのは、点を OptimizationValues オブジェクトとしてではなく構造体として指定した場合のみです。

例: cons = expr1 <= expr2 (expr1expr2 は最適化式)

最適化変数。OptimizationVariable オブジェクトとして指定します。issatisfied は範囲制約と整数制約の違反を次のように計算します。

変数の型範囲と型の実行不可能性
連続max(0,lb - x,x - ub)
整数max(0,lb - x,x - ub,abs(x - round(x)))
半連続min(max(0,lb - x,x - ub),abs(x))
半整数min(max(0,lb - x,x - ub,abs(x - round(x))),abs(x))

例: var = optimvar("var",LowerBound=0,UpperBound=10.5)

式の変数の値。構造体として指定します。構造体 pt の要件は以下のとおりです。

  • expr のすべての変数が pt のフィールド名と一致しなければならない。

  • 一致するフィールド名の値が数値でなければならない。

  • pt のフィールドのサイズが expr の対応する変数のサイズと一致しなければならない。

たとえば、pt を、solve によって返される最適化問題の解にすることができます。

例: pt.x = 3, pt.y = -5

データ型: struct

制約満足度の許容誤差。非負のスカラーとして指定します。制約の評価結果が tol を超えない場合、その制約は満たされていると見なされます。それ以外の場合、制約は満たされません。

たとえば、c(x) が非線形不等式制約関数の場合、その制約が点 pt において c(pt)tol であれば、issatisfiedtrue を返します。同様に、ceq(x) が非線形等式制約関数の場合、その制約が点 pt において abs(ceq(pt))tol であれば、issatisfiedtrue を返します。

データ型: double

出力引数

すべて折りたたむ

与えられた点においてすべての制約が満たされていることを示す指標。logical 行ベクトルとして返されます。allsat(i) はクエリ点 pts(i) に対応します。戻り値は、制約関数の値がいずれも tol を超えない場合に true になります。pts が構造体の場合、allsat は logical スカラーになります。

与えられた点において制約が満たされていることを示す指標。OptimizationProblem オブジェクトまたは EquationProblem オブジェクトの場合はOptimizationValuesベクトル、変数オブジェクトまたは制約オブジェクトの場合は logical 配列として返されます。

問題オブジェクトの場合、satpt または pts の点の数と等しい長さの OptimizationValues オブジェクトです。sat(i)i 番目の点に対する範囲/型/制約の満足度情報が格納されます。sat(i) は次のようになります。

  • Variables プロパティは prob の変数のサイズに一致する logical 配列

  • Constraints プロパティまたは Equations プロパティは prob の制約または方程式のサイズに一致

問題オブジェクトの場合、制約または方程式の名前を使用して sat にインデックスを付けます。たとえば、ptsN = 5 個の点をもつ OptimizationValues オブジェクトで、con が 2 行 3 列のサイズの制約式の場合、sat.con のサイズは 2×3×5 になります。エントリは、許容誤差 tol 内で満たされている制約に対して true になります。

制約オブジェクト (OptimizationConstraintOptimizationEquality、または OptimizationInequality) の場合、sat のサイズは関連付けられている制約のサイズと同じです。

変数オブジェクトの場合、sat のサイズは変数のサイズと同じです。

詳細

すべて折りたたむ

ヒント

ツールボックスには点の実行可能性を計算するための関数が 3 つあります。

バージョン履歴

R2024a で導入

すべて展開する