Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 关于要使用的优化例程/约束的建议_Algorithm_Optimization_Math_Wolfram Mathematica - Fatal编程技术网

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

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

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

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

我还不能发布图片,所以这里有一个链接 其中H是重阶函数
C(k)
只是
C(r)
m=4的英尺
N
在我的例子中是
2000
,所以你可以看到ω是大量指数的总和
rho
只是密度
C(r)
正如您所看到的,因为
m=4
对不同的
a
系数有不同的定义。IRISM最终是
a
系数的函数

我认为这三个方程在Mathematica中工作正常,但我试图最小化IRISM,并找到4
a
值。我遇到的问题是,由于明显的原因,当积分中的对数等于零时,存在不连续性。我似乎找不到一种方法来修改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
,have
a>=b
a您可以发布Mma代码。我添加了Mma标签,所以这里的Mma社区可以帮助你。我添加了Mathematica代码。我使用的工作精度为80,以避免底部k^6对较小的k值产生数值噪声。我正在寻找一种方法,以这种方式获得“正确”的答案张贴。这是我用数据窃贼转换的一张旧报纸上的图表。我相信这段代码可以大大改进。我想我可能会降低精度和精度目标,并可能尝试插值omegahat函数,因为它是2000个指数的总和。但这些只是一些想法。这实际上是个好主意。我试着做了一些类似的事情,但只是试着在原木部分的内部重新进行。我将围绕整个表达式进行尝试。谢谢你的建议。