Loops Mathematica中的递归极限错误
我正在使用Mathematica 9学生版,我遇到了递归极限错误的问题。我写了一个有效的程序,包括数值积分。如果我自己运行这个过程并插入我想要测试的值,那么这个过程工作得很好。程序如下所示。对于任何感兴趣的人,应该将两个随机变量betaone和betazero转换为另外两个随机变量gamma和rho,然后使用这些新的随机变量对概率密度函数进行数值积分:Loops Mathematica中的递归极限错误,loops,recursion,wolfram-mathematica,runtime-error,transformation,Loops,Recursion,Wolfram Mathematica,Runtime Error,Transformation,我正在使用Mathematica 9学生版,我遇到了递归极限错误的问题。我写了一个有效的程序,包括数值积分。如果我自己运行这个过程并插入我想要测试的值,那么这个过程工作得很好。程序如下所示。对于任何感兴趣的人,应该将两个随机变量betaone和betazero转换为另外两个随机变量gamma和rho,然后使用这些新的随机变量对概率密度函数进行数值积分: xtheta = .4; xx = .1; c = 1/theta /. theta -> xtheta; gamma = (Log[
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语句的问题相同
谢谢你的帮助 为了给您提供答案,这里是您的代码的清理版本。 注意,我们避免将其指定给我们想要用作积分/导数符号的对象
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})为了提供答案,这里是您的代码的清理版本。 注意,我们避免将其指定给我们想要用作积分/导数符号的对象
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})您已指定betazero/one,然后将其用作模式替换后续,代码在第一次运行时运行良好,重新运行时会出现错误,因为betazero,betaone现在已定义,并且您正在对这些复杂表达式进行求导。只需删除分配即可修复(或在顶部清除它们)Mathematica现在有一个专用的StackExchange站点:--请在那里询问您将来的问题。您已分配了betazero/one,然后将其用作模式替换后续,代码在第一次通过时运行良好,重新运行时会出现错误,如betazero,现在定义了betaone,并对这些复杂的表达式求导。只需删除作业即可修复(或在顶部清除它们)Mathematica现在有一个专用的StackExchange站点:--请在那里询问您将来的问题。谢谢George!你真的想方设法解决了我的问题!我想我现在明白为什么它以前不起作用了。谢谢你澄清,谢谢乔治!你真的想方设法解决了我的问题!我想我现在明白为什么它以前不起作用了。谢谢你澄清这一点。