# 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