# @fcn2expr
将函数转换为优化表达式
函数库: TyOptimization
# 语法
out = @fcn2expr fcn in1,in2,...,inK
out = @fcn2expr fcn mod in1,in2,...,inK
# 说明
out = @fcn2expr fcn in1,in2,...,inK 将函数 fcn(in1,in2,...,inK) 转换为优化表达式。示例
out = @fcn2expr fcn mod in1,in2,...,inK 还指定优化变量定义的模块。
注意
该宏将在未来版本被废弃,请使用函数 fcn2expr 创建优化表达式
# 示例
将目标函数转换为表达式
要在基于问题的方法中使用某 Syslab 函数,请首先将其转换为优化表达式。
要使用目标函数 gamma(数学函数,阶乘函数的扩展),请创建一个优化变量 x 并在转换后的匿名函数中使用它。
using TyOptimization
x = optimvar("x")
obj = @fcn2expr gamma(x) x
prob = optimproblem(Objective=obj)
prob =
OptimizationProblem with properties:
Description:
ObjectiveSense: minimize
Variables: [1x1 Vector] containing 1 OptimizationVariables
Objective: [1x1 OptimizationExpression]
Constraints: [0x1 Vector] containing 0 OptimizationConstraints
对于更复杂的函数,道理也是类似。函数 gammabrock 计算两个优化变量的一个目标。
gammabrock = (x,y)-> (10*(y - gamma(x)))^2 + (1 - x)^2
x = optimvar("x",Lowerbnd=0)
y = optimvar("y")
obj = @fcn2expr gammabrock(x,y) x y
prob = optimproblem(Objective=obj)
prob =
OptimizationProblem with properties:
Description:
ObjectiveSense: minimize
Variables: [2x1 Vector] containing 2 OptimizationVariables
Objective: [1x1 OptimizationExpression]
Constraints: [0x1 Vector] containing 0 OptimizationConstraints
gammabrock 函数是平方和。通过将函数表示为优化表达式的显式平方和,可以得到更高效的问题表示。
obj2 = @fcn2expr (10*(y - gamma(x)))^2 + (1-x)^2 x y
prob2 = optimproblem(Objective=obj2)
prob2 =
OptimizationProblem with properties:
Description:
ObjectiveSense: minimize
Variables: [2x1 Vector] containing 2 OptimizationVariables
Objective: [1x1 OptimizationExpression]
Constraints: [0x1 Vector] containing 0 OptimizationConstraints
基于函数创建非线性约束
在基于问题的优化中,约束是两个优化表达式,它们之间有一个比较运算符(==、<= 或 >=)。您可以使用 @fcn2expr 创建优化表达式。
创建 gammafn2 小于或等于 –1/2 的非线性约束,该函数包含两个变量。
using TyOptimization
gammafn2 = (x,y)-> -gamma(x)*(y/(1+y^2))
创建优化变量,将函数文件转换为优化表达式,然后将约束表示为 confn。
x = optimvar("x",Lowerbnd=0)
y = optimvar("y",Lowerbnd=0)
confn = @fcn2expr gammafn2(x,y) <= -1/2 x y
confn = OptimizationInEquality(gammafn2(x, y) <= -1 / 2)
另外创建一个 gammafn2 大于或等于 x + y 的约束。
confn2 = @fcn2expr gammafn2(x, y) >= x + y x y
创建一个优化问题,并将这些约束放在该问题中。
prob = optimproblem()
prob.Constraints = (confn = confn,confn2 = confn2)
prob
prob =
OptimizationProblem with properties:
Description:
ObjectiveSense: minimize
Variables: [0x1 Vector] containing 0 OptimizationVariables
Objective: [0x0 OptimizationExpression]
Constraints: [2x1 Vector] containing 2 OptimizationConstraints
No problem defined.
# 输入参数
fcn — 要转换的函数函数句柄
要转换的函数,指定为函数句柄。
示例: sin 指定正弦函数。
in — 输入参数OptimizationVariable
输入参数,指定为 OptimizationVariable。注意,这里输入的输入参数不仅仅是当前函数的输入参数,而是整个问题的参数。因此即使一个大问题的某个目标函数或约束并没有包含全部变量,在生成该变量表达式的时候也应该将整个问题所包含的优化参数全部作为输入。
mod — 输入参数定义的模块Module
输入参数定义的模块,指定为 Module。
# 输出参数
out — 输出参数OptimizationExpression
输出参数,以 OptimizationExpression 形式返回。