2015-05-26 34 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

沒問題,如果這是你要找的人,接受這樣的答案其他有類似問題的人可以更容易找到 –