1

我正在尝试评估我分段定义的函数。我需要对一个变量进行积分,然后对另一个变量求导(变量是独立的)。但是,我定义函数的方式导致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}]
4

1 回答 1

1

您试图在该积分中进行非常多次的非常复杂的计算,然后进行非常非常多的次数来绘制该图。在我的系统上,获得一分需要 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 倍,情节就出来了。您可能仍会看到一些警告消息,但可以忽略它们。抛出一个Quiet周围的定义,W如果S它困扰你。

于 2013-02-08T23:56:37.867 回答