Нахождение формы Бине в Mathematica - PullRequest
2 голосов
/ 17 ноября 2011

Предположим, у меня есть линейное повторение *, и я хочу найти его представление Binet в закрытой форме.Есть ли хороший способ сделать это в Mathematica?

Это кажется очень простой просьбой, и, конечно, есть много естественных способов попросить Mathematica сделать это для меня.Но до сих пор все, что я пробовал, терпело неудачу: оно взбалтывалось до тех пор, пока использование памяти не стало настолько высоким, что операционная система вынуждена его закрывать или предупреждений о том, что не знает, как упростить простые выражения † или тому подобное.Я мог бы понять это, если бы вопрос был сложным, но это не так - разложить характеристическое уравнение, найти корни и решить линейную систему.Самый последний раз, когда я пытался это сделать (и имел сбой программы), был на примере степени 9, и я просто не думаю, что линейную систему 9 на 9 должно быть так трудно решить.

Конечно, я не единственный, кто должен делать это время от времени!Как правильно это сделать?

Я потерял сеанс, поэтому у меня нет точного кода, который я пробовал.Одно решение создало Список с повторением и его начальными точками и использовало RSolve.Другой нашел и проанализировал характеристическое уравнение и получил соответствующие корни к n-й степени, умноженной на полиномы степени, соответствующей кратности с коэффициентами, сгенерированными из C [i].Я также пробовал Решать и Уменьшать различными способами.

* Или рациональная производящая функция.На самом деле я начну с List чисел, которые описываются повторением менее половины его длины, и FindLinearRecurrence или FindGeneratingFunction может выполнить не слишком сложное преобразование.

†Например, когда я попросил его решить одно повторение, он задохнулся от греха ^ 2 (3pi / 14) + cos ^ 2 (3pi / 14) в ходе вычисления, сказав, что он исчерпал точность.Вы могли бы подумать, что это может символически упростить что-то подобное, но нет.

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Я не уверен, что это то, что вы имели в виду, но вы могли бы сделать что-то вроде

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 -ая запись в таблице повторений будет равна 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.} *)
1 голос
/ 18 ноября 2011

Я не знаю форму Binet, но отвечаю на ваши вопросы относительно упрощения:

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

Simplify[expr]
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...