2016-03-03 21 views
1

我正在尋找一個計算函數的左+右riemann和的程序。我唯一的問題是,我想要函數將np.sin(x^2)或np.cos(3 * x +2)或者ax^2 + 3 * x + 2(多項式函數)作爲y參數,並且np.linspace()作爲x參數,'left'或'right'作爲字符串。到目前爲止,我的代碼確實需要sin(x)/ cos(x)來計算這兩個函數的左/右riemann和。但我正在努力讓我們說通過一個像sin(x^2)+3這樣的函數並採取它的近似。我有等式的邏輯,但也許,我並沒有很好地理解numpy/python的數據結構。這裏是我的代碼:將數學公式作爲參數傳遞(numpy)

import numpy as np 
def r_sums(y,x,method='left'): 
    #f = y(x) 
    l = [] 
    delta_x = abs(x[0]-x[-1])/len(x) 
    while method != 'right': 
     #Calculating Left Riemann Sum (below the list comprehension is a normal for loop of the list comprehension func) 
     return sum([ y(x[0]+ i*delta_x) for i in range(0,len(x))])*delta_x 
     #for i in range(0,len(x)): 
      #f_a = x[0] + i*(delta_x) #Calculating left endpoint 
      #l.append(y(f_a))   #Appends all the left endpoint into a list l 
     #return sum(l)*delta_x 

    #Calculating Right Riemann Sum (below the list comprehension is a normal for loop of the list comprehension func) 
    return sum([y(x[0]+ i*delta_x) for i in range(1,len(x)+1)])*delta_x 
    #for i in range(1,len(x)+1): 
     #f_a = x[0] + i*(delta_x) 
     #l.append(y(f_a)) 
    #return sum(l)*delta_x 

r_sums(np.sin,np.linspace(1,4,200), '左')應該工作,但我期待有參數y採取類似

r_sums(np.sin(x ** 2 + 3),np.linspace(1,4,200),'left')< - 不工作

真的很感謝您的幫助和反饋!謝謝。

回答

1

你可能想要傳遞一個「真正的」函數(而不是一個值!)。請注意,您必須在此定義一個函數或使用lambda表達式。

r_sums(lambda x: np.sin(x**2+3),np.linspace(1,4,200),'left') 

將工作。

Lambda表達式僅僅是一個函數帶一個參數x並返回np.sin(x**2+3)

這將是一樣的:

def function_sin_xsqaured_plus_3(x): 
    return np.sin(x**2+3) 

r_sums(function_sin_xsqaured_plus_3,np.linspace(1,4,200),'left') 

(其也適用)