【问题标题】:Evaluate sum of step functions评估阶跃函数的总和
【发布时间】:2016-12-25 05:36:58
【问题描述】:

我有相当多的阶跃函数(大约 1000 个),每个阶跃函数只有两个间隔。我想总结它们,然后找到最大值。做这个的最好方式是什么?我试过sympy,代码如下:

from sympy import Piecewise, piecewise_fold, evalf 
from sympy.abc import x
from sympy.plotting import *
import numpy as np

S = 20

t = np.random.random(20)

sum_piecewise = None

for s in range(S):
    p = Piecewise((np.random.random(), x<t[s]), (np.random.random(), x>=t[s]))
    if not sum_piecewise:
        sum_piecewise = p 
    else:
        sum_piecewise += p

print sum_piecewise.evalf(0.2)

但是,这会输出一个大的符号表达式,而不是我想要的实际值。

【问题讨论】:

  • evalf 的参数是要计算的位数。如果要替换值,请使用 subs(x, 0.2) 或 evalf(subs={x: 0.2})。

标签: python numpy scipy sympy


【解决方案1】:

使用substitution 怎么样?尝试将sum_piecewise.evalf(0.2) 更改为sum_piecewise.subs(x, 0.2)

【讨论】:

    【解决方案2】:

    您似乎在考虑数值函数,因此使用 Numpy 会更好(在性能方面)。这是一种方法:

    import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(10)
    S = 20 # number of piecewise functions
    
    # generate S function parameters. 
    # For example, the k-th function is defined as equal to 
    # p_values[k,0] when t<t_values[k] and equal to
    # p_values[k,1] when t>= t_values[k]
    t_values = np.random.random(S)
    p_values = np.random.random((S,2))
    
    # define a piecewise function given the function's parameters
    def p_func(t, t0, p0):
        return np.piecewise(t, [t < t0, t >= t0], p0)
    
    # define a function that sums a set of piecewise functions corresponding to
    # parameter arrays t_values and p_values
    def p_sum(t, t_values, p_values):
        return np.sum([p_func(t, t0, p0) for t0, p0 in zip(t_values,p_values)])
    

    这是函数总和的图:

    t_range = np.linspace(0,1,1000)
    plt.plot(t_range, [p_sum(tt,t_values,p_values) for tt in t_range])
    

    显然,为了找到最大值,只需考虑包含在t_values 中的S 时间瞬间就足够了。对于这个例子,

    np.max([p_sum(tt,t_values,p_values) for tt in t_values])
    

    11.945901591934897

    【讨论】:

    • 嘿。感谢您的回答。我有一个问题。这样,如果数据太大,那么就会占用太多的内存。相反,我尝试做其他事情。我也发布一个问题。如果您能检查链接,我将不胜感激。非常感谢。stackoverflow.com/questions/67919399/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多