2016-08-18 72 views
2

我有一个相当大的数量(大约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) 

然而,这种输出了大量象征性的表达,而不是实际的价值,这就是我想要的。

+0

的参数'evalf'是数字计算的数量。如果你想使用'subs(x,0.2)'或'evalf(subs = {x:0.2})'替换一个值。 – asmeurer

回答

0

怎么样使用substitution?尝试通过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]) 

enter image description here

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

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

11.945901591934897