1

我正在使用 Mathematica 9 Student Edition,但遇到递归限制错误问题。我编写了一个可以工作并涉及数值积分的程序。如果我自己运行这个过程并插入我想要测试的值,那么这个过程就可以正常工作。该过程打印在下面。对于任何感兴趣的人,它应该将两个随机变量 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:超出 1024 的递归深度”。谁能解释我为什么会收到此错误以及如何补救?

此外,我希望在循环中使用此过程,以便我可以一遍又一遍地运行此过程并稍微更改其中一个变量并使用 Print 语句输出我的结果。我曾尝试使用 Do 循环和 For 循环,但我遇到了与以前相同的问题,即“$RecursionLimit::reclim: Recursion depth of 1024 exceeded”错误消息。有谁知道使用一个循环是否比另一个循环更有优势,以及循环的问题是否与我的 Print 语句问题相同?

谢谢您的帮助!

4

1 回答 1

1

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

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 回答