编程数学:如何扩展函数

时间:2010-11-15 19:42:11

标签: math

假设我有一个递归定义的数学函数。像这样:

T(1)(x) = 1
T(n)(x) = 2x*T(n-1)(x)-1

所以:

T(1)(x) = 1
T(2)(x) = 2x*1-1 = 2x-1
T(3)(x) = 2x*(2x-1)-1 = 4x^2 - 2x - 1
/* and so on... */

基本上,如果给出T(15)(x),我知道如何编写一个计算x的程序。这不是问题。然而我想知道的是 - 如何编写一个程序,它会给我一个类似于T(10)(x)的多项式(一个看起来像:16x^4 + 3x^3 ...)。

简而言之:我如何递归计算数学表达式,但使用x作为变量(未设置)。

非常感谢任何帮助,

2 个答案:

答案 0 :(得分:0)

我认为您的Mathematica标签可能有误,但无论如何。 Mathematica有一个嵌入式函数RSolve来应对这个问题:

   RSolve[{a[n] == 2  x a[n - 1] - 1, a[1] == 1}, a[n], n]  

结果是:

   a[n] = (x + 2^n (-1 + x) x^n)/(x (-1 + 2 x))    

正如预期的那样

   a[3] = -1 - 2 x + 4 x^2

HTH

答案 1 :(得分:0)

根据评论,我认为有四种选择,按复杂程度排列。

首先,您可以为您要查找的给定多项式实现显式公式(如果存在)。在切比雪夫多项式的情况下,确实存在符合您需求的explicit formula(3 rd 总和)。

但是,如果您正在寻找更通用的东西,即多种类型的多项式,则可以创建多项式的显式列表,直到某个荒谬的顺序,并使用用户提供的变量名进行字符串替换。在大多数系统中,这不会占用大量内存。

第三,如果你希望保持一般性并且仍然递归地产生多项式,你可以使用计算机代数系统,如Mathematica。例如,您可以通过MathLink访问Mathematica,或使用webMathematica的实例,甚至可以从WolframAlpha中删除输出。虽然,我认为你会遇到版权问题。

最后,最复杂,最通用的是创建abstract syntax tree。如果你可以使用c ++,我会看boost.proto这基本上是为你做的。但是,如果您自己创建它,您将有三种类型的二进制操作,addmultiplypower以及两种类型的叶节点,coefficient和{ {1}}。现在,要将树按摩到可以使用它的形式,您必须在树中移动并应用转换规则:替换子树并交换父和子。替换将通过应用标准数学规则来改变树,例如2 + 2变为4并且x * x变为x 2 。但是,真正的工作将是交换父节点和子节点,因为这将用于应用分布式法则(多 - >添加成为add - > mult)并提供使用替换​​的机会。

前两个选项是迄今为止最简单的选项,如果可用,我会选择第一个选项。也就是说,我发现实现MathLink接口或语法树更有趣。

修改:通过将父母与其子女交换来澄清我的意思,请考虑variable的情况。

Graphic showing a basic transformation of a expression tree.

影响4个节点:“Plus”,“Times”和系数1.但是,很容易看出这将通过消除第二个“Times”来减少节点的总数。