Maxima:递归求导

问题描述 投票:0回答:2

我正在尝试编写一些代码,通过求函数的导数来递归地找到泰勒系数,然后在基本情况下计算 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 有点陌生,所以很可能我只是错过了一些明显的东西(即不要认为我没有犯一个愚蠢的错误)。

recursion maxima
2个回答
1
投票

我的建议是使用表达式而不是命名函数。像这样的东西:

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

0
投票

如果您也将 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);
© www.soinside.com 2019 - 2024. All rights reserved.