Algorithm 关于要使用的优化例程/约束的建议
我正在尝试做一些数字运算,很难确定解决问题的适当方法并寻求反馈 到目前为止,我已经完成了我在Mathematica的所有工作,但是,我相信我需要更多地控制我的算法的时候到了 我还不能发布图片,所以这里有一个链接 其中H是重阶函数Algorithm 关于要使用的优化例程/约束的建议,algorithm,optimization,math,wolfram-mathematica,Algorithm,Optimization,Math,Wolfram Mathematica,我正在尝试做一些数字运算,很难确定解决问题的适当方法并寻求反馈 到目前为止,我已经完成了我在Mathematica的所有工作,但是,我相信我需要更多地控制我的算法的时候到了 我还不能发布图片,所以这里有一个链接 其中H是重阶函数C(k)只是C(r)和m=4的英尺N在我的例子中是2000,所以你可以看到ω是大量指数的总和rho只是密度C(r)正如您所看到的,因为m=4对不同的a系数有不同的定义。IRISM最终是a系数的函数 我认为这三个方程在Mathematica中工作正常,但我试图最小化IRIS
C(k)
只是C(r)
和m=4的英尺N
在我的例子中是2000
,所以你可以看到ω是大量指数的总和rho
只是密度C(r)
正如您所看到的,因为m=4
对不同的a
系数有不同的定义。IRISM最终是a
系数的函数
我认为这三个方程在Mathematica中工作正常,但我试图最小化IRISM,并找到4a
值。我遇到的问题是,由于明显的原因,当积分中的对数等于零时,存在不连续性。我似乎找不到一种方法来修改Mathematica算法(它们是黑盒,这是正确的术语吗?),以便检查试用a
值。我使用了Nelder Meade和差分进化,并尝试了不同的约束。然而,我似乎只得到了假想的结果,显然是从负对数得到的,或者如果我约束得足够好,明显地避免了局部极小值,因为我的结果与“正确”的结果不匹配。我尝试了几次使用梯度的最小化算法,但是我运气不太好
我认为我前进的最好方法是从头开始编写一个最小化例程,或者修改其他代码,这样我就可以在集成之前检查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"]
Mathematica的FindMinimum
如果看到一个虚数就会中止。即使您的目标是约束内的实值,也可能发生这种情况,因为对于默认屏障方法,它的精度控制较差,并且偶尔会越界。最简单的方法是将你的目标包装在Re
中。如果你发布完整的代码,你可能会得到更好的答案
一些一般性建议:
简化Mathematica的目标比重新实现优化算法更容易。原因是一个算法失败通常意味着这是一个困难的问题,其他算法也会失败
我曾经遇到过一个问题,findminium
发出警告,但未能收敛到正确的最小值,我可以通过分析确定,它是用不同的方法发生的,当我绘制下面的目标曲面时,它是有意义的
(来源:)
在这种情况下,您可以看到问题的条件非常差(几乎是一个平台),并且很难定位最小值
当您有不等式约束时,默认方法是Barrier方法,该方法成本较高,并且精度控制较差。非常低效的做法是将等式约束指定为成对的不等式,即代替a=b
,havea>=b
和a您可以发布Mma代码。我添加了Mma标签,所以这里的Mma社区可以帮助你。我添加了Mathematica代码。我使用的工作精度为80,以避免底部k^6对较小的k值产生数值噪声。我正在寻找一种方法,以这种方式获得“正确”的答案张贴。这是我用数据窃贼转换的一张旧报纸上的图表。我相信这段代码可以大大改进。我想我可能会降低精度和精度目标,并可能尝试插值omegahat函数,因为它是2000个指数的总和。但这些只是一些想法。这实际上是个好主意。我试着做了一些类似的事情,但只是试着在原木部分的内部重新进行。我将围绕整个表达式进行尝试。谢谢你的建议。