1

区分的に定義した関数を評価しようとしています。ある変数に関してそれを統合してから、別の変数に関して導関数を取る必要があります(変数は独立しています)。しかし、私が関数を定義している方法で何かが原因で、数学がエラーをスローしたり、無限に評価したりしています。微分関数は積分関数の出力の形式が好きではないと思います。逆の場合は、ステップの順序を逆にするのに疲れました。被積分関数は手動で分析するものではないため、一方の出力をもう一方の出力にパイプする必要があります。誰かが何が悪いのか教えてもらえますか?

\[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

あなたは、その積分で非常に複雑な計算を何度も実行し、次にそのプロットを作成するために非常に多くの回数を実行しようとしています。私のシステムでは、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 に答える