Mathematica:将函数定义为分段定义函数的导数或积分

时间:2013-02-08 22:43:09

标签: wolfram-mathematica

我正在尝试评估我已经分段定义的函数。我需要将它与一个变量相结合,然后将导数相对于另一个变量(变量是独立的)。但是,我定义函数的方式正在导致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}]

1 个答案:

答案 0 :(得分: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倍,并且情节出来了。您可能仍会看到一些警告消息,但可以忽略它们。如果遇到麻烦,请在QuietW的定义周围加S