由于缺少Latex编辑器,下面是一张我希望使用Sympy绘制的分段函数的图片。我想传递两个系数数组和一个x值,然后评估它并绘制函数。 (编辑:只有一个p比alpha更多,图像更新)
这是我到目前为止的尝试(alpha和p是列表/数组,t是数字):
def getf(alpha,p,t):
#Create the argument list of tuples for the SymPy.Piecewise function
argtuples = []
for n,number in enumerate(alpha):
if n == 0:
argtuples.append((p[0]*x, x<alpha[0]))
elif 0<n and n<list(enumerate(alpha))[-1][0]:
argtuples.append((p[0]*alpha[0] + Sum(p[i]*(alpha[i] - alpha[i-1]),(i,1,n)) + p[n+1]*(x-alpha[n]), alpha[n-1] <= x < alpha[n]))
else:
argtuples.append((p[0]*alpha[0] + Sum(p[i]*(alpha[i] - alpha[i-1]),(i,1,n)) + p[n+1]*(x-alpha[n]), x>=alpha[n]))
f = Piecewise(argtuples)
return f(t)
from sympy import Piecewise, Sum
from sympy.abc import x, i
getf([10000,50000,100000,1000000],[0.05,0.08,0.15,0.30,0.40],1000001)
但是,我得到的错误&#34;列表索引必须是整数或切片,而不是符号&#34;。如果数组可以是任何长度,我怎样才能引用我传递给函数的系数值?
答案 0 :(得分:0)
您不能在Python列表上使用符号索引(此处i
是符号,因为您从abc
导入它)。如果您提前知道列表,则应使用Python sum
函数对值进行求和,而不是Sum
。
sum(p[i]*(alpha[i] - alpha[i-1]) for i in range(1, n))
还有另一个问题,就是你有alpha[n-1] <= x < alpha[n]
。遗憾的是,由于Python处理链式不等式的方式,这将无法工作。您必须将其写为And(alpha[n-1] <= 1, x < alpha[n])
否则您将获得TypeError: cannot determine truth value of Relational
。