Maple:将数字代入表达式的编译函数

Maple: Compiling function that substitutes numbers into expression

我有一个复杂的 Maple 表达式,形式如下:

expr := Sum(f(x, t, n), n=1...N);

为了在 Maple 中对任何 xt 进行数值评估,我可能会写

result := (x_, t_) -> value(subs(x=x_, t=t_, N=1000, expr));
result(0.5, 2.0); # some number

但是,特别是对于大型 N,此计算非常昂贵。我怎样才能加快速度 result(x, t)

我试过使用 Compiler:-Compile,但是函数 subsvalue 在 C 代码中没有类似物,所以失败了。 (Compiler:-Compile(result); 给出错误信息:Warning, the function names {subs, value} are not recognized in the target language。)

如何转换 result 以便更快地编译和评估它,而不必在过程中手动将 Sum 重写为 for 循环?我不能从头开始重新实现它,因为 expr 是象征性生成的,我不想失去一般性。

谢谢。

通过将下面过程result的实际调用包装在对evalf的调用中,我们指示Maple尝试其evalf/Sum数字求和收敛加速技术(通过Levin-u 转型)。如果尾随项的贡献被估计为快速下降 "enough".

restart;

# for an example
f := (x,t,n)->sin((x-t)/n*Pi):

expr := Sum(f(x, t, n), n=1...N):

result1 := unapply( expr, [x,t,N] ):

evalf(result1( 2.0, 0.1, 10000 ));
                      46.91622734

下面的过程 result2 使用 add 而不是 sum。您将 value 命令应用于惰性 Sum 的原始方法将产生一个活动的 sum 调用,该调用 - 在每次调用时,对于每组传递的参数 - 可能会结束导致符号求和的缓慢且不必要的不​​成功尝试 before 回落到仅以数字方式将项相加。

通过简单地用更合适的 add 命令替换惰性 Sum 我们可以绕过所有这些重复的、失败的和浪费的符号求和尝试,直接进行数字加法的工作列出所有条款。

result2 := unapply( subs(Sum=add,expr), [x::float,t::float,N::integer] ):

result2( 2.0, 0.1, 10000 );
                      46.91622733

如果表达式 expr 是 evalhf'able 那么(因为 add 也是)我们可以改为对 Maple 下的所有项进行数值相加更快 double-precision floating-point评价机制

evalhf(result1( 2.0, 0.1, 10000 ));
                  46.9162273272279222