Как сделать DifferenceRoot и RecurrenceTable полезными для нечисловых разностных уравнений? - PullRequest
6 голосов
/ 14 августа 2011

Сегодня утром, отвечая на вопрос на физическом форуме , я столкнулся с очень плохими показателями DifferenceRoot и RecurrenceTable по сравнению с вычислением выражений наивным приемом производных экспоненциального производящего функционала. Очень небольшое количество копаний показало, что DifferenceRoot и RecurrenceTable не упрощают выражения, поскольку они идут .

Например, посмотрите на следующий вывод RecurrenceTable и как он упрощается простым Expand результатом:

In[1]:= RecurrenceTable[f[n] == a f[n - 1] + (a - 1) f[n - 2] && 
                        f[0] == 0 && f[1] == 1, 
                        f, {n, 6}]
% // Expand

Out[1]= {0, 1, a, -1+a+a^2, -a+a^2+a (-1+a+a^2), 1-a-a^2+a (-1+a+a^2)+a (-a+a^2+a (-1+a+a^2))}
Out[2]= {0, 1, a, -1+a+a^2, -2 a+2 a^2+a^3, 1-2 a-2 a^2+3 a^3+a^4}

Это быстро выходит из-под контроля, поскольку число листьев 20-й итерации (рассчитанное с использованием DifferenceRoot) показывает:

dr[k_] := DifferenceRoot[Function[{f, n}, 
          {f[n] == a f[n - 1] + (a - 1) f[n - 2], f[0] == 0, f[1] == 1}]][k]

In[2]:= dr20 = dr[20]; // Timing
        dr20Exp = Expand[dr20]; // Timing
Out[2]= {0.26, Null}
Out[3]= {2.39, Null}

In[4]:= {LeafCount[dr20], LeafCount[dr20Exp]}
Out[4]= {1188383, 92}

Что можно сравнить с памятной реализацией

In[1]:= mem[n_] := a mem[n-1] + (a-1) mem[n-2] // Expand
        mem[0] = 0; mem[1] = 1;

In[3]:= mem20 = mem[20];//Timing
        LeafCount[mem20]
Out[3]= {0.48, Null}
Out[4]= 92

Итак, мой вопрос: Существуют ли какие-либо опции / приемы, чтобы заставить DifferenceRoot и RecurrenceTable применять (упрощающую) функцию по ходу и тем самым сделать их полезными для нечисловой работы?

Edit: Sjoerd указал ниже, я по глупости выбрал пример с RSolve способным решением в закрытой форме. В этом вопросе меня в первую очередь интересует поведение DifferenceRoot и RecurrenceTable. Если это поможет, представьте, что член f[n-2] умножен на n, так что простого решения в замкнутой форме не существует.

1 Ответ

1 голос
/ 15 августа 2011

Я действительно не могу помочь с вашим вопросом, так как я не использовал эти функции до сих пор, и документы не дают подсказки.Но почему бы вам просто не использовать RSolve здесь?Это дает решение в закрытой форме для каждого из элементов таблицы:

sol = f /. RSolve[f[n] == a f[n - 1] + (a - 1) f[n - 2] && 
                  f[0] == 0 && f[1] == 1, f, n
           ][[1, 1]]

enter image description here

sol@Range[6] // Simplify

enter image description here

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