2026a

# evaluate


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

函数库: TyOptimization

# 语法

val = evaluate(expr,pt)
val = evaluate(prob,pts)

# 说明

使用 evaluate 求优化表达式在某点处的数值,或求优化问题中目标和约束表达式在一组点处的值。

提示

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


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


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

# 示例

计算在某点处优化表达式的值

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

using TyOptimization
x = optimvar("x",3,2)
y = optimvar("y",1,2)
expr = sum(x,dims=1) - 2*y

计算该表达式在某点处的值。

xmat = [3 -1;0 1;2 6]
sol = (x = xmat, y = [4 -3])
val = evaluate(expr,sol)
val = 1×2 Matrix{Int64}:

 -3  12
计算目标函数在解处的值

求解线性规划问题。

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

sol, = Solve(prob)
Solving problem using linprog.

Optimal found.

sol = 
(x = 0.6666666666666666, y = 1.3333333333333335)

求目标函数在解处的值。

val = evaluate(prob.Objective,sol)
val = -1.1111111111111112
计算优化问题值

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

using TyOptimization
x = optimvar("x")
y = optimvar("y")
obj =(1 - x)^2 + (10*(y - x^2))^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,cons2 = cons2,cons3 = cons3,cons4 = cons4)

随机创建 100 个测试点。

using TyMath
rng = MT19937ar(5489)
xvals = randn(rng,100)
yvals = randn(rng,100)

将这些点转换为问题的一个 OptimizationValues 结构体。

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

计算目标函数和约束函数在点 pts 处的值。

val = evaluate(prob,pts)

目标函数值存储在 val.Objective 中,约束函数值存储在 val.Constraints.cons1 到 val.Constraints.cons4 中。绘制 1 加上目标函数值之和的对数。

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

绘制约束 cons1 和 cons4 的值。前面提到,当约束的计算结果为非正数时,就满足约束。用圆圈标出非正值,用 x 标记标出正值。

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

如上图所示,evaluate 使您能够计算点的值和可行性。而 issatisfied 只能计算可行性。

# 输入参数

expr — 优化表达式
OptimizationExpression 结构体

优化表达式,指定为 OptimizationExpression 结构体。可以由 @fcn2expr 生成。

示例: expr = @fcn2expr 5*x+3 x,其中 x 是 OptimizationVariable。

pt — 表达式中变量的值
具名元组

表达式中变量的值,指定为具名元组。具名元组 pt 具有以下要求:

  • expr 中的所有变量都与 pt 中的字段名称匹配;

  • 匹配字段名称的值是数值。

例如,pt 可以是优化问题的解,由 Solve 返回。

示例: pt = (x = 3, y = -5)。

prob — 优化问题
OptimizationProblem 结构体

优化问题,指定为 OptimizationProblem 结构体。使用 optimproblem 创建 prob。evaluate 函数计算 prob 的属性中的目标和约束在 pts 中的点处的值。

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

pts — 要为 prob 计算的点
具名元组 | OptimizationValues 结构体

要为 prob 计算的点,指定为具名元组或 OptimizationValues 结构体。

  • pts 中的字段名称必须与 prob 中的目标和约束表达式中的对应变量名称匹配;

  • pts 中的值必须是与 prob 中对应变量大小相同的数值数组。

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

示例: pts = (x=1,y=2)。

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

# 输出参数

val — 计算结果
数值 | OptimizationValues 结构体

计算结果,以数值或 OptimizationValues 结构体返回。如果 val 是数值,则它包含表达式在 pt 处的数值。如果 val 是 OptimizationValues 结构体,则它包含 prob 中的目标函数和约束函数在 pts 中的点处计算的值。

警告

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

# 另请参阅

Solve | infeasibility | issatisfied | OptimizationProblem | OptimizationExpression | OptimizationValues