【发布时间】:2014-07-12 09:06:26
【问题描述】:
考虑函数
y=1/((1-x^5)(1-x^7)(1-x^11))
WolframAlpha 在几秒钟内计算出 MacLaurin 级数展开式的前 1000 个元素:
https://www.wolframalpha.com/input/?i=maclaurin+series+1%2F%28%281-x%5E5%29%281-x%5E7%29%281-x%5E11%29%29
出于好奇,我编写了一个非常幼稚的 java 程序,使用 BigInteger 来处理多项式系数。在伪代码中它会是这样的:
BigInt next=1;
BigInt factorial=1;
while(true){
function=function.differentiate();
factorial*=++next;
print("Next coefficient is: " + function(0)/factorial);
}
该程序在计算前七个左右的系数后因 java.lang.outofmemory 异常而崩溃,因为分数的分子和分母变成了非常长的多项式。假设我的代码效率低下,但看起来 Wolfram 并没有使用他们在第一年微积分课上向您展示的相同技术。
问题是:Wolfram 使用什么?
作为比较,Wolfram 仅计算同一函数的十次导数所花费的时间比获得多项式的前 1000 项所需的时间要多得多,如果简单地完成,则需要对函数进行 1000 次微分。
https://www.wolframalpha.com/input/?i=tenth+derivative+1%2F%28%281-x%5E5%29%281-x%5E7%29%281-x%5E11%29%29
【问题讨论】:
-
您能否对伪代码这一步提供更详细的说明:
function=function.differentiate();您是否使用 lambda 生成导数函数? -
不,没有 lambda。我使用了一个非常便宜的实现:函数被定义为两个多项式:分子+分母;微分运算符使用为多项式定义的加法和乘法的quitient 规则。多项式定义为两个数组列表:coeffecients+exponents
-
生成 MacLaurin 系列只需要您评估函数并且它的导数为 0。这可以通过微分函数并插入值 0 来完成。或者您可以跳过所有这些,只需 compute the answers numerically.
标签: algorithm calculus taylor-series