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