2011-01-12 19 views
3

我正在尝试做一些数值计算,并且难以确定解决问题和寻找反馈的合适方法。关于优化的建议例程/限制条件使用

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

我不能发布图片,所以这里是link他们 其中H是heaviside stepfunciton。 C(k)只是C(r)m=4的金融时报。 N在我的情况是2000所以你可以看到欧米茄是大量指数的总和。 rho只是densitiy。您可以看到C(r),因为m=4针对不同的a系数。 IRISM最终是a系数的函数。

我有这三个方程正常工作我认为在Mathematica内,但我想尽量减少IRISM并找到4 a值。我遇到的问题是,由于显而易见的原因,当积分中的记录等于零时会出现不连续性。我似乎无法找到修改Mathematica算法的方法(它们是黑匣子就是正确的术语?),以便检查试验值a。我正在使用Nelder-Meade和差异进化并尝试不同的约束条件。然而,我似乎只得到想象的结果,显然来自负Log,或者如果我受到足够的限制,以避免显然只有局部最小值,因为我的结果与“正确”结果不匹配。我尝试了几次使用渐变的最小化算法,但是我没有太多的运气。

我认为我最好的办法是从头开始写一个最小化例程,或者修改其他代码,以便在集成之前检查IRISM以获得不连续性。我已经阅读了一些关于惩罚函数,对数逻辑等的内容,但是对编程有点新意,希望有人能够让我知道一个好的方法是从什么时候开始的。我觉得比任何事情都要好得多,我发现很难知道从哪里开始。

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

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"] 
+0

您可以发布您的Mma代码。我添加了Mma标签,以便这里的Mma社区可以帮助您。 – 2011-01-12 20:06:47

+0

我已经添加了Mathematica代码。我正在使用80的工作精度,以避免k值小的k^6产生的数值噪声。我正在寻找一种方法来以这种方式发布“正确”的答案。这是一张来自旧报纸的图表,我用DataThief进行了转换。我相信这个代码可以大大提高。我想我可能会降低精度和精度目标,并可能尝试内插omegahat函数,因为它是2000年指数的总和。但这只是一些想法。 – user573214 2011-01-13 01:30:23

回答

1

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

一些普遍性的建议:

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

我曾经有一个问题,即FindMinimum给予警告,并没有收敛纠正最低,这点我可以分析判断,它的发生与不同的方法,这是有道理的,当我绘制的目标表面,下面

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

在这种情况下,您可以看到问题在最低限度情况下非常严重(几乎是高原),最低限度难以本地化。

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

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