我有一个复杂的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:-Compile
和subs
在C代码中没有模拟,因此失败。 (value
会显示错误消息:Compiler:-Compile(result);
。)
如何转换Warning, the function names {subs, value} are not recognized in the target language
以便更快地编译和评估它,而无需在过程中手动重写result
as-loop?我无法从头开始重新实现它,因为Sum
是象征性生成的,我不想失去一般性。
谢谢。
答案 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