我正在尝试计算一个我已经分段定义的函数。我需要对一个变量进行积分,然后对另一个变量求导(变量是独立的)。然而,我定义函数的方式导致mathematica抛出错误或无限求值。我相信导数函数不喜欢积分函数的输出格式,反之亦然,当我试着颠倒步骤的顺序时。被积函数不是手工解析的,所以我需要通过管道将一个函数的输出传递给另一个函数。谁能告诉我哪里出了问题?
\[Theta] = 30 Degree;
d = 50.8*10^-3 ;
reo = (150/2)*10^-3;
rei = ((reo/Tan[\[Theta]]) -
d) Tan[\[Theta]]
B = 24.4*10^-3;
\[CapitalGamma] = 10*10^-3;
l = .2*10^-3;
\[CurlyPhi] = 20 Degree;
Pe = 101325;
Ps = 1.1* Pe ;
\[Gamma] = (\[CurlyPhi]*Sin[\[Theta]])/(B*\[CapitalGamma]^3);
Pd[h_] :=
Sqrt[((Ps^2 + Pe^2*\[Gamma]*h^3*(l + h) +
Log[rei/reo])/(1 + \[Gamma]*h^3*(l + h) + Log[rei/reo]))]
rd = Sqrt[reo*rei]
P [r_, h_] :=
Piecewise[{{Sqrt[
Pd[h]^2 + .5*(Pe^2 - Pd[h]^2)*Log[rei/reo]*Log[rd/r]],
r > rd}, {Sqrt[
Pd[h]^2 + .5*(Pe^2 - Pd[h]^2)*Log[rei/reo]*Log[r/rd]], r < rd}}];
W[h_] := Integrate[2*Pi*r*P[r, h]/9.8, {r, rei, reo}]
S[h_] := D[W[h], h]
Plot[{P[r, 10*10^-6], P[r, 8*10^-6], P[r, 6*10^-6], P[r, 4*10^-6],
P[r, 2*10^-6], P[r, 1*10^-6]}, {r, rei, reo}]
Plot[W[h], {h, 1*10^-6, 10*10^-6}]
Plot[S[h], {h, 1*10^-6, 10*10^-6}]发布于 2013-02-09 07:56:38
你试图做一个非常复杂的计算,在这个积分中进行非常多的次数,然后做一个非常非常多的曲线图。在我的系统上,只得到一分就需要10分。所以你需要让它变得更快。我推荐这样编译P:
P = Compile[{{r, _Real}, {h, _Real}},
Module[{Pdh = Sqrt[(
Ps^2 + Pe^2 \[Gamma] h^3 (l + h) + Log[rei/reo])/(
1 + \[Gamma] h^3 (l + h) +
Log[rei/reo])]}, \[Sqrt](Pdh^2 + .5 (Pe^2 - Pdh^2) Log[rei/
reo] Log[Min[rd, r]/Max[rd, r]])]]这会让事情变得更快,但现在我们需要确保我们总是使用数值表达式,而不是符号表达式。这意味着积分需要变成
W[h_] := NIntegrate[(2 \[Pi] r P[r, h])/9.8, {r, rei, reo}]导数需要变成
Needs["NumericalCalculus`"]
S[h_] := ND[W[hh], hh, h]这使速度提高了大约100倍,并且绘图出来了。您可能仍会看到一些警告消息,但可以忽略它们。如果对W和S的定义感到困扰,可以抛出一个Quiet。
https://stackoverflow.com/questions/14782547
复制相似问题