Memory Mathematica在拟合微分方程组参数时内存不足

Memory Mathematica在拟合微分方程组参数时内存不足,memory,memory-leaks,wolfram-mathematica,cache-control,Memory,Memory Leaks,Wolfram Mathematica,Cache Control,当我试图处理我的实验数据时,我在Mathematica遇到了一个记忆问题。我用Mathematica来寻找三个偏微分方程组的最佳参数 当e参数大于0.4时,Mathematica会消耗大量内存。对于e

当我试图处理我的实验数据时,我在Mathematica遇到了一个记忆问题。我用Mathematica来寻找三个偏微分方程组的最佳参数

e
参数大于0.4时,Mathematica会消耗大量内存。对于
e<0.4
,程序运行正常

我曾尝试使用
$HistoryLength=0
,并降低
精度和
工作精度,但没有成功

我试图了解我犯了哪些错误,以及如何限制内存使用

Clear[T, L, e, v, q, C0, R, data, model];
T = 13200; 
L = 0.085; 
e = 0.41; 
v = 0.000557197; 
q = 0.1618; 
C0 = 0.0256; 
R = 0.00075;

data = {{L, 600, 0.141124587}, {L, 1200, 0.254134509}, {L, 1800, 
    0.342888644}, {L, 2400, 0.424476295}, {L, 3600, 0.562844542}, {L, 
    4800, 0.657111356}, {L, 6000, 0.75137817}, 
       {L, 7200, 0.815876516}, {L, 8430, 0.879823594}, {L, 9000, 
    0.900771775}, {L, 13200, 1}};

model[(De_)?NumberQ, (Kf_)?NumberQ, (Y_)?NumberQ] := 
 model[De, Kf, Y] =  yeld /. Last[Last[
     NDSolve[{
       v D[Ci[z, t], z] + D[Ci[z, t], t] == -((
         3 (1 - e) Kf (Ci[z, t] - C0))/(
         R e (1 - (R Kf (1 - R/r[z, t]))/De))),
       D[r[z, t], t] == (R^2 Kf (Ci[z, t] - C0))/(
        q r[z, t]^2 (1 - (R Kf (1 - R/r[z, t]))/De)),
       D[yeld[z, t], t] == Y*(v e Ci[z, t])/(L q (1 - e)),
       r[z, 0] == R,
       Ci[z, 0] == 0,
       Ci[0, t] == 0,
       yeld[z, 0] == 0},
      {r[z, t], Ci[z, t], yeld}, {z, 0, L}, {t, 0, T}]]]

fit = FindFit[
  data, {model[De, Kf, Y][z, t], {0.97  < Y < 1.03, 
    10^-6 < Kf < 10^-4, 10^-13 < De < 10^-9}}, 
     {{De, 10^-12}, {Kf,  10^-6}, {Y, 1}}, {z, t}, Method -> NMinimize]

data = {{600, 0.141124587}, {1200, 0.254134509}, {1800, 
    0.342888644}, {2400, 0.424476295}, {3600, 0.562844542}, {4800, 
    0.657111356}, {6000, 0.75137817}, {7200, 0.815876516}, 
       {8430, 0.879823594}, {9000, 0.900771775}, {13200, 1}}; 

YYY = model[De /. fit[[1]], Kf /. fit[[2]], Y /. fit[[3]]]; 

Show[Plot[Evaluate[YYY[L, t]], {t, 0, T}, PlotRange -> All], 
 ListPlot[data, PlotStyle -> Directive[PointSize[Medium], Red]]]
Clear[T,L,e,v,q,C0,R,data,model];
T=13200;
L=0.085;
e=0.41;
v=0.000557197;
q=0.1618;
C0=0.0256;
R=0.00075;
数据={L,600,0.141124587},{L,1200,0.254134509},{L,1800,
0.342888644},{L,2400,0.424476295},{L,3600,0.562844542},{L,
4800,0.657111356},{L,6000,0.75137817},
{L,7200,0.815876516},{L,8430,0.879823594},{L,9000,
0.900771775},{L,13200,1};
型号[(De_)?NumberQ,(Kf_)?NumberQ,(Y_)?NumberQ]:=
模型[De,Kf,Y]=yeld/。最后的[
NDSolve[{
vd[Ci[z,t],z]+D[Ci[z,t],t]=-((
3(1-e)Kf(Ci[z,t]-C0))/(
re(1-(rkf(1-R/R[z,t]))/De)),
D[r[z,t],t]==(r^2 Kf(Ci[z,t]-C0))/(
qr[z,t]^2(1-(r-Kf(1-r/r[z,t]))/De),
D[yeld[z,t],t]==Y*(veci[z,t])/(lq(1-e)),
r[z,0]==r,
Ci[z,0]==0,
Ci[0,t]==0,
yeld[z,0]==0},
{r[z,t],Ci[z,t],yeld},{z,0,L},{t,0,t}]]
fit=FindFit[
数据,{model[De,Kf,Y][z,t],{0.97最小化]
数据={600,0.141124587},{1200,0.254134509},{1800,
0.342888644}, {2400, 0.424476295}, {3600, 0.562844542}, {4800, 
0.657111356}, {6000, 0.75137817}, {7200, 0.815876516}, 
{8430, 0.879823594}, {9000, 0.900771775}, {13200, 1}}; 
YYY=model[De/.fit[[1]],Kf/.fit[[2]],Y/.fit[[3]];
显示[Plot[Evaluate[YYY[L,t]],{t,0,t},PlotRange->All],
ListPlot[数据,绘图样式->指令[PointSize[中等],红色]]

指向.nb文件的链接:

我有一种隐秘的怀疑,它之所以在您身上失败,是因为您正在缓存结果

您是否需要存储
NDSolve
正在生成的每个解决方案?我有点怀疑这对
Findfit
是否有用,因为我高度怀疑它是否会重新考虑过去的结果

除此之外,这不像是在讨论一个有限域中的整数。您使用的是reals,即使在您指定的范围内,也有许多不同的解决方案。我不认为你想把每一个都储存起来

重写您的代码,以避免:

model[(De_)?NumberQ, (Kf_)?NumberQ, (Y_)?NumberQ] := 
 model[De, Kf, Y] =  yeld /. Last[Last[
     NDSolve[..]
你有:

model[(De_)?NumberQ, (Kf_)?NumberQ, (Y_)?NumberQ] := 
 NDSolve[..]
通过缓存以前的结果,使用
FindFit
,您将像明天一样耗尽内存。通常,当你有一个递归关系时,它是有用的,但在这里,我郑重地建议不要使用它


一些注意事项:

在我的机器上运行了
2415
秒后,Mathematica的内存使用率通过缓存从
112475400
字节增加到
1642280320
字节


我现在正在运行没有缓存的代码。

欢迎使用StackOverflow。请尽你所能清理问题文本中的拼写、语法和标点符号。非常感谢。(使用问题下方的链接。)您所说的
模型中的
(下标[C,i]^(1,0))[z,t]
是什么意思?那应该是衍生的[1,0][Subscript[C,i]][z,t]
?另外,我不能下载你的笔记本文件。该站点似乎正在尝试在我的计算机上安装某些内容。@Mr.Wizard,我格式化了代码并更正了OP的语法,因此应该更具可读性。@Mr.Wizard抱歉,我重新共享了文件。以前是俄罗斯人的网站,我不知道为什么要在你的电脑上下载somthikn,这是一个很好的观点。在任何情况下,您的建议都是为了降低内存消耗而降低性能。我承认我还没有处理过这个问题。@acl:我仍然不相信记忆
NDSolve
的结果会有助于提高性能。我试着在我的机器上运行他的代码,不管有没有回忆录,但似乎都很慢。两次运行完成后,将公布cpu时间和内存使用情况。我同意,在这种情况下,由于您概述的原因,内存化似乎无助于提高速度。我前一段时间试过运行它,但剪切和粘贴代码无效,我没有时间重新查看它,看看编辑是否使其可运行。@acl:问题是上传的笔记本中的代码,以及我的一些小语法更改。它应该运行良好。