我尝试根据函数定义标准正态pdf的导数:
event.consume()
但是如果我输入:
φ(x) := exp (-x^2/2)/sqrt(2 * %pi);
gradef(φ(x),-x*φ(x));
我得到:
diff(φ(x),x);
不是我想要的-(x*%e^(-x^2/2))/(sqrt(2)*sqrt(%pi))`
。
我做错了什么?
谢谢
卡尔
EDiT :
不幸的是,两个建议都不起作用。
答案 0 :(得分:0)
我认为没有错; Maxima只是根据您调用// gcc counter.c -o counter
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
unsigned int i = 0;
while(1) {
printf("%d\n", i);
sleep(1);
i++;
fflush(stdout);
}
}
时给出的定义来评估phi。
我可以考虑尝试一些方法。 (1)在定义phi之前调用 ...
import System.IO
...
counter :: MonadIO m => Source m TL.Text
counter = do
r <- liftIO $ createProcess (proc "./counter" []){ std_out = CreatePipe, std_in = CreatePipe}
let (_, Just outp, _, _) = r
liftIO $ hSetBuffering outp LineBuffering
forever $ do
contents <- liftIO $ hGetLine outp
yield $ TL.pack $ show ("Stdout: " ++ contents)
liftIO $ threadDelay 1000000 -- already put 1s delay in C file, so it's optional
liftIO $ hClose outp
。然后,当您调用gradef
时,可能会在输出中得到phi。不确定是否可以。
(2)使用名词表达式gradef
定义diff
。注意gradef
之前的单引号gradef(φ(x),-x*'φ(x))
;这样就形成了一个所谓的名词表达式,其中可以评估自变量'
,但不调用函数φ(x)
。以后为了评估函数,可以根据需要说出x
来评估φ
中的所有名词表达式。
编辑:这是另一个想法。这对我有用。以前的想法没有用,因为φ评估得太早了。为了防止评估,这个新主意的篇幅更大。请注意,gradef是为ev(someexpression, nouns)
定义的,因此您必须编写someexpression
才能应用gradef。
'φ(x)
gradef会产生一个名词表达式diff('φ(x), x)
,因此,可以将其动词化为:
(%i12) gradef('φ(x), -x*'φ(x));
(%o12) φ(x)
(%i13) diff('φ(x), x);
(%o13) - x φ(x)
看起来像预期那样应用了链式规则:
-x*'φ(x)