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