2016-12-09 62 views
1

以下是我的腳本:結果differntiation的數值計算在繪圖而不是在獨立評估


binom_df(s, N, p):= (N!/(s! * (N-s)!)) * (p^s) * (1 - p)^(N-s); 

ddn_binom(s, N, p):= diff(binom_df(s, N, p), s); 
ddn_binom(s, N, p); 

wxplot2d( 
    [ binom_df(s, 100, 1/2), ddn_binom(s, 100, 1/2) ], 
    [s, 30, 70], 
    [ box, false ], 
    [ legend, "N=100, p= 1/2", 
     "diff(binom_df(s, N, p))" 
    ], 
    [ xlabel, "s"] 
); 

for s: 1 thru 10 step 1 do (
    display(s), 
    pr_val: ev((ddn_binom(s1, N1, p1)), s1=s, N1=100, p1=0.5), 
    display(pr_val) 
); 

ddn_binom(10, 100, 1/10); 

wxplot2dddn_binom作品的呼叫;我得到圖表。但在調用ddn_binom的「for」循環失敗,與消息:

diff: second argument must be a variable; found 1 

這是我有一個常量參數的最後一行的原因 但它也失敗消息:

diff: second argument must be a variable; found 10 

我不熟悉Maxima如何工作的基本原則。 如果你能幫助我,我將不勝感激。

謝謝。

BD

+0

對不起,我只是注意到循環變量應該是s1而不是s。這確實修復了循環,但是調用了:ddn_binom(10,100,1/10);仍然給我同樣的錯誤。 – user7274851

+0

忽略之前的評論 - 我正在徘徊,並且感到困惑。原來的問題很好。 – user7274851

回答

0

不要使用變量在你的循環,因爲它在功能上使用。

你可以先得到一個函數,然後evaulate:

for t: 1 thru 10 step 1 do (
    display(t), 
    pr_val: ddn_binom(s1, 100, 0.5), 
    pr_val:ev(pr_val,s1=t), 
    display(pr_val) 
); 

您還可以使用SUBST:

for t: 1 thru 10 step 1 do (
    display(t), 
    pr_val: subst(t,s1,ddn_binom(s1, 100, 0.5)), 
    display(pr_val) 
); 
+0

謝謝Michael;這非常有幫助。 我理解替代是一種解決方案,但是這證明了直接定義的函數(binom_df)和通過符號區分間接定義的函數(ddn_binom)的內部表示存在差異。 如果有一份文件可以幫助您理解爲什麼以及何時預期這種行爲,我將不勝感激。 再一次,謝謝。 BD – user7274851

1
(%i1) binom_df(s, N, p):= (N!/(s! * (N-s)!)) * (p^s) * (1 - p)^(N-s) $ 
(%i2) ddn_binom1(s, N, p):= diff(binom_df(s, N, p), s) $ 

(%i2)函數體不進行評估。每次調用函數ddn_binom1時 被評估, 形式自變量s被分配給實際參數。如果s是數字,則diff將失敗。

您可以使用define如果你想身體評估

(%i3) define(ddn_binom2(s, N, p), diff(binom_df(s, N, p), s)) $ 

fundef返回函數定義:

(%i4) display2d: false $ 
(%i5) fundef(ddn_binom1); 
(%o5) ddn_binom1(s,N,p):=diff(binom_df(s,N,p),s) 
(%i6) fundef(ddn_binom2); 
(%o6) ddn_binom2(s,N,p):=(-(N!*(1-p)^(N-s)*p^s*psi[0](s+1))/((N-s)!*s!)) 
        +(N!*(1-p)^(N-s)*p^s*psi[0]((-s)+N+1))/((N-s)!*s!) 
      -(N!*log(1-p)*(1-p)^(N-s)*p^s)/((N-s)!*s!) 
      +(N!*(1-p)^(N-s)*p^s*log(p))/((N-s)!*s!) 

鏈接到文件:operator :=definefundef