我正在尝试做一些数值计算,并且难以确定解决问题和寻找反馈的合适方法。关于优化的建议例程/限制条件使用
到目前为止,我已经完成了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"]
您可以发布您的Mma代码。我添加了Mma标签,以便这里的Mma社区可以帮助您。 – 2011-01-12 20:06:47
我已经添加了Mathematica代码。我正在使用80的工作精度,以避免k值小的k^6产生的数值噪声。我正在寻找一种方法来以这种方式发布“正确”的答案。这是一张来自旧报纸的图表,我用DataThief进行了转换。我相信这个代码可以大大提高。我想我可能会降低精度和精度目标,并可能尝试内插omegahat函数,因为它是2000年指数的总和。但这只是一些想法。 – user573214 2011-01-13 01:30:23