GP中如何计算和评价复合函数?



我找到了一个解决方法来制作复合函数,但我相信应该有更好的方法来做到这一点:

? f = x^2
%1 = x^2
? g = x^3      
%2 = x^3
? x = g
%3 = x^3
? fog = eval(f) 
%4 = x^6
? x = 2
%5 = 2
? result = eval(fog)
%6 = 64

在这个方法中,我需要多次分配x,我不想使用eval函数。

  1. 您可以将Piotr的漂亮答案简化为

    comp(f, g) = x->f(g(x));
    

实际上,您不需要在comp函数本身中为(全局)变量h赋值。此外,对于单行语句来说,大括号是不必要的,类型注释也是不必要的(它旨在优化字节编译器输出或帮助gp2c;在这种特殊情况下,它们没有帮助)。最后,在闭包定义中,当只有一个参数时,参数列表周围的圆括号是可选的,如(x)

  1. 我会将示例修改如下

    f(x) = x^2;
    g(x) = x^3;
    h = comp(f, g);
    ? h('x)     \ note the backquote
    %1 = x^6
    ? h(2)
    %2 = 64
    

'x中的反引号确保我们使用形式变量x,而不是赋给具有该名称的GP变量的任何值。对于第二个示例,不需要将值2赋值给x,我们可以直接调用h(2)

注:形式变量和GP变量之间的混淆令人遗憾,但对于xy这样的短名称来说非常常见。引入引号操作符是为了避免必须使用kill变量。在更复杂的函数中,系统地键入'x而不是x可能会很麻烦。避免这种情况的惯用结构是my(x = 'x)。这确保了xGP变量确实引用了当前作用域中的形式变量。

PARI/GP支持匿名闭包。所以你可以自己定义函数组合,像这样:

comp(f: t_FUNC, g: t_FUNC) = {
h = (x) -> f(g(x))
};

然后你的代码可以转换成更容易读的形式:

f(x) = x^2;
g(x) = x^3;
h = comp(f, g);
h(x)
? x^6
x = 2; h(x)
? 64

希望,这有帮助。

相关内容

  • 没有找到相关文章

最新更新