Maple:将数字代入表达式的编译函数
Maple: Compiling function that substitutes numbers into expression
我有一个复杂的 Maple 表达式,形式如下:
expr := Sum(f(x, t, n), n=1...N);
为了在 Maple 中对任何 x
和 t
进行数值评估,我可能会写
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
,但是函数 subs
和 value
在 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
我有一个复杂的 Maple 表达式,形式如下:
expr := Sum(f(x, t, n), n=1...N);
为了在 Maple 中对任何 x
和 t
进行数值评估,我可能会写
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
,但是函数 subs
和 value
在 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