我使用的是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})