Main Content

evaluate

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

説明

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

ヒント

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

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

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

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

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")

制約 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

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

入力引数

すべて折りたたむ

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

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

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

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

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

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

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

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

データ型: struct

最適化問題。OptimizationProblem オブジェクトとして指定します。optimproblem を使用して、prob を作成します。関数 evaluate は、prob のプロパティに含まれる目的関数と制約を pts の点で評価します。

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

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

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

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

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

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

出力引数

すべて折りたたむ

評価結果。double または OptimizationValues オブジェクトとして返されます。val が double の場合は、pt における式の数値が格納されます。valOptimizationValues オブジェクトの場合は、prob の目的関数と制約関数の pts の点で評価された値が格納されます。

警告

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

詳細

すべて折りたたむ

制約式の値

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 で導入

すべて展開する