2016-03-03 3 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) для вычисления левой/правой суммы риманова этих двух функций. Но я изо всех сил пытаюсь передать функцию типа 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), 'влево') должен работать, но я ищу, чтобы иметь параметр у взять что-то вроде

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') 

будет работать.

Выражение лямбда просто функция принимает один аргумент 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') 

(который также работает)