关于优化例程/使用约束的建议

时间:2011-01-12 19:01:53

标签: algorithm optimization math wolfram-mathematica

我正在尝试做一些数字,并且很难确定解决问题的适当方法并寻找一些反馈。

到目前为止,我已经在Mathematica完成了所有工作,但是,我相信我需要更多地控制算法的时候到了。

我无法发布图片,所以这里是link 其中H是重质纤维素。 C(k)只是C(r)m=4的FT。在我的情况下,N2000所以你可以看到欧米茄是大量指数的总和。 rho只是密度。您可以看到C(r),因为m=4具有不同的a系数。 IRISM最终是a系数的函数。

我认为这三个方程式正常运行我认为在Mathematica中我会尽量减少IRISM并找到4个a值。我遇到的问题是,由于显而易见的原因,当积分中的对数等于零时,存在不连续性。我似乎无法找到修改Mathematica算法的方法(它们是黑盒子是正确的术语吗?)以便检查试验a值。我正在使用Nelder-Meade和差分进化并尝试不同的约束。但是,我似乎只得到了虚构的结果,显然是来自负的日志,或者如果我足够好地约束以避免显然只有局部最小值,因为我的结果与“正确”结果不匹配。我尝试了几次使用渐变的最小化算法但是我没有太多运气。

我认为我向前迈进的最好方法是从头开始编写最小化例程,或者修改其他代码,这样我就可以在集成之前检查IRISM以确定不连续性。我已经阅读了一些关于惩罚函数,log-barrier等的内容,但对编程有点新意,希望有人能够让我知道一个好的方法是什么开始。我认为最重要的是有太多关于优化的信息,我发现很难知道从哪里开始。

编辑:这是原始输入。如果我需要以不同的方式发布,请告诉我。

OverHat[c][a1_, a2_, a3_, a4_, k_] := (a1*(4*Pi*(Sin[k] - k*Cos[k])))/k^3 + 
   (a2*(4*Pi*(k*Sin[k] + 2*Cos[k] - 2)))/k^4 + 
   (a3*(8*Pi*(2*k - 3*Sin[k] + k*Cos[k])))/k^5 + 
   (a4*(-(24*Pi*(k^2 + k*Sin[k] + 4*Cos[k] - 4))))/k^6

Subscript[OverHat[\[Omega]], \[Alpha]\[Gamma]][k_, \[Alpha]\[Gamma]_, n_] := 
  Exp[(-k^2)*\[Alpha]\[Gamma]*((n - \[Alpha]\[Gamma])/(6*n))]

OverHat[\[Omega]][k_] := Sum[Subscript[OverHat[\[Omega]], \[Alpha]\[Gamma]][k, \[Alpha]\[Gamma], n], 
    {\[Alpha]\[Gamma], 1, n}] /. n -> 2000

IRISM[a1_, a2_, a3_, a4_, \[Rho]_, kmax_] := 
  \[Rho]^2*(1/15)*(20*a1 - 5*a2 + 2*a3 - a4)*Pi - 
   (1/(8*Pi^3))*NIntegrate[(\[Rho]*OverHat[\[Omega]][k]*OverHat[c][a1, a2, a3, a4, k] + 
       Log[1 - \[Rho]*OverHat[\[Omega]][k]*OverHat[c][a1, a2, a3, a4, k]])*4*Pi*k^2, 
     {k, 0, kmax}, WorkingPrecision -> 80]

NMinimize[IRISM[a1, a2, a3, a4, 0.9, 30], {a1, a2, a3, a4}, 
  Method -> "DifferentialEvolution"]

1 个答案:

答案 0 :(得分:1)

Mathematica的FindMinimum如果看到一个虚数就会中止。即使您的目标在约束内是实值,也会发生这种情况,因为默认的障碍方法因为精度控制不佳而且偶尔会超出界限。最简单的方法是将您的目标包裹在Re内。如果您发布完整的代码,您可能会得到更好的答案。

一些一般性建议:

尝试简化Mathematica的目标比重新实现优化算法更容易。原因是一种算法失败通常意味着它是一个难题,其他算法也会失败。

我曾经遇到过FindMinimum发出警告并且无法收敛到正确最小值的问题,我可以通过不同的方法确定分析结果,当我绘制目标表面时,它是有意义的

http://yaroslavvb.com/upload/save/so-plateau.png

在这种情况下,您可以看到问题的严重程度非常严重(几乎是一个稳定状态),并且最小化难以本地化。

当你有不等式约束时,默认方法是Barrier方法,这种方法很昂贵并且提供的精度控制很差。非常低效的事情是将等式约束指定为不等式对,即代替a=b,具有a>=ba<=b。这可能慢3到10倍,而且在数值上也更差 - 结果中a和b可能只是大致相等。

理想情况下,目标是获得一个凸出的问题,没有任何不等式约束并且条件良好。