Mathematica中的递归极限误差



我使用的是Mathematica 9学生版,我遇到了递归极限错误的问题。我写了一个有效的程序,涉及数值积分。如果我自己运行这个过程并插入我想要测试的值,那么这个过程运行得很好。程序打印如下。对于任何感兴趣的人来说,它应该将两个随机变量betaone和betazero转换为另外两个随机参数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:Recursion depth of 1024 exceeded"。有人能解释一下我为什么会犯这个错误,以及我该如何补救吗?

此外,我希望在循环中使用此过程,这样我就可以反复运行此过程,稍微更改其中一个变量,并使用Print语句输出结果。我尝试过使用Do循环和For循环,但我遇到了与以前相同的问题,出现了"$RecursionLim::reclim:Recursion depth of 1024 exceeded"错误消息。有人知道使用一个循环相对于另一个循环是否有好处吗?循环的问题是否与我使用Print语句的问题相同?

谢谢你的帮助!

为了提供答案,这里是您的代码的清理版本。请注意,我们避免分配给我们想用作积分/导数符号的东西。

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})

最新更新