我有一个递归函数,它可以产生难以知道的表达式数量,每个表达式都需要一个新变量与其相乘。这些变量稍后将通过涉及积分或残差的计算来消除。
如何开发这些未知数量的变量?也许已索引?我在互联网上看到的所有示例都与具有确定大小的先验已知对象一起使用,例如如何通过 while 循环动态创建变量? 或 访问 Python 'for' 循环中的索引
中的“item”我想我可以将其归结为这个简单的示例,以便在我的真实脚本中使用:
import sympy as s
p0,p1,p2,p3,p4=s.symbols('p0 p1 p2 p3 p4')
l = [p0, p1, p2, p3, p4]
def f(n):
if n == 0:
return l[n]
elif n == 1:
return l[n]
else:
return f(n-1)*l[n]+f(n-2)
f(3) # works
f(6) # doesnt' work - need to define ahead of time the
# dummy variables l[6], l[5], ....
# even if they are just symbols for (much) later numerical evaluation.
我需要上面的代码片段来实际提前生成所需的未知数。
我看到了一些关于熊猫的提及,但找不到满足我需要的好例子,甚至不确定这是否是最好的路线。还看到诸如“...未知数量的行[文件]...”或“...未知数量的参数...”,但这些似乎不适用。
索引对象表示一个抽象事物,其索引可以取任何值,对索引的大小没有限制。
import sympy as s
p = s.IndexedBase("p")
def f(n):
if n == 0 or n == 1:
return p[n]
else:
return f(n-1)*p[n] + f(n-2)
print(f(7))
输出
(p[0] + p[1]*p[2])*p[3] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + p[0] + p[1]*p[2])*p[5] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + ((p[0] + p[1]*p[2])*p[3] + (((p[0] + p[1]*p[2])*p[3] + p[1])*p[4] + p[0] + p[1]*p[2])*p[5] + p[1])*p[6] + p[0] + p[1]*p[2])*p[7] + p[1]
顺便说一句,像
p0,p1,p2,p3,p4=s.symbols('p0 p1 p2 p3 p4')
这样的事情可以用 syms = s.symbols('p0:5')
甚至 更轻松地完成
n = ...
syms = s.symbols('p0:{}'.format(n))
这会创建单独的符号,而不是索引对象,因此在创建时必须知道数字 n。但仍然比列出 p0 p1 等更容易。