如何自动为fmincon查找正确的初始值?

时间:2013-12-17 02:52:22

标签: matlab initialization minimization fminsearch

我正在尝试使用非线性约束来最小化目标函数。我的问题是方便地为参数找到合适的初始值集。因为初始值必须满足非线性约束,但是,在我的目标函数中,我有超过1000个数据点,导致1000个函数值。因此,我选择的初始值通常不能使我的目标函数在每个数据点获得有意义的值,即,我的目标函数在某个数据点获得NaN,这将停止最小化过程......

我很好奇有没有什么好办法可以自动搜索合适的初始值? (因为我有一堆功能可以最大限度地减少......)任何想法和建议都会有所帮助!

例如,我的目标函数是一个函数句柄,如:

      myFUN = @(a,b,theta,u1,u2)function_handle.

这里需要将u1和u2放入数据中。

我做的是这样的:

    [para,fval,exitflag1] = fmincon(@(para)myFUN(para(1),para(2),para(3),u1,u2),para_initial,[],[],[],[],lb,ub,@ucon,options1);

我的问题是,对于myFUN,我的初始值有时会为u1 / u2的某些点获得NaN。

现在我要做的是使用其他一些约束来获得有意义的初始值。例如,我有一个像这样的积分函数:

    conFUN1 = integral(integral(conFUN2,u1,0...1),u2, 0...1) = constant.

我想用这个约束来猜测一些初始值。但是,我不知道如何用未知参数a,b和theta数值地得到积分值。

我对积分做的是这样的:

     inner = @(a,b,th,u2)quadgk(@(u1)conFUN2(a,b,th,u1,u2),0.0001,0.9999)

     DBintegral = @(a,b,th)quadgk(@(u2)arrayfun(inner(a,b,th,u2)), 0.0001,0.9999)

我希望获得

的值
     DBintegral(1,1,3), 

类似的......

我不确定我是否清楚地解释了我的问题......

1 个答案:

答案 0 :(得分:1)

我不确定在您的情况下,首先使用基于渐变的方法是否是一个很好的解决方案。您应该使用一些启发式方法,如蒙特卡罗,模式搜索或进化算法。 或者我认为最好的解决方案是基于渐变的局部方法与蒙特卡罗的混合:

首先,您尝试设计变量的随机值:a,b,theta,u1,u2,然后检查答案是否在您的约束内。如果是,则从此起点运行局部渐变方法,并将结果保存为最小值。比你再次尝试设计变量的随机值,如果答案将在内部约束,你再次尝试运行梯度方法并检查新点是好还是坏。依此类推,直到在某个时间内没有更好的当地最低价值。