Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Wolfram mathematica NMinimize非常慢_Wolfram Mathematica_Minimization - Fatal编程技术网

Wolfram mathematica NMinimize非常慢

Wolfram mathematica NMinimize非常慢,wolfram-mathematica,minimization,Wolfram Mathematica,Minimization,你是我最后的希望。 在我的大学里,没有人能回答我的问题。 我得到了一个非常复杂的函数,它依赖于6个参数a0,a1,a2,b0,b1,b2,这些参数通过一个新的状态方程来计算,使压强,体积液体和体积蒸汽的增量最小。 NMinimize非常慢,我不能考虑这个等式,因为时间非常长。 在代码中有一些关于我的代码的解释和一些问题。 跪下,我请求你帮助我。 很抱歉,但在构建这些方程4个月后,我无法测试它。挫折感与日俱增 Clear["Global`*"]; data = {{100., 34.376,

你是我最后的希望。 在我的大学里,没有人能回答我的问题。 我得到了一个非常复杂的函数,它依赖于6个参数a0,a1,a2,b0,b1,b2,这些参数通过一个新的状态方程来计算,使压强,体积液体和体积蒸汽的增量最小。 NMinimize非常慢,我不能考虑这个等式,因为时间非常长。 在代码中有一些关于我的代码的解释和一些问题。 跪下,我请求你帮助我。 很抱歉,但在构建这些方程4个月后,我无法测试它。挫折感与日俱增

Clear["Global`*"];

 data = {{100., 34.376, 0.036554, 23.782}, {105., 56.377, 0.037143, 
 15.116}, {110., 88.13, 0.037768, 10.038}, {115., 132.21, 0.038431,
 6.9171}, {120., 191.43, 0.039138, 4.9183}, {125., 268.76, 
  0.039896, 3.5915}, {130., 367.32, 0.040714, 2.6825}, {135., 
 490.35, 0.0416, 2.0424}, {140., 641.18, 0.042569, 1.5803}, {145., 
823.22, 0.043636, 1.2393}, {150., 1040., 0.044825, 
0.98256}, {155., 1295., 0.046165, 0.78568}, {160., 1592.1, 
0.047702, 0.63206}, {165., 1935.1, 0.0495, 0.51014}, {170., 
2328.3, 0.051667, 0.41163}, {175., 2776.5, 0.054394, 
0.33038}, {180., 3285.2, 0.058078, 0.26139}, {185., 3861.7, 
0.063825, 0.19945}, {190., 4518.6, 0.079902, 0.12816}};
tvector = data[[All, 1]];(*K*)
pvector = 
data[[All, 2]];(*KPa*)
vlvector = data[[All, 3]];(*L/mol*)
vvvector = 
data[[All, 4]];
(*L/mol.*)
r = 8.314472;
tc = 190.56;
avvicinamento = Length[tvector] - 3;
trexp = Take[tvector, avvicinamento]/tc;
vlexp = Take[vlvector, avvicinamento];
vvexp = Take[vvvector, avvicinamento];
zeri = Table[i*0., {i, avvicinamento}];
pexp = Take[pvector, avvicinamento];
(*Function for calculation of Fugacity of CSD Equation*)
(*Function for calculation of Fugacity of CSD Equation*)
fug[v_, p_, t_, a_, b_] := 
Module[{y, z, vbv, vb, f1, f2, f3, f4, f}, y = b/(4 v);
z = (p v)/(r t);
vbv = Log[(v + b)/v];
vb = v + b;
f1 = (4*y - 3*y^2)/(1 - y)^2;
f2 = (4*y - 2*y^2)/(1 - y)^3;
f3 = (2*vbv)/(r t*b)*a;
f4 = (vbv/b - 1/vb)/(r t)*a;
f = f1 + f2 - f3 + f4 - Log[z];
Exp[f]]

(*g Minimize the equality of fugacity*)
g[p_?NumericQ, t_?NumericQ, a0_?NumericQ, a1_?NumericQ, a2_?NumericQ, 
b0_?NumericQ, b1_?NumericQ, b2_?NumericQ] := Module[{},
a = a0*Exp[a1*t + a2*t^2];
b = b0 + b1*t + b2*t^2;
csd = a/(r*t*(b + v)) - (-(b^3/(64*v^3)) + b^2/(16*v^2) + 
    b/(4*v) + 1)/(1 - b/(4*v))^3 + (p*v)/(r*t);
vol = NSolve[csd == 0 && v > 0, v, Reals];
sol = v /. vol;
(*If[Length[sol]==1,Interrupt[];Print["Sol==1"]];*)
vliquid = Min[sol];
vvapor = Max[sol];
fl = fug[vliquid, p, t, a, b];
fv = fug[vvapor, p, t, a, b];
(*Print[{t,p,vol,Abs[fl-fv]}];*)
Abs[fl - fv]];
(*This function minimize the pcalc-pexp and vcalc-vexp *)
hope[a0_?NumericQ, a1_?NumericQ, a2_?NumericQ, b0_?NumericQ, 
b1_?NumericQ, b2_?NumericQ] := 
Module[{}, 
pp[a0, a1, a2, b0, b1, b2] := 
Table[FindRoot[{g[p, tvector[[i]], a0, a1, a2, b0, b1, b2]}, 
{p,pvector[[i]]}],{i,avvicinamento}];
pressioni1 = pp[a0, a1, a2, b0, b1, b2];
pcalc = p /. pressioni1;
differenza = ((pcalc - pexp)/pexp)^2;
If[MemberQ[differenza, 0.], 
differenza = zeri + RandomReal[{100000, 500000}];(*
First problem:
As I've FindRoot that finds the solutions equal to the starting \
point, I don't want these kind of solutions and with this method - \
+RandomReal[{100000,500000}] - 
a keep away this solutions.Is it right? *)
deltap = Total[differenza],
differenzanonzero = Select[differenza, # > 0 &];
csd1[a_, b_, p_, t_] := 
 a/(r*t*(b + v)) - (-(b^3/(64*v^3)) + b^2/(16*v^2) + b/(4*v) + 
     1)/(1 - b/(4*v))^3 + (p*v)/(r*t);(*Funzione CSD*)
volumi = 
 Table[NSolve[csd1[a, b, pcalc[[i]], tvector[[i]]], v, Reals], {i,
    avvicinamento}];
soluzioni = v /. volumi;
vvcalc = Table[Max[soluzioni[[i]]], {i, avvicinamento}];
vlcalc = Table[Min[soluzioni[[i]]], {i, avvicinamento}];
deltavl = Total[((vlexp - vlcalc)/vlcalc)^2];
deltavv = Total[((vvexp - vvcalc)/vvcalc)^2];
deltap = Total[differenza];
Print[a0, "  ", b0, "   ", delta];
delta = 0.1*deltavl + 0.1*deltavv + deltap]];
NMinimize[{hope[a0, a1, a2, b0, b1, b2], 
500 < a0 < 700 && -0.01 < a1 < -1.0*10^-5 && -10^-5 < a2 < -10^-7 &&
0.0010 < b0 < 0.1 && -0.0010 < b1 < -1.0*10^-5 && 
10^-9 < b2 < 10^-7}, {a0, a1, a2, b0, b1, b2}]
清除[“全局”*”];
数据={100,34.376,0.036554,23.782},{105,56.377,0.037143,
15.116}, {110., 88.13, 0.037768, 10.038}, {115., 132.21, 0.038431,
6.9171}, {120., 191.43, 0.039138, 4.9183}, {125., 268.76, 
0.039896, 3.5915}, {130., 367.32, 0.040714, 2.6825}, {135., 
490.35, 0.0416, 2.0424}, {140., 641.18, 0.042569, 1.5803}, {145., 
823.22, 0.043636, 1.2393}, {150., 1040., 0.044825, 
0.98256}, {155., 1295., 0.046165, 0.78568}, {160., 1592.1, 
0.047702, 0.63206}, {165., 1935.1, 0.0495, 0.51014}, {170., 
2328.3, 0.051667, 0.41163}, {175., 2776.5, 0.054394, 
0.33038}, {180., 3285.2, 0.058078, 0.26139}, {185., 3861.7, 
0.063825, 0.19945}, {190., 4518.6, 0.079902, 0.12816}};
tvector=数据[[全部,1]];(*K*)
pvector=
数据[[全部,2]];(*千帕*)
vlvector=数据[[全部,3]];(*升/摩尔*)
vvvector=
数据[[全部,4]];
(*升/摩尔*)
r=8.314472;
tc=190.56;
avvicinamento=长度[tvector]-3;
trexp=取[tvector,avvicinamento]/tc;
vlexp=取[vlvector,avvicinamento];
vvexp=取[vvvector,avvicinamento];
zeri=表[i*0.{i,avvicinamento}];
pexp=取[pvector,avvicinamento];
(*计算CSD方程逸度的函数*)
(*计算CSD方程逸度的函数*)
fug[v_,p_,t_,a_,b_]:=
模[{y,z,vbv,vb,f1,f2,f3,f4,f},y=b/(4v);
z=(pv)/(rt);
vbv=Log[(v+b)/v];
vb=v+b;
f1=(4*y-3*y^2)/(1-y)^2;
f2=(4*y-2*y^2)/(1-y)^3;
f3=(2*vbv)/(r t*b)*a;
f4=(vbv/b-1/vb)/(r t)*a;
f=f1+f2-f3+f4-对数[z];
Exp[f]]
(*g最小化逸度的等式*)
g[p_u?NumericQ,t_?NumericQ,a0_?NumericQ,a1_?NumericQ,a2_?NumericQ,
b0_?NumericQ,b1_?NumericQ,b2_?NumericQ]:=模块[{},
a=a0*Exp[a1*t+a2*t^2];
b=b0+b1*t+b2*t^2;
csd=a/(r*t*(b+v))-((b^3/(64*v^3))+b^2/(16*v^2)+
b/(4*v)+1/(1-b/(4*v))^3+(p*v)/(r*t);
vol=NSolve[csd==0&&v>0,v,Reals];
sol=v/.vol;
(*如果[Length[sol]==1,则中断[];打印[“sol==1”]];*)
vliquid=Min[sol];
vvapor=最大值[sol];
fl=fug[vliquid,p,t,a,b];
fv=fug[vvapor,p,t,a,b];
(*印刷体[{t,p,vol,Abs[fl-fv]}];*)
Abs[fl-fv]];
(*此功能将pcalc pexp和vcalc vexp*最小化)
希望[a0数值,a1数值,a2数值,b0数值,
b1_?数值,b2_?数值]:=
模块[{},
pp[a0,a1,a2,b0,b1,b2]:
表[FindRoot[{g[p,tvector[[i]],a0,a1,a2,b0,b1,b2]},
{p,pvector[[i]}],{i,avvicinamento}];
压力I1=pp[a0,a1,a2,b0,b1,b2];
pcalc=p/.pressioni1;
差异=((pcalc-pexp)/pexp)^2;
如果[MemberQ[differenza,0.],
differenza=zeri+RandomReal[{100000,500000}](*
第一个问题:
正如我发现的那样,找到的解决方案等于开始\
我不想要这种解决方案,用这种方法-\
+随机实数[{100000500000}]-
a远离这些解决方案。对吗?*)
deltap=总计[差异],
DifferenceZanonZero=选择[Differenceza,#>0&];
csd1[a,b,p,t]:
a/(r*t*(b+v))-((b^3/(64*v^3))+b^2/(16*v^2)+b/(4*v)+
1) /(1-b/(4*v))^3+(p*v)/(r*t);(*Funzione CSD*)
卷i=
表[NSolve[csd1[a,b,pcalc[[i]],tvector[[i]],v,Reals],{i,
avvicinamento}];
soluzioni=v/.volumi;
vvcalc=表[Max[soluzioni[[i]],{i,avvicinamento}];
vlcalc=表[Min[soluzioni[[i]],{i,avvicinamento}];
deltavl=总计[(vlexp-vlcalc)/vlcalc)^2];
deltavv=总计[((vvexp-vvcalc)/vvcalc)^2];
deltap=总计[差异];
打印[a0,”,b0,”,增量];
delta=0.1*deltavl+0.1*deltavv+deltap]];
n最小化[{hope[a0,a1,a2,b0,b1,b2],
500
提前谢谢! 马里亚诺·皮兰托齐
化学工程博士生

您可以尝试将其发布在,但不要期望我们在那里分析您的代码。剖析它,并在需要帮助的地方发布自包含的小块代码。有时,大型和/或困难的问题需要很长时间才能解决。为什么你认为你的问题应该更快地解决?您做了哪些工作来调查
n最小化
的选项,这些选项可能(可能)有助于您更快地完成程序?Mathematica的能力通常令人印象深刻,但你不能现实地期望它能为你解决所有问题,有时(大多数时候)你必须帮助它深入理解你的问题。我遵循了你的所有建议。谢谢。[连结]