在Mathematica中寻找比奈形式

在Mathematica中寻找比奈形式,math,wolfram-mathematica,Math,Wolfram Mathematica,假设我有一个线性递归*并且我想找到它的闭合形式‘Binet’表示。在Mathematica中有没有一个好的方法可以做到这一点 这似乎是一个非常基本的要求,当然有很多自然的方式让Mathematica为我做这件事。但到目前为止,我尝试过的一切都失败了:它一直在翻腾,直到内存使用量如此之高,操作系统不得不关闭它,或者它发出警告,说它不知道如何简化简单表达式†,等等。如果问题很难的话,我可以理解这一点,但这不是考虑特征方程,找到根,然后解线性系统。我最近一次尝试这个(程序崩溃)是在一个9度的例子上,我

假设我有一个线性递归*并且我想找到它的闭合形式‘Binet’表示。在Mathematica中有没有一个好的方法可以做到这一点


这似乎是一个非常基本的要求,当然有很多自然的方式让Mathematica为我做这件事。但到目前为止,我尝试过的一切都失败了:它一直在翻腾,直到内存使用量如此之高,操作系统不得不关闭它,或者它发出警告,说它不知道如何简化简单表达式†,等等。如果问题很难的话,我可以理解这一点,但这不是考虑特征方程,找到根,然后解线性系统。我最近一次尝试这个(程序崩溃)是在一个9度的例子上,我只是不认为一个9乘9的线性系统应该那么难解

当然,我不是唯一一个需要不时这样做的人!正确的方法是什么

我的会话失败了,所以我没有我尝试过的确切代码。有一个解决方案创建了一个带有递归及其初始点的列表,并使用RSolve。另一个发现并分解了特征方程,并将n次方的适当根乘以对应于多重性的多项式,系数由C[i]生成。我还尝试用各种方法解决和减少问题

*或者一个有理生成函数。实际上,我将从一个
列表
开始,该列表中的数字以小于其长度一半的重复次数进行描述,
FindLinearRecurrence
findgegeneratingfunction
可以进行不太困难的转换


†例如,当我要求它解决一个重复问题时,它在计算过程中被sin^2(3pi/14)+cos^2(3pi/14)卡住了,说精度不够。你可能认为它可以象征性地简化类似的东西,但不是。

我不知道Binet形式,但解决了你对简化的担忧:

expr = Sin[3 pi/14]^2 + Cos[3 pi/14]^2;

Simplify[expr]

1我不确定这是否是你的想法,但你可以这样做

Binet[ker_List, init_List] := 
 Module[{charp, roots, polynomials, coeffs, base, p}, 
  roots = Tally[
    N@Eigenvalues[
      PadLeft[Append[IdentityMatrix[Length[ker] - 1], Reverse[ker]]]]];
  coeffs = Table[p[i, j], {i, Length[roots]}, {j, roots[[i, 2]]}];
  polynomials = 
   Table[(Evaluate[i.#^Range[0, Length[i] - 1]]) &, {i, coeffs}];
  base = roots[[All, 1]];
  {polynomials /. 
    Solve[Table[
       Through[polynomials[n]].base^n == init[[n + 1]], {n, 0, 
        Length[init] - 1}], Flatten[coeffs]][[1]], base}]
然后,对于线性递归
kernel
和初始值
init
Binet[kernel,init]
返回两个列表。第一个包含多项式,第二个包含特征多项式的根。然后,递归表中的
n
-th项等于
a[kernel,init][n]
,其中

a[kernel_, init_] := Evaluate@Module[{p, b}, 
   {p, b} = Binet[kernel, init];
   Through[p[#]].b^#] &
例如,对于斐波那契序列,你会得到

kernel = {1, 1};
init = {1, 1};
{p, b} = Binet[kernel, init]

(* ==> {{0.723607 &, 0.276393 &}, {1.61803, -0.618034}} *)

With[{sol = a[{1, 1}, {1, 1}]}, 
  Table[Chop@sol[n], {n, 0, 10}]];

(* ==> {1., 1., 2., 3., 5., 8., 13., 21., 34., 55., 89.} *)

你是说这个吗?如果是这样的话,就不会有一个函数来为您完成它,但它看起来并不像是一个太糟糕的程序来编写。@Searke:是的。对于某些列表,任何线性递归都有一个形式为
a[n_]:=和[多项式[[i]][n]*基[[i]]^n,{i,1,k}]
的公式,用于多项式和长度为k的基。我想找到这些清单。我写的四个程序都没有给出答案:这些程序都是正确的,但Mathematica由于我上面概述的原因无法解出这些方程。我正在寻找一种绕过Mathemastica局限性的方法。我可以从头开始编写一个程序来实现这一点,不使用Mathematica的符号功能,但在这种情况下,我也不会使用Mathematica——如果不能使用任何高级功能,为什么要支付性能成本呢?“这似乎是一个非常基本的要求”。嗯,考虑到我以前从未听说过Binet表示,它可能不是那么基本(但可能就是我)。上面提到的Mathworld引理上的两个Binet形式似乎很容易被RSolve解决,尽管似乎给出了正确的结果。顺便问一下,你的列表中有什么?一个简单的输入和期望的输出示例会很有帮助。是的,如果我直接输入它,它可以简化它。但是,当它在计算过程中遇到它时,它不仅不会简化它,而且会完全结束计算。@Charles,很抱歉,这没有什么帮助。你能给我一个简短的代码示例吗?Mathematica对此感到窒息?表达式是在计算过程中生成的,还是在计算过程中明确给出的(在这种情况下,可以先简化)。我从来没有输入过Sin,它是由Mathematica生成的,Mathematica认为没有它就无法完成计算。如果它完成了计算并没有简化,我可以使用
Simplify
FullSimplify
,甚至
/。
来摆脱它,但它没有。不过,我会给努力加1。:)Mathematica崩溃时,我丢失了确切的表达式,但我将尝试找到另一个给出相同消息的表达式。这似乎有效,谢谢。Mathematica是否有可能在这里用
根对象(或它们存在时的简化等价物)给出精确解?Charles尝试删除特征值前的N@并看看这在速度和正确性方面是否有效。(我认为这是正确的,但不确定结果的速度或大小。)我也怀疑人们可以从RSolve结果中得到这种形式,但我不太清楚Binet形式是什么。好的,我删除了
N@
并运行
f=Binet[{2,-1,0,0,0,0,1,-2,1},{2,3,4,5,6,7,10,13,16}]
。(这是前面导致崩溃的示例。)当然,
f[[1]][[i]]
是函数,所以我对它们进行了评估,将它们转换为可以简化的数字
f[[1][[1]][]
f[[1][[2]][]]
等工作正常,但由于某种原因,
f[[1][[5]]][
没有工作:它给出了一个
函数::slotn
错误。知道为什么吗?旁注:到目前为止,该函数的叶数为508300,有点高。这花了我一段时间,但我的手简化版本(不在Mathematica中,但不使用任何特殊命令)是43个字符长;它的Mathematica等价物稍长一些,有63个字符,叶数为29。所以我觉得我有一个
kernel = {1, 1};
init = {1, 1};
{p, b} = Binet[kernel, init]

(* ==> {{0.723607 &, 0.276393 &}, {1.61803, -0.618034}} *)

With[{sol = a[{1, 1}, {1, 1}]}, 
  Table[Chop@sol[n], {n, 0, 10}]];

(* ==> {1., 1., 2., 3., 5., 8., 13., 21., 34., 55., 89.} *)