主要内容

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

issatisfied

优化问题在一组点上的约束约束

自 R2024a 起

说明

检查约束条件是否满足。

issatisfied 用于检查某个点或一组点在多种参量类型下的约束满足情况:

  • 一个约束对象,该对象可以是 OptimizationConstraint 对象、OptimizationEquality 对象或 OptimizationInequality 对象。对于约束对象,issatisfied 会检查单个点上的所有约束。

  • 一个问题对象,该对象是 OptimizationProblem 对象或 EquationProblem 对象。对于包含约束的模型对象,issatisfied 可以检查多个点处多个约束的满足情况,同时还会检查边界约束和整数约束。关于整数约束的定义,请参阅 var

  • 一个优化变量,它是一个 OptimizationVariable 对象。对于一个优化变量,issatisfied 会检查该变量在某一点上是否满足其边界约束和整数约束,其中整数约束指整数、半整数或半连续约束。关于整数约束的定义,请参阅 var

对于所有参量类型,issatisfied 都能在可设置的容差范围内检查约束满足情况。

allsat = issatisfied(prob,pts) 返回一个逻辑向量,其长度为 pts 中的点数。如果 allsat 中的所有约束都满足 true 中对应点的默认容差范围 prob,则 1e-6 中的条目为 pts。否则,条目为 false

示例

allsat = issatisfied(var,pt)allsat = issatisfied(cons,pt) 返回一个逻辑值,用于指示 var 中的所有变量是否满足其边界约束和类型约束,或者在点 ptcons 中的所有约束是否均已满足。

示例

对于任何先前的输入参量,allsat = issatisfied(___,tol) 如果某一点的约束在 true 值范围内得到满足,则返回 tol,否则 false

示例

在检查问题对象时,[allsat,sat] = issatisfied(___) 还会返回参量 sat,该参量是一个 OptimizationValues 对象;而在检查变量或约束对象时,该参量则是一个逻辑数组。一个 OptimizationValues 对象包含 ConstraintsEquation 属性,这些属性以逻辑值的形式表示在相应计算点处关联约束或方程的满足情况;同时还包含 Variables 属性,这些属性是与 prob 中变量大小相匹配的逻辑数组,用于指示边界约束和整数约束的满足情况。

示例

示例

全部折叠

创建一个具有若干线性和非线性约束的优化问题。

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

创建两个优化变量和一个 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/2, y = -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

确定哪些点对于容差 1 而非默认值 1e-6 是可行的。

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

对其他三个约束重复此过程。

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

有关其他约束条件满足情况的绘图,请参阅确定满足哪些约束

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

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]
      y: [1 1]

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

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

输入参数

全部折叠

要计算的对象,指定为 OptimizationProblem 对象或 EquationProblem 对象。issatisfied 函数计算 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)

约束,指定为 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) 是非线性不等式约束函数,那么当 c(pt)tol 时,issatisfied 会在点 true 处为该约束返回 pt。类似地,如果 ceq(x) 是非线性等式约束函数,那么当 abs(ceq(pt))tol 时,issatisfied 会在点 true 处返回该约束的 pt

数据类型: double

输出参量

全部折叠

指示在给定点处满足所有约束,以逻辑行向量形式返回。allsat(i) 对应于查询点 pts(i)。如果所有约束函数的值不超过 tol,则返回值为 true。如果 pts 是一个结构体,那么 allsat 就是一个逻辑标量。

表示约束在给定点上成立,对于 OptimizationProblemEquationProblem 对象,返回值为OptimizationValues向量;对于变量或约束对象,返回值为逻辑数组。

对于问题对象,sat 是一个 OptimizationValues 对象,其长度等于 ptpts 中的点数。sat(i) 包含第 i 个点的约束/类型/约束满足信息。在 sat(i) 中,

  • Variables 属性是与 prob 中变量大小相匹配的逻辑数组

  • ConstraintsEquations 属性与 prob 中的约束或方程的规模相匹配

对于问题对象,可使用约束或方程名称作为索引在 sat 中进行查找。例如,如果 pts 是一个具有 OptimizationValues = 5 个点的 N 对象,并且 con 是一个大小为 2×3 的约束表达式,则 sat.con 大小为 2×3×5。对于在容差 tol 范围内满足的约束,这些条目为 true

对于约束对象(OptimizationConstraintOptimizationEqualityOptimizationInequality),sat 的大小与关联约束的大小相同。

对于变量对象,sat 的大小与该变量的大小相同。

详细信息

全部折叠

提示

该工具箱提供了三项函数,用于计算点的位置可行性。

版本历史记录

在 R2024a 中推出

全部展开