Main Content

evaluate

最適化式または問題に含まれる目的関数と制約の評価

説明

evaluate は、ある点における最適化式の数値を求めたり、最適化問題、方程式問題、最適化制約に含まれる目的関数と制約式の一連の点における値を求めたりする場合に使用します。

ヒント

完全なワークフローについては、問題ベースの最適化ワークフローまたは方程式を解くための問題ベースのワークフローを参照してください。

val = evaluate(expr,pt) は、値 pt での最適化式 expr の値を返します。

val = evaluate(cons,pt) は、値 pt での制約式 cons の値を返します。

val = evaluate(prob,pts) は、pts の点での prob の目的関数と制約関数の値を返します。

すべて折りたたむ

2 変数の最適化式を作成します。

x = optimvar("x",3,2);
y = optimvar("y",1,2);
expr = sum(x,1) - 2*y;

点で式を評価します。

xmat = [3,-1;
    0,1;
    2,6];
sol.x = xmat;
sol.y = [4,-3];
val = evaluate(expr,sol)
val = 1×2

    -3    12

2 つの最適化変数 x および y を作成し、それらの変数で 3 行 2 列の制約式を作成します。

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

制約式を点 x=1y=-1 で評価します。式 L <= R の値は L - R です。

x0.x = 1;
x0.y = -1;
val = evaluate(cons,x0)
val = 3×2

   -0.7500    2.0000
    2.0000   -3.0000
   -4.0000   -8.0000

線形計画問題を解きます。

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x -y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob)
Solving problem using linprog.

Optimal solution found.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

解での目的関数の値を求めます。

val = evaluate(prob.Objective,sol)
val = 
-1.1111

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

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 オブジェクトに変換します。

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

pts で目的関数と制約関数を評価します。

val = evaluate(prob,pts);

目的関数の値は val.Objective に格納され、制約関数の値は val.cons1val.cons4 に格納されます。目的関数の値に 1 を加算した値の対数をプロットします。

figure
plot3(xvals,yvals,log(1 + val.Objective),"bo")

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

制約 cons1cons4 の値をプロットします。制約が満たされるのは、値が非正の数値になる場合であることに注意してください。非正の値を円、正の値を x のマークでプロットします。

neg1 = val.cons1 <= 0;
pos1 = val.cons1 > 0;
neg4 = val.cons4 <= 0;
pos4 = val.cons4 > 0;
figure
plot3(xvals(neg1),yvals(neg1),val.cons1(neg1),"bo")
hold on
plot3(xvals(pos1),yvals(pos1),val.cons1(pos1),"rx")
plot3(xvals(neg4),yvals(neg4),val.cons4(neg4),"ko")
plot3(xvals(pos4),yvals(pos4),val.cons4(pos4),"gx")
hold off

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

最後の図に示されているように、evaluate では点の値と実行可能性の両方を計算できます。これに対し、issatisfied では実行可能性のみが計算されます。

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.
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 = 
  1x2 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 = 1x2 logical array

   0   1

details = 
  1x2 OptimizationValues vector with properties:

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

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

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

入力引数

すべて折りたたむ

最適化式。OptimizationExpression オブジェクトとして指定します。

例: expr = 5*x+3 (xOptimizationVariable)

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

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

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

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

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

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

データ型: struct

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

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

評価対象のオブジェクト。OptimizationProblem オブジェクトまたは EquationProblem オブジェクトとして指定します。関数 evaluate は、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)

出力引数

すべて折りたたむ

評価結果。double または OptimizationValues オブジェクトとして返されます。

  • 最初の入力引数が式または制約の場合、val は式または制約と同じサイズの double 配列として返され、pt におけるその数値が格納されます。

  • 最初の入力引数が OptimizationProblem オブジェクトまたは EquationProblem オブジェクトの場合、valOptimizationValues オブジェクトになります。val には、prob の目的関数と制約または式の pts の点で評価された値が格納されます。ptsN 個の点が含まれている場合、val のサイズは 1 行 N 列です。たとえば、prob に 2 行 3 列のサイズの制約 con が含まれていて、ptsN = 5 個の点をもつ OptimizationValues オブジェクトの場合、val のサイズは 1 行 5 列、val.Constraints.con のサイズは 2×3×5 になります。

警告

問題ベースのアプローチでは、目的関数、非線形等式、および非線形不等式における複素数値はサポートされていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。

詳細

すべて折りたたむ

制約式の値

pt の制約式の条件は、以下のとおりです。

  • 制約が L <= R の場合、制約の値は evaluate(L,pt)evaluate(R,pt)

  • 制約が L >= R の場合、制約の値は evaluate(R,pt)evaluate(L,pt)

  • 制約が L == R の場合、制約の値は abs(evaluate(L,pt) – evaluate(R,pt))

一般に、ある点で制約の値が許容誤差以下である場合に、その点において制約が満たされている (実行可能である) と見なします。

バージョン履歴

R2017b で導入

すべて展開する