gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:22:37 26 4
gpt4 key购买 nike

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

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

我还不能发布图片,所以这里是 link给他们其中 H 是重步函数。 C(k) 只是 C(r)m=4 的 FT。 N 在我的例子中是 2000 所以你可以看到 omega 几乎是大量指数的总和。 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"]

最佳答案

Mathematica 的 FindMinimum如果它看到一个虚数则中止。即使您的目标是约束内的实值,也会发生这种情况,因为对于默认 Barrier 方法,因为它的精度控制不佳并且偶尔会超出范围。最简单的解决方法是将您的目标包装在 Re 中.如果您发布完整代码,您可能会得到更好的答案。

一些一般性建议:

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

我曾经遇到一个问题 FindMinimum给出了警告并且未能收敛到我可以通过分析确定的正确最小值,它发生在不同的方法中,当我绘制目标表面时它是有意义的,如下


(来源:yaroslavvb.com)

在这种情况下,您可以看到问题在最小值处条件非常糟糕(它几乎是一个平台)并且最小值很难定位。

当您有不等式约束时,默认方法是 Barrier 方法,该方法成本高且精度控制差。非常低效的做法是将等式约束指定为不等式对,即代替 a=b , 有 a>=ba<=b .这可能会慢 3 到 10 倍,而且在数值上也更差——a 和 b 在结果中可能仅近似相等。

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

关于algorithm - 关于优化例程/使用约束的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4672859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com