1

Mathematica 9 Student Edition を使用していますが、再帰制限エラーの問題があります。私は機能し、数値積分を含む手順を書きました。この手順を単独で実行し、テストしたい値をプラグインすると、この手順は問題なく機能します。手順は以下に印刷されています。興味のある方のために説明すると、2 つの確率変数 betaone と betazero を他の 2 つの確率変数 gamma と rho に変換し、これらの新しい確率変数を使用して確率密度関数を数値的に積分することになっています。

xtheta = .4; xx = .1;

c = 1/theta /. theta -> xtheta;

gamma = (Log[theta / (1 - theta)] - betazero - x*betaone) / 
   betaone;  
rho = Exp[ betazero + x*betaone] / (1 + 
    Exp[betazero + x*betaone]); 

JMatrix = {{D[gamma, betazero], 
   D[gamma, betaone]}, {D[rho, betazero], D[rho, betaone]}};

myJacobian = Det[JMatrix] ; gamma =.; rho =.; 

betazero = (1/
    gamma)*((x + gamma)*Log[rho/(1 - rho)] - x*Log[theta/(1 - theta)]);

betaone = (1/gamma)*(Log[theta/(1 - theta)] - Log[rho/(1 - rho)]);

finalPDF = 
  c * myJacobian  /. {betazero -> (1/
        gamma)*((x + gamma)*Log[rho/(1 - rho)] - 
        x*Log[theta/(1 - theta)]), 
    betaone -> (1/gamma)*(Log[theta/(1 - theta)] - 
        Log[rho/(1 - rho)])}; 

theta = xtheta; finalPDF2 = finalPDF /. {x -> xx};

n = NIntegrate[finalPDF2, {rho, 0, xtheta - .001},  {gamma, 0, 1}];

ただし、この手順の直後に Print[n] ステートメントを追加するとすぐに、コードを実行できず、「$RecursionLimit::reclim: 再帰の深さが 1024 を超えました」というエラーが表示されます。このエラーが発生する理由と、それを修正する方法を誰か説明できますか?

さらに、このプロシージャをループで使用して、このプロシージャを何度も実行し、変数の 1 つをわずかに変更して、Print ステートメントを使用して結果を出力できるようにしたいと考えています。Do ループと For ループを使用してみましたが、以前と同じ問題が発生し、「$RecursionLimit::reclim: 再帰の深さが 1024 を超えました」というエラー メッセージが表示されます。あるループを他のループよりも使用する利点があるかどうか、およびループの問題が Print ステートメントの問題と同じであるかどうかを知っている人はいますか?

ご協力ありがとうございました!

4

1 に答える 1

1

答えを提供するために、コードのクリーンアップされたバージョンを次に示します。積分/導関数のシンボルとして使用したいものへの代入を避けることに注意してください。

f[xtheta_, xx_] :=
    Module[{theta, gamma, rho, betazero, betaone, x, sub, myJacobian, 
       JMatrix, finalPDF},
   sub = {
      gamma -> (Log[theta/(1 - theta)] - betazero - x*betaone)/betaone,
      rho -> Exp[betazero + x*betaone]/(1 + Exp[betazero + x*betaone])};
  JMatrix = {
    {D[gamma /. sub, betazero], D[gamma /. sub, betaone]},
    {D[rho /. sub, betazero],D[rho /. sub, betaone]}} ;
   myJacobian = Det[JMatrix];
   finalPDF = myJacobian/theta /.
     {theta -> xtheta,
     betazero -> (1/gamma)*((x + gamma)*Log[rho/(1 - rho)] - 
      x*Log[theta/(1 - theta)]), 
     betaone -> (1/gamma)*(Log[theta/(1 - theta)] - 
      Log[rho/(1 - rho)])};
   NIntegrate[finalPDF /. {x -> xx, theta -> xtheta},
      {rho, 0, xtheta - .001},
      {gamma, 0, 1}]];

n = f[.4, .1]

(* 0.247738 *)

モジュール構造は、これを「安全に」ループさせます。あるパスから次のパスへの意図しない副作用がないことを保証します。

Table[f[p, q], {p, {.2, .4, .6}}, {q, {.1, .2}}]

( {{0.17888, 0.17888}, {0.247738, 0.247738}, {0.197697, 0.197697}} )

于 2013-08-05T14:41:01.840 に答える