4

我试图最小化具有非线性约束的目标函数。我的问题是方便地为参数找到合适的初始值集。但是,因为初始值也必须满足非线性约束,所以在我的目标函数中,我有超过 1000 个数据点,从而产生 1000 个函数值。结果,我选择的初始值通常不能使我的目标函数在每个数据点都获得有意义的值,即我的目标函数在某个数据点获得 NaN,这会停止最小化过程......

我很好奇有什么好方法可以让我自动搜索合适的初始值吗?(因为我有一堆功能要最小化......)任何想法和建议都会有所帮助!

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

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

这里的u1和u2需要放入data中。

我所做的是这样的:

    [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), 

类似的东西...

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

4

1 回答 1

1

我不确定在您的情况下首先使用基于梯度的方法是否是好的解决方案。您应该使用一些启发式方法,例如 Monte-Carlo、模式搜索或进化算法。或者在我看来,最好的解决方案是将基于梯度的局部方法与蒙特卡洛相结合:

首先,您尝试设计变量的随机值:a、b、theta、u1、u2,然后检查答案是否在您的约束范围内。如果是您从该起点运行局部梯度方法并将结果保存为最小值。比你用设计变量的随机值再试一次,如果答案在约束内,你再运行梯度方法并检查新点是更好还是更差。依此类推,直到一段时间后不会有更好的局部最小值。

于 2014-03-18T10:44:14.997 回答