Maple:将数字替换为表达式的编译函数

时间:2018-03-31 03:48:43

标签: optimization maple

我有一个复杂的Maple表达式,它采用以下形式:

Active.Worksheet

要在Maple中对任何expr := Sum(f(x, t, n), n=1...N); 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:-Compilesubs在C代码中没有模拟,因此失败。 (value会显示错误消息:Compiler:-Compile(result);。)

如何转换Warning, the function names {subs, value} are not recognized in the target language以便更快地编译和评估它,而无需在过程中手动重写result as-loop?我无法从头开始重新实现它,因为Sum是象征性生成的,我不想失去一般性。

谢谢。

1 个答案:

答案 0 :(得分:1)

通过在result的调用中包含下面的过程evalf的实际调用,我们指示Maple尝试其evalf/Sum数值求和收敛加速技术(通过Levin-u变换)。在尾随条款的情况下,这很快。贡献被估计为快速下降"足够"。

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调用,在每次调用时,对于每组传递的参数,都可能会结束在回退到仅以数字方式累加术语之前,导致符号求和的缓慢且不必要的,不成功的尝试。

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

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

result2( 2.0, 0.1, 10000 );
                      46.91622733

如果表达式expr是evalhf,那么(因为add也是如此)我们可以在Maple的快速双精度浮点下对所有项进行数值加法点评估机制。

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