2015-05-26 28 views
2

我有一个名为calculate_cost的函数,它可以计算不同S_range(库存水平)的供应商的性能。该函数可以工作,但情节并不平坦,有没有办法在Python中平滑它?如何使我的绘图在Python中更流畅?

import numpy 
import scipy.stats 
import scipy.integrate 
import scipy.misc 
import matplotlib 
import math 
import pylab 
from scipy.stats import poisson 

def calculate_cost(s, h, d, r, k, alphaR): 
    cost = 0.0 
    for i in range(0, alphaR + 1): 
     #i = i-1 
     binom = math.factorial(r)/((math.factorial(i)) * (math.factorial(r - i))) 
     func = scipy.stats.poisson.cdf(s, d) 
     cost += ((k/r) * binom * (func ** i) * ((1.0-func) ** (r-i))) 

    for p in range (s): 
     cost += h*(s-p)*scipy.stats.poisson.pmf(p, d) #This a formula 

    return cost 

graphs = [] 

class Graph: 
    def __init__(self): 
     self.label = "" 
     self.h = 0 
     self.d = 0 
     self.r = 0 
     self.k = 0 
     self.alphaR = 0 

graph = Graph() 
graph.label = "A" 
graph.h = 1.0 
graph.d = 10 
graph.r = 30 
graph.k = 283.0 
graph.alphaR = 23 

graphs.append(graph) 

graph = Graph() 
graph.label = "B" 
graph.h = 1.0 
graph.d = 10 
graph.r = 30 
graph.k = 146.0 
graph.alphaR = 24 
#graph.LineStyle = '*-' 


graphs.append(graph) 

graph = Graph() 
graph.label = "C" 
graph.h = 1.0 
graph.d = 10 
graph.r = 30 
graph.k = 92.0 
graph.alphaR = 25 
#graph.LineStyle = '*-' 


graphs.append(graph) 

graph = Graph() 
graph.label = "D" 
graph.h = 1.0 
graph.d = 10 
graph.r = 30 
graph.k = 80.0 
graph.alphaR = 26 
#graph.LineStyle = '*-' 


graphs.append(graph) 

graph = Graph() 
graph.label = "E" 
graph.h = 1.0 
graph.d = 10 
graph.r = 30 
graph.k = 77.0 
graph.alphaR = 27 
#graph.LineStyle = '*-' 


graphs.append(graph) 


s_range = numpy.arange(0,21,1) 

for graph in graphs: 
    cost = [] 

    for s in s_range: 
     cost.append(calculate_cost(s, graph.h, graph.d, graph.r, graph.k, graph.alphaR)) 

    matplotlib.pyplot.plot(s_range, cost, label = graph.label) 

    pylab.legend() 
    matplotlib.pyplot.xlabel(' S_range') 
    matplotlib.pyplot.ylabel('Cost') 


pylab.show() 

回答

2

一个解决方案是使用scipy.iterp1D功能与 '立方' 类型:

from scipy import interpolate 
.... 
s_range = numpy.arange(0,21,1) 

for graph in graphs: 
    cost = [] 

    for s in s_range: 
     cost.append(calculate_cost(s, graph.h, graph.d, graph.r, graph.k, graph.alphaR)) 

    f = interpolate.interp1d(s_range, cost, kind='cubic') 

    s_range_new = np.arange(0,20, 0.1) 
    cost_new = f(s_range_new) 

    matplotlib.pyplot.plot(s_range_new, cost_new, label = graph.label) 

    pylab.legend() 
    matplotlib.pyplot.xlabel(' S_range') 
    matplotlib.pyplot.ylabel('Cost') 


pylab.show() 

这给了你:

Smoothed plot

是你如何小心因为这只是插值点而不是实数据点。

希望这有助于

+0

谢谢你这么多,是的,这就是我想要的,:),我不知道怎么感谢你 – user3462393

+0

没问题,如果这是你要找的人,接受这样的答案其他有类似问题的人可以更容易找到 –