2016-08-18 6 views
2

私はかなり大きな数(約1000)のステップ関数を持ち、それぞれに2つの間隔しかありません。私はそれらを合計し、最大値を見つけることを望みます。これを行う最善の方法は何ですか?次のように私はコードで、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.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]) 

enter image description here

明らかに、最大値を見つけるために、それだけでS時間を考慮すれば十分ではここで一つのアプローチですインスタントはt_valuesに含まれています。この例では、

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

11.945901591934897