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.7RecurrenceTable::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
ingPart
来模仿
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