Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何自动为fmincon找到合适的初始值?_Matlab_Initialization_Minimization_Fminsearch - Fatal编程技术网

Matlab 如何自动为fmincon找到合适的初始值?

Matlab 如何自动为fmincon找到合适的初始值?,matlab,initialization,minimization,fminsearch,Matlab,Initialization,Minimization,Fminsearch,我试图最小化具有非线性约束的目标函数。我的问题是方便地为参数找到一个合适的初始值集。因为初始值也必须满足非线性约束,然而,在我的目标函数中,我有1000多个数据点,导致1000个函数值。因此,我选择的初始值通常不能使我的目标函数在每个数据点都得到有意义的值,即,我的目标函数在某个数据点得到NaN,从而停止最小化过程 我很好奇,有没有什么好方法可以让我自动搜索一个合适的初始值?(因为我有一堆函数要最小化…)任何想法和建议都会很有帮助 例如,我的目标函数是一个函数句柄,如: myFUN

我试图最小化具有非线性约束的目标函数。我的问题是方便地为参数找到一个合适的初始值集。因为初始值也必须满足非线性约束,然而,在我的目标函数中,我有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);
    conFUN1 = integral(integral(conFUN2,u1,0...1),u2, 0...1) = constant.
     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)
我的问题是,我的初始值有时会在myFUN的u1/u2的某些点上得到NaN

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

    [para,fval,exitflag1] = fmincon(@(para)myFUN(para(1),para(2),para(3),u1,u2),para_initial,[],[],[],[],lb,ub,@ucon,options1);
    conFUN1 = integral(integral(conFUN2,u1,0...1),u2, 0...1) = constant.
     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)
我想用这个约束来猜测一些初始值。然而,我不知道如何用数值方法得到未知参数a、b和θ的积分值

我对积分所做的是这样的:

    [para,fval,exitflag1] = fmincon(@(para)myFUN(para(1),para(2),para(3),u1,u2),para_initial,[],[],[],[],lb,ub,@ucon,options1);
    conFUN1 = integral(integral(conFUN2,u1,0...1),u2, 0...1) = constant.
     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), 
像这样的事


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

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


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

您能提供一些代码(例如,您的目标函数)和一些约束条件的示例吗?听起来像是遗传算法的工作……如何对特定的人进行评论?总的来说,这是一个困难的问题。您可能希望得到帮助,找到积分的闭式解或至少是一个好的近似值。用精确的公式试试math.SE。听起来像是粒子群优化的工作。