SymPy中的递归分段函数,并对系数列表/数组求和

时间:2017-09-11 05:05:19

标签: python math sympy

由于缺少Latex编辑器,下面是一张我希望使用Sympy绘制的分段函数的图片。我想传递两个系数数组和一个x值,然后评估它并绘制函数。 (编辑:只有一个p比alpha更多,图像更新)

Piecewise Function 这是我到目前为止的尝试(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;。如果数组可以是任何长度,我怎样才能引用我传递给函数的系数值?

1 个答案:

答案 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