我正在尝试编写一些代码,通过求函数的导数来递归地找到泰勒系数,然后在基本情况下计算 x=0 处的导数。这是我到目前为止的代码:
test(f, n) := block([df],
define(df(x), diff(f(x), x)),
print(n, "|", df(x), "|", f(x)),
if n = 0
then f(0)
else test(df, n-1)
);
test_func(x) := x^2;
test(test_func, 2);
问题是这就是我得到的:
(%i4) test(test_func,2)
2
2 | 2 x | x
1 | 2 | 2
0 | 0 | 0
(%o4) 0
正如你所见,第一次浏览一切看起来都不错,f(x) 是 x^2,df(x) 是 2x。然而,第二次调用 f(x) 时结果为 2,即使上次调用该函数时 df(x) 为 2x。我对 Maxima 有点陌生,所以很可能我只是错过了一些明显的东西(即不要认为我没有犯一个愚蠢的错误)。
我的建议是使用表达式而不是命名函数。像这样的东西:
test(e, n) := block([e1 : diff(e, x)],
print(n, "|", e, "|", e1),
if n = 0
then ev(e, x = 0)
else test(e1, n - 1));
如果您也将 func 定义为 f(x),则它可以工作。
test(f, n) := block([func,df],
define(func(x),f(x)),
define(df(x), diff(f(x), x)),
print(n, "|", df(x), "|", func(x)),
if n = 0
then f(0)
else test(df, n-1)
);
test_func(x) := x^2;
test(test_func, 2);