rco*_*yer 6 wolfram-mathematica
我终于再次研究了我的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}]
Run Code Online (Sandbox Code Playgroud)
(使用Quiet
是必要的Part
抱怨zi[[n]]
和ai[[n+1]]
什么时候n
纯粹是象征性的.)代码本身是一个函数的一部分,我想要一个符号结果,因此z
是一个Symbol
.但是,当我运行上面的代码时,我收到错误:
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}.
Run Code Online (Sandbox Code Playgroud)
此处所谓的{0.904837,0.904837+0. z}
地方0. z
不减少到零.我需要做些什么来强制它评估为零,因为它似乎是问题的根源?还有替代品吗?
此外,作为一个关于困扰stackoverflow的Wolfram Research人员的帮助系统的一般抱怨:在第7版中RecurrenceTable::nlnum1
是不可搜索的!也不是,>>
错误结尾处的链接会将您带到错误定义,而是将您带到定义RecurrenceTable
,而不是交叉引用常见错误.
编辑:在查看我的代码之后,我想出的解决方案是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]];
Run Code Online (Sandbox Code Playgroud)
与内置插值函数一样,进行NPointPade
一些预处理,并返回一个可以计算的函数,NPointPadeFcn
.除了预先估计递归关系之外NPointPade
,ai
通过从zi
s和这些点处的函数值生成s 的列表来完成预处理.当NPointPadeFcn
提供z
值时,它通过向两个线性递归关系提供适当的值来评估它们.
编辑:对于好奇,这里NPointPade
正在运作
在第一个图中,很难区分这两个函数,但第二个图显示了绝对(蓝色)和相对(红色)错误.如上所述,创建一个20分的Pade需要很长时间,所以我需要加快速度.但是,就目前而言,它确实有效.
您可以隐藏函数后面的零件提取:
In[122]:= zi = {0.1, 0.2, 0.3};
ai = {0.904837, 1.05171, -0.499584};
In[124]:= zif[n_Integer] /; 1 <= n <= Length[zi] := zi[[n]]
aif[n_Integer] /; 1 <= n <= Length[ai] := ai[[n]]
In[127]:= RecurrenceTable[{A[0] == 0, A[1] == aif[1],
A[n + 1] ==
A[n] + (z - zif[n]) aif[n + 1] A[n - 1]}, A, {n, (Length@ai) - 1}]
Out[127]= {0.904837, 0.904837,
0.904837 - 0.271451 aif[4] + 0.904837 z aif[4]}
Run Code Online (Sandbox Code Playgroud)
以下是该问题的解决方法:
In[4]:= zi = {0.1, 0.2, 0.3};
ai = {0.904837, 1.05171, -0.499584};
In[6]:= zif[n_Integer] /; 1 <= n <= Length[zi] := zi[[n]]
aif[n_Integer] /; 1 <= n <= Length[ai] := ai[[n]]
In[8]:= Block[{aif, zif},
RecurrenceTable[{A[0] == 0, A[1] == aif[1],
A[n + 1] == A[n] + (z - zif[n]) aif[n + 1] A[n - 1]},
A, {n, 0, (Length@ai) - 1}]]
Out[8]= {0, 0.904837, 0.904837}
Run Code Online (Sandbox Code Playgroud)
Block
用于暂时删除的定义aif
,并zif
同时RecurrenceTable
被执行.然后,Block
退出时,将恢复值,并RecurrenceTable
评估输出.