我有一个多变量函数,我希望最小化。该函数有两个输入参数,一个向量c和一个标量\ theta。
在MATLAB中使用fmincon来解决c和\ theta的优化问题很复杂,因为\ theta的某些值会导致数值误差。但是,修复theta,c可以通过fmincon轻松获得,没有任何错误。
所以现在的计划是做一个蛮力的方法,即在1:100的范围内为\ theta的每个值计算c(尽管\ theta的真正约束是\ theta \ ge 0)并选择\ theta(以及通过将估计的参数插回目标函数来最小化目标值的相应的c)。
现在这对我来说听起来不是很有效,我想知道我是否可以采用二分法 - esque方法,这样我就不必在范围内查看\ theta的所有可能值如上所述。
非常感谢!
答案 0 :(得分:1)
您应该能够让fmincon在c
和theta
上为您工作。如果在包含theta时获得合适的结果有问题,可能是因为c
和theta
中的元素具有非常不同的比例。您应该缩放方程式,以便所有变量的最终值都是1.0。这个极大提高了几乎所有数值优化代码的性能(即速度)和准确性。
因此,如果您怀疑c
的最终值可能最终为[1.0 0.001 10.0]并且您怀疑theta可能最终为[10.0],那么您可以将问题表述为
>>>>>>>>>>>>>>>>>>>>> in your main program prior to invoking fmincon
c = [1.0 0.001 10.0]
theta = 10.0
foo_x = [c(:);thetha];
scale_fac = [1.0 1000.0 0.1 0.1];
x = foo_x .* scale_fac; %scale your seed values to be near 1.0
>>>>>>>>>>>>>> inside your function
function err = myfunction(x,scale_fac)
foo_x = x ./ scale_fac; %de-scale to get back to correct magnitude
c = foo_x(1:3);
theta = foo_x (4);
...rest of your code
答案 1 :(得分:1)
只有当目标函数在θ中凸(或拟凸)时,对θ的二分搜索才有效。否则,您可能会发现本地最小值而不是全局最小值。
如果你选择一个能够解决非凸优化问题的求解器,那么像@chipaudette建议的那样做一个嵌套的fmincon应该可行。 (关于这个主题的MATLAB help有点模糊,但我认为SQP求解器应该没问题。)但我怀疑只是枚举theta的相关范围会更有效,而不是使用fmincon来实现它