1

我正在使用Mathematica 9学生版,并遇到递归限制错误的问题。我编写了一个可以工作并涉及数值积分的程序。如果我自己运行此过程并插入要测试的值,则此过程可以正常工作。该程序打印如下。任何有兴趣,它应该是两个随机变量,betaone和betazero转换成其他两个随机变量伽马和Rho,然后数值使用这些新的随机变量整合的概率密度函数:Mathematica中的递归限制错误

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:递归深度超过1024”错误消息的问题相同。有谁知道如果使用一个循环比另一个有优势,并且循环的问题与Print语句的问题相同?

谢谢你的帮助!

+0

你已分配betazero /一个然后使用它们作为模式替代 – agentp

+0

后续,第一遍时代码运行良好,重新运行时会出现错误结果,因为现在定义了betazero,betaone,并且您将衍生产品用于这些复杂表达式。简单地取消任务可以修复它(或在顶部清除它们) – agentp

+0

现在有一个专门用于Mathematica的StackExchange站点:http://mathematica.stackexchange.com - 请在那里问你未来的问题。 –

回答

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

+0

谢谢乔治!你真的想尽办法解决我的问题!我想我现在明白为什么它以前不工作。谢谢你澄清这一点。 – Nick