Результат дифференциации оценивается численно при построении графика, но не при автономной оценке.

Ниже приведен мой сценарий:


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 );

Вызов ddn_binom работает в wxplot2d; Я получаю график. Но вызов ddn_binom в цикле for завершается ошибкой с сообщением:

diff: second argument must be a variable; found 1

по этой причине у меня есть последняя строка с постоянными аргументами, но она тоже не работает с сообщением:

diff: second argument must be a variable; found 10

Я не знаком с основными принципами работы Maxima. Если вы можете мне помочь, я был бы признателен.

Спасибо.

BD


person user7274851    schedule 09.12.2016    source источник
comment
Извините, я только что заметил, что переменная цикла должна быть s1, а не s. Это исправило цикл, но вызов: ddn_binom( 10, 100, 1/10 ); все еще дает мне ту же ошибку.   -  person user7274851    schedule 10.12.2016
comment
Не обращайте внимания на предыдущий комментарий - я качаюсь и путаюсь. Оригинальный вопрос хорош.   -  person user7274851    schedule 10.12.2016


Ответы (2)


 (%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, назначенным фактическому аргументу. diff терпит неудачу, если s является числом.

Вы можете использовать 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 :=, определить, fundef

person slitvinov    schedule 11.12.2016

Не используйте переменную s в своем цикле, потому что она используется в функции.

Вы можете сначала получить функцию, а затем оценить:

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)
);
person Community    schedule 10.12.2016
comment
Спасибо, Майкл; это было очень полезно. Я понимаю подстановку как решение, но это доказывает, что существует разница во внутреннем представлении функции, определенной напрямую (binom_df), и функции, определенной косвенно (ddn_binom) через символическое дифференцирование. Если есть документ, который поможет понять, почему и когда ожидать такого поведения, я был бы признателен. Еще раз спасибо. БД - person user7274851; 10.12.2016