如何在 GP 中计算和评估复合函数?
How to compute and evaluate composite function in 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
函数。代码不可读和不可维护。
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
希望,这对您有所帮助。
您可以简化 Piotr 对
的精彩回答
comp(f, g) = x->f(g(x));
实际上,您不需要在 comp
函数本身中分配给(全局)变量 h
。此外,单行语句不需要大括号,类型注释也不是必需的(旨在优化字节编译器输出或帮助 gp2c
;在这种特定情况下它们没有帮助)。
最后,当只有一个参数时,参数列表周围的括号在闭包定义中是可选的,如此处的 (x)
。
我会修改示例如下
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)
P.S。形式变量和 GP 变量之间的混淆很不幸,但对于 x
或 y
等短名称来说很常见。引号运算符的引入是为了避免 kill
变量。在更复杂的函数中,系统地键入 'x
而不是 x
可能会很麻烦。避免这种情况的惯用结构是 my(x = 'x)
。这确保 x
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
函数。代码不可读和不可维护。
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
希望,这对您有所帮助。
您可以简化 Piotr 对
的精彩回答comp(f, g) = x->f(g(x));
实际上,您不需要在 comp
函数本身中分配给(全局)变量 h
。此外,单行语句不需要大括号,类型注释也不是必需的(旨在优化字节编译器输出或帮助 gp2c
;在这种特定情况下它们没有帮助)。
最后,当只有一个参数时,参数列表周围的括号在闭包定义中是可选的,如此处的 (x)
。
我会修改示例如下
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)
P.S。形式变量和 GP 变量之间的混淆很不幸,但对于 x
或 y
等短名称来说很常见。引号运算符的引入是为了避免 kill
变量。在更复杂的函数中,系统地键入 'x
而不是 x
可能会很麻烦。避免这种情况的惯用结构是 my(x = 'x)
。这确保 x
GP 变量真正引用当前作用域中的正式变量。