【发布时间】:2019-06-12 21:12:17
【问题描述】:
我有一个优化脚本(如下),它给了我错误:
"未定义函数 'cos' 用于输入参数类型 'optim.problemdef.OptimizationExpression'。”
为了确保cos 函数没有问题,我将confn2 中的cos 更改为sin,然后得到:
"未定义函数'sin'用于输入参数类型 'optim.problemdef.OptimizationExpression'。”
但是,如果我在命令行窗口中输入 cos(pi),我会得到 -1。
我之前已经成功运行过这个脚本,除了 sigma(出现在 cos() 中)不是优化变量,因此对三角函数进行了评估,留下了一些线性的东西。这种类型的优化脚本是否不适用于三角函数的约束? MATLAB 中是否有替代方案?
k1 = optimvar('k1', 'LowerBound', -3, 'UpperBound', 3);
k2 = optimvar('k2', 'LowerBound', -3, 'UpperBound', 3);
f = optimvar('f', 'LowerBound', -3, 'UpperBound', 3);
sigma = optimvar('sigma', 'LowerBound', 0, 'UpperBound', 6.28318530718);
obj = fcn2optimexpr(@eq1, k1, k2, f, sigma);
confn1 = obj == 0;
confn2 = -0.9313129901097519*k1 - 1.4693755421886672*k2 - 0.18532000686683578*f*cos((1/2)*(-0.372795 + 2*sigma)) + 0.9826782255931369*f*sin((1/2)*(-0.372795 + 2*sigma)) <= 0;
prob = optimproblem('Objective', obj);
prob.Constraints.confn1 = confn1;
prob.Constraints.confn2 = confn2;
k0.k1 = 0;
k0.k2 = 0;
k0.f = 0;
k0.sigma = 0;
[sol, fval, exitflag, output] = solve(prob, k0)
function f1 = eq1(k1, k2, f, sigma)
f1 = 0.01308996938995749 - 0.3642198710296203*k1 - 0.6784053942919677*k2 + 0.37064001373367156*f*sin((1/2)*(-0.372795 + 2*sigma));
end
【问题讨论】:
-
cos是公认的功能,但不适用于"input arguments of type optim.problemdef.OptimizationExpression"。你实际上是在做cos(sigma),它没有被定义,因为sigma不是一个数字变量,你使用optimvar创建它。 -
嘿@Wolfie!非常感谢 - 这就是我认为错误发生的时间。有没有办法在这个优化脚本中纠正这个问题,允许
sigma保持optimvar,还是我需要写一些完全不同的东西? -
我不知道,这是一个不同的问题,我从未使用过
optimproblem。
标签: matlab optimization