Ошибка в RecurrenceTable с символьным вводом

Я, наконец, снова работаю над своим n-точечным кодом Pade , и я столкнулся с ошибкой, которой раньше не было. Суть дела вращается вокруг этого кода:

zi = {0.1, 0.2, 0.3}
ai = {0.904837, 1.05171, -0.499584}

Quiet[ RecurrenceTable[ {A[0] == 0, A[1] == ai[[1]],
          A[n+1]==A[n] + (z - zi[[n]]) ai[[n+1]] A[n-1]},
          A, {n, Length@ai -1 } ],
   {Part::pspec}]

(Использование Quiet необходимо, поскольку Часть жалуется на zi [[n]] и ai [[n + 1]] , когда n является чисто символическим.) Сам код является частью функции, от которой я хочу получить символический результат, поэтому z представляет собой символ . Но когда я запускаю приведенный выше код, я получаю сообщение об ошибке:

RecurrenceTable::nlnum1: 
  The function value {0.904837,0.904837+0. z} is not a list of numbers with 
  dimensions {2} when the arguments are {0,0.,0.904837}.

Обратите внимание на термин {0.904837,0.904837 + 0. z} , где 0. z не сводится к нулю. Что мне нужно сделать, чтобы заставить его оценить до нуля, как это кажется источником проблемы? Есть ли альтернативы?

Кроме того, в качестве общей жалобы на справочную систему для сотрудников Wolfram Research, которые не могут не беспокоить stackoverflow: в v.7 RecurrenceTable :: nlnum1 недоступен для поиска! Ссылка >> в конце сообщения об ошибке не приведет вас к определению ошибки, а приведет вас к определению RecurrenceTable , вместо этого, где общие ошибки не пересекаются -referenced.

Edit : После просмотра моего кода решение, которое я придумал, заключалось в том, чтобы полностью символьно оценить RecurrenceTable , включая начальные условия. Рабочий код выглядит следующим образом:

Clear[NPointPade, NPointPadeFcn]
NPointPade[pts : {{_, _} ..}] := NPointPade @@ Transpose[pts]

NPointPade[zi_List, fi_List] /; Length[zi] == Length[fi] :=
 Module[{ap, fcn, rec},
  ap = {fi[[1]]};
  fcn = Module[{gp = #, zp, res},
     zp =  zi[[-Length@gp ;;]];
     res = (gp[[1]] - #)/((#2 - zp[[1]]) #) &[Rest@gp, Rest@zp];
     AppendTo[ap, res[[1]]];
     res
  ] &;

  NestWhile[fcn, fi, (Length[#] > 1 &)];

 (*
  The recurrence relation is used twice, with different initial conditions, so
  pre-evaluate it to pass along to NPointPadeFcn
 *)
 rec[aif_, zif_, a_, b_][z_] := 
  Evaluate[RecurrenceTable[
     {A[n + 1] == A[n] + (z - zif[n])*aif[n + 1]*A[n - 1], 
      A[0] == a, A[1] == b}, 
     A, {n, {Length@ap - 1}}][[1]]];

  NPointPadeFcn[{zi, ap, rec }]
 ]

NPointPadeFcn[{zi_List, ai_List, rec_}][z_] /; Length[zi] == Length[ai] :=
 Module[{aif, zif},
  zif[n_Integer] /; 1 <= n <= Length[zi] := zi[[n]];
  aif[n_Integer] /; 1 <= n <= Length[zi] := ai[[n]];
  rec[aif, zif, 0, ai[[1]]][z]/rec[aif, zif, 1, 1][z]
 ]

Format[NPointPadeFcn[x_List]] := NPointPadeFcn[Shallow[x, 1]];

Как и встроенные функции интерполяции, NPointPade выполняет некоторую предварительную обработку, и возвращает функцию, которая может быть оценена, NPointPadeFcn . Предварительная обработка, выполняемая NPointPade , генерирует список ai s из zi s и значений функций в этих точках, в дополнение к предварительной оценке повторяющиеся отношения. Когда NPointPadeFcn снабжен значением z , он оценивает два линейных рекуррентных отношения, снабжая их соответствующими значениями.

Изменить : для любопытных, вот ] NPointPade в работе

NPointPade in action

На первом графике трудно определить разницу между двумя функциями, но второй график показывает абсолютную (синий) и относительный (красный) ошибки. Как было написано, создание пэда на 20 пунктов занимает очень много времени, поэтому мне нужно поработать над его ускорением. Но пока это работает.

6
задан Community 23 May 2017 в 10:30
поделиться