Wolfram mathematica 使用符号输入的RecurrenceTable中出错

Wolfram mathematica 使用符号输入的RecurrenceTable中出错,wolfram-mathematica,Wolfram Mathematica,我终于又在做我的工作了,我遇到了一个以前没有发生过的错误。问题的核心围绕着这一准则: 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 } ],

我终于又在做我的工作了,我遇到了一个以前没有发生过的错误。问题的核心围绕着这一准则:

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}]
(当
n
纯粹是符号时,
Part
抱怨
zi[[n]]
ai[[n+1]]
时,使用
Quiet
是必要的。)代码本身是我想要符号结果的函数的一部分,因此
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
不会减少到零。我需要做什么来强制它计算为零,因为它似乎是问题的根源?还有其他选择吗

此外,作为对困扰stackoverflow的Wolfram研究人员的帮助系统的一般投诉:在v.7
RecurrenceTable::nlnum1
中无法搜索!此外,错误末尾的
>
链接也不会将您带到错误定义,而是带您到
递归表的定义,其中常见错误不会相互引用

编辑:在查看我的代码后,我提出的解决方案是完全象征性地评估
重现表
,包括初始条件。工作守则如下:

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]];
Clear[NPointPade,NPointPadeFcn]
NPointPade[pts:{{{{,}..}]:=NPointPade@@Transpose[pts]
NPointPade[zi_List,fi_List]/;长度[zi]==长度[fi]:=
模块[{ap,fcn,rec},
ap={fi[[1]]};
fcn=模[{gp=#,zp,res},
zp=zi[[-Length@gp ;;]];
res=(gp[[1]]-#)/(#2-zp[[1]])#)&[Rest@gp, Rest@zp];
附录[ap,res[[1]];
物件
] &;
nestwile[fcn,fi,(长度[#]>1&];
(*
在不同的初始条件下,使用了两次递推关系,因此
对其进行预评估以传递给NPointPadeFcn
*)
rec[aif_,zif_,a_,b_][z_]:
评估[复发表][
{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[{ziu_List,ai_List,rec_}][z_]/;长度[zi]==长度[ai]:=
模块[{aif,zif},

zif[n_Integer]/;1您可以将零件提取隐藏在函数后面:

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]}
[122]中的
:=zi={0.1,0.2,0.3};
ai={0.904837,1.05171,-0.499584};

在[124]:=zif[n_Integer]/;1中,我认为Sasha的方法可以通过
Block
ing
Part
来模仿

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

Block[{Part},
 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}]
]
-


@萨沙:这可能很愚蠢,但不应该是上面的aif[3]而不是aif[4]吗?A[0]在哪里?@Phi,你说得对。
zif
aif
的定义清晰,然后重新运行
RecurrenceTable
。这是我所期望的输出。但是如果我们重新定义
aif
zif
,然后重新运行
RecurrenceTable
,就会得到相同的奇数输出。看起来像个bug。抓到了!@Sasha,我仍然得到了e错误。很好的尝试,但它似乎不喜欢我。@rcollyer,我得到的结果与@Sasha相同,在Mathematica v.8上没有错误消息,但只是结果如上所述很奇怪。@Sasha清除定义不会更改的输出me@Phi您还需要将
A[1]==ai[[1]]
替换为
A[1]==aif[1]
,清除定义,然后在对
RecurrenceTable
的两次调用中使用
WorkingPrecision->Infinity
重新运行
RecurrenceTable
修复了问题。问题是
tmp
包含
aif[1]
等,这与您在
递归表
调用后的模式不匹配。@Sasha,我完全用另一种方法修复了它,请参见上文。我仍然相信您,因为您延迟评估
ai
的想法是正确的。相反,更改
工作精度似乎并不正确为了我的好奇心,你会用你的更新函数来举例吗?谢谢。为什么你的语法高亮显示粉红/洋红?代码>< < /代码>插槽符号?@男巫先生:可能是因为他改变了它们。你可以改变偏好的颜色。不需要编辑内部记事本。+ 1,它是,而且更简单。我会考虑改变TH。e接受答案。我在这里会很谨慎。你不知道
Part
是否曾在
RecurrenceTable
代码中使用过。按照你的建议在这里可能会起作用,但这是一个很好的通用方法,会带来麻烦。我不介意rcollyer恢复接受答案,只是警告禁用
Part可能会带来可怕的后果在执行系统命令时。@Sasha,说得好。如果RecurrenceTable是一个内核函数,这会被认为是安全的吗?我会说不,但我不确定。
zi = {0.1, 0.2, 0.3};
ai = {0.904837, 1.05171, -0.499584};

Block[{Part},
 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}]
]
{0, 0.904837, 0.904837}
With[{Part = $z}, 
  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}]
] /. $z -> Part
With[{Part = Hold[Part]}, 
  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}]
] // ReleaseHold