gpt4 book ai didi

wolfram-mathematica - 带有符号输入的 RecurrenceTable 中的错误

转载 作者:行者123 更新时间:2023-12-04 08:14:36 25 4
gpt4 key购买 nike

我终于再次处理我的 n-point Pade code ,并且我遇到了以前没有发生的错误。问题的核心围绕着这段代码:

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 是必要的,因为当 Part 纯粹是符号时, zi[[n]] 会提示 ai[[n+1]]n。)代码本身是我想要一个符号结果的函数的一部分,因此 zSymbol 。但是,当我运行上面的代码时,出现错误:
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 不可搜索!错误末尾的 >> 链接也不会将您带到错误定义,而是将您带到 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]];

与内置插值函数一样, NPointPade 进行一些预处理,并返回一个可以计算的函数 NPointPadeFcnNPointPade 进行的预处理从 ai s 和这些点的函数值生成 zi s 的列表,此外还对递推关系进行了预评估。当 NPointPadeFcn 提供 z 值时,它通过提供适当的值来评估两个线性递推关系。

编辑 :为了好奇,这里是运行中的 NPointPade
NPointPade in action

在第一个图中,很难区分两个函数之间的区别,但第二个图中显示了绝对(蓝色)和相对(红色)误差。正如所写,创建一个 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]}

编辑

这是该问题的解决方法:
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}
Block用于暂时删除 aif 的定义和 zifRecurrenceTable被执行。然后,当 Block退出,值恢复, RecurrenceTable的输出评估。

关于wolfram-mathematica - 带有符号输入的 RecurrenceTable 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com