主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

evaluate

计算问题中的优化表达式或目标和约束

说明

使用 evaluate 来查找某一点处优化表达式的数值,或者查找一组点处优化问题、方程问题或优化约束中的目标和约束表达式的值。

提示

有关完整的工作流,请参阅基于问题的优化工作流基于问题的方程求解工作流

val = evaluate(expr,pt) 返回在值 pt 上的优化表达式 expr 的值。

示例

val = evaluate(cons,pt) 返回约束表达式 cons 在值 pt 处的值。

示例

val = evaluate(prob,pts) 返回 prob 中的目标函数和约束函数在 pts 中的点处的值。

示例

示例

全部折叠

创建一个包含两个变量的优化表达式。

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

创建两个优化变量 xy 以及这些变量中的一个 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=1, y=-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 只能计算可行性。

创建一组包含两个优化变量的方程。

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 都有非零值。第二点 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.3440]
      y: [0.5000 0.8799]

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

第一个点 x0 不是解,并且 satisfied 该点的 0。第二点 sol 是一个解,且该点的 satisfied1。方程属性表明,在第一点处两个方程都不满足,在第二点处两个方程均满足。

输入参数

全部折叠

优化表达式,指定为 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 中对应变量大小相同的数值数组。

注意

目前,仅当 probEquationProblem 对象或 OptimizationProblem 对象时,pts 才可以是 OptimizationValues 对象。

如果对 pts 使用结构体,则 pts 只能包含一个点。换句话说,如果要同时计算多个点,pts 必须为 OptimizationValues 对象。

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

输出参量

全部折叠

评估结果,以双精度值或 OptimizationValues 对象形式返回。

  • 当第一个输入参量是表达式或约束时,val 将作为与表达式或约束大小相同的双精度数组返回,并包含其在 pt 处的数值。

  • 当第一个输入参量是 OptimizationProblem 对象或 EquationProblem 对象时,valOptimizationValues 对象。val 包含在 val 中的点处评估的目标和约束或 probpts 的方程的值。如果 pts 包含 N 点,则 val 大小为 1× N。例如,如果 prob 包含大小为 2×3 的约束 con,并且 pts 是一个具有 OptimizationValues = 5 个点的 N 对象,则 val 大小为 1×5,而 val.Constraints.con 大小为 2×3×5。

警告

基于问题的方法不支持在目标函数、非线性等式和非线性不等式中使用复数值。如果某函数计算具有复数值,即使是作为中间值,最终结果也可能不正确。

详细信息

全部折叠

版本历史记录

在 R2017b 中推出

全部展开