Memory Mathematica NMINMIZE遇到内存问题

Memory Mathematica NMINMIZE遇到内存问题,memory,wolfram-mathematica,minimize,Memory,Wolfram Mathematica,Minimize,我试图最小化我的函数“FunctionToMinimize”,其定义如下: FunctionToMinimize[a_, b_, c_, d_] := (2.35*Sqrt[ Variance[1/2* (a*#1 + b*#2 + c*#3 + d*#4) ] ] /Mean[1/2*(a*#1 + b*#2 + c*#3 + d*#4)]) &[DataList1[[1 ;; 1000]],DataList2[[1 ;; 1000]], DataL

我试图最小化我的函数“FunctionToMinimize”,其定义如下:

FunctionToMinimize[a_, b_, c_, d_] := (2.35*Sqrt[
   Variance[1/2*
     (a*#1 + b*#2 + c*#3 + d*#4)
    ]
   ]
  /Mean[1/2*(a*#1 + b*#2 + c*#3 + d*#4)]) 
&[DataList1[[1 ;; 1000]],DataList2[[1 ;; 1000]],
DataList3[[1 ;; 1000]], DataList4[[1 ;; 1000]]]
四个参数a、b、c和d被限制在0.5和1.5之间。我现在的问题是,如果我打电话

NMinimize[{Funktion[w, x, y, z],
0.75 < w < 1.25 && 0.75 < y < 1.25 && 0.75 < x < 1.25 && 0.75 < z < 1.25}, 
{w, x, y, z}]
n最小化[{Funktion[w,x,y,z],
0.75
Mathematica内核因内存不足而关闭。如果我只使用数据列表中的前100个条目,它将在4.1秒内找到结果,但是如果我使用数据列表[[1;;1000]]或更多条目,内核将崩溃

有人知道为什么NMinimize函数会占用这么多内存吗?我需要在每个列表中最小化15万个事件

谢谢你的回答, 干杯 Andreas

我猜(但没有任何检查)问题在于,每次调用函数时,Mathematica都试图构造一个从所有数据派生的符号表达式,它占用的内存比您预期的要多得多

不管怎样,好消息是——如果你不久前就忘记了这个问题——你可以把函数变成更简单的东西

因此,首先,
2.35
1/2
s只是通过一个常数因子改变函数,不影响最小值的位置,所以我们忽略它们。接下来,你的函数总是非负的,所以最小化它和最小化它的平方是一样的,让我们这样做

所以现在你试图最小化var(aw+bx+cy+dz)/mean(aw+bx+cy+dz)^2,其中w,x,y,z是(可能相当长的)向量

现在分子和分母都是a,b,c,d中的二次型,它们的系数(以固定方式)依赖于这些向量。具体地说,假设向量的长度为N,那么函数就是

[总和(aw+bx+cy+dz)^2/N-总和(aw+bx+cy+dz)^2/N^2]/(总和(aw+bx+cy+dz)^2/N^2)

您可能更愿意将其写成N sum(aw+bx+cy+dz)^2/sum(aw+bx+cy+dz)^2-1

在这个分数中,例如,分子中bc的系数是2和(xy),分母中的系数是2和(x)和(y)


所以你可以用你的大向量,计算相关系数一次,然后让Mathematica优化一个形式(二次/二次)的函数,这应该是非常轻松的。

只是为了确保,如果
expr=1/2(a dl1+b dl2+c dl3+d dl4)
它是
(2.35*Sqrt[Variance[expr]]/Mean[expr])
您希望最小化吗?是的,确实如此。这实际上是我想最小化的四个不同能量通道的相对分辨率。