【问题标题】:Recursive piecewise function in SymPy and summing over a list/array of coefficientsSymPy中的递归分段函数并对系数列表/数组求和
【发布时间】:2017-09-11 05:05:19
【问题描述】:

由于缺少 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)

但是,我收到错误消息“列表索引必须是整数或切片,而不是符号”。鉴于数组可以是任意长度,我如何引用传递给函数的系数值?

【问题讨论】:

    标签: python math sympy


    【解决方案1】:

    您不能在 Python 列表上使用符号索引(这里 i 是符号索引,因为您是从 abc 导入它)。如果您提前知道列表,则应使用 Python sum 函数对值求和,而不是使用 Sum

    sum(p[i]*(alpha[i] - alpha[i-1]) for i in range(1, n))
    

    还有一个问题,就是你有alpha[n-1] &lt;= x &lt; alpha[n]。不幸的是,由于 Python 处理链式不等式的方式,这不起作用。你必须把它写成And(alpha[n-1] &lt;= 1, x &lt; alpha[n]) 否则你会得到TypeError: cannot determine truth value of Relational

    【讨论】:

    • 谢谢,这对 SymPy.And() 函数有帮助。但是,在构造参数列表之前,我重新编写了代码以计算 alpha 的累积总和。现在我认为我的累积总和有效,但是当我将参数传递给 sympy.Piecewise() 时出现错误:TypeError: __new__() 需要 3 个位置参数,但给出了 7 个任何想法为什么它不会接受 7 个参数?在文档中,您似乎可以为 Piecewise() 提供任意数量的间隔。
    • 你是如何创建 Piecewise 的?它确实支持任意数量的参数。 TypeError 可能来自其他原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2013-12-13
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多