2014-10-29 3 views
1

그냥 파이썬을 배우기 시작했고, 수학 함수를 통합하는 파이썬 함수를 정의하라는 요청을 받았습니다.Python : 수학 모듈 만 사용하여 수학 함수를 통합하는 방법은 무엇입니까?

우리는 파이썬의 기능은 다음과 같은 형태로해야한다는 지시를 받았다 :

integrate(2 * x + 3, 1, 2) 

(예를 들어, x=1x=2 사이 y = 2x + 3의 면적을 계산하는)

(이것은 아래의 영역을 반환해야합니다)

우리는 math 이외/import 어떤 라이브러리를 사용하는 허용되지 않습니다 (및 통합 도구에 내장 된 중 하나를 사용할 수 없습니다).

내가 어떻게해야하는지 생각해보십시오. 내가 프로그램을 썼을 때 나는 항상 x을 얻지 못했다. 그러나 나는 x을 값으로 정의하면 (0이라고 말하면) 매개 변수의 2*x+3 부분은 항상 수학 방정식 대신에 값으로 취해 지므로 내부에서 실제로 사용합니까?

파이썬 함수가 수학 방정식을 매개 변수로 사용하는 방법을 알고 있다면 많은 도움이 될 것입니다. 감사합니다.

def integrate(func, lo_x, hi_x): 
    #... Stuff to perform the integral, which will need to evaluate 
    # the passed function for various values of x, like this 
    y = func(x) 
    #... more stuff 
    return value 

그런 다음 당신은 다음과 같이 호출 할 수 있습니다 :

+1

당신은 방정식 함수해야한다, 당신은 당신이 실제로 수학 함수의 문자열 버전을 전달하거나 다른 함수에 파이썬 함수를 통과해야합니까와 y와 이것 저것 그것 –

+0

X를 전달할 수 있습니다? 큰 차이. – IanAuld

+0

파이썬 함수를 다른 함수로 전달하려고 시도했지만 파이썬이 예를 들어 보겠습니다. def function1 (f (x)) – n88b

답변

4

은의 당신의 통합 기능은 다음과 같습니다 가정 해 봅시다 그러나

value = integrate(lambda x: 2 * x + 3, 1, 2) 

편집

, 경우 통합에 대한 호출 기능은 정확히과 같습니다.

integrate(2 * x + 3, 1, 2)

다음은 다소 까다 롭습니다. 함수가 인 경우 다항식 함수로 호출 될 만 알면 x를 다항식 클래스의 인스턴스로 만들어서 할 수 있습니다. 그의 대답은 M. Arthur Vaïse가 제안했습니다.

또는, integrate(2 * x + 3, 1, 2) 문자열, 예를 들어 명령 행 인수에서 또는 raw_input() 전화에서 오는 경우에, 당신은 추출 할 수있는 2 * x + 3 (또는 무엇이든) 표준 파이썬 문자열 방법을 사용하여 다음에서 lambda 기능을 구축 문자열에서 그건 exec입니다.

+0

초보자 용 'lambda '를 도입하기보다는'def' 함수를 사용하는 것이 더 쉽습니다. – chthonicdaemon

+0

@chthonicdaemon 어떻게 그렇게됩니까? – Marcin

+0

이미 def' 작동 방법 '을 알고 있다면, 그들은 새로운 것을 배울 필요가 없습니다. 'lambda'는 기본적으로 새로운 함수 정의를위한 오버 헤드가 너무 적기 때문에 파이썬에서는 불필요합니다. – chthonicdaemon

0

내가 생각하는 필요를 채워주는 구현이 왔습니다. 이는 [여기 http://en.wikipedia.org/wiki/Darboux_integral]

import math 

class PolynomialEquation(): 
    """ Allow to create function that are polynomial """ 
    def __init__(self,coef): 
     """ 
     coef : coeficients of the polynome. 

     An equation initialized with [1,2,3] as parameters is equivalent to: 
      y = 1 + 2X + 3X² 

     """ 
     self.coef = coef 

    def __call__(self, x): 
     """ 
     Make the object callable like a function. 
     Return the value of the equation for x 
     """ 
     return sum([self.coef[i]*(x**i) for i in range(len(self.coef)) ]) 

def step_integration(function, start, end, steps=100): 
    """ 
    Proceed to a step integration of the function. 
    The more steps there are, the more the approximation is good. 
    """ 
    step_size = (end-start)/steps 
    values = [start + i*step_size for i in range(1,steps+1)] 
    return sum([math.fabs(function(value)*step_size) for value in values]) 


if __name__ == "__main__": 
    #check that PolynomialEquation.value works properly. Assert make the program crash if the test is False. 

    #y = 2x+3 -> y = 3+2x -> PolynomialEquation([3,2]) 
    eq = PolynomialEquation([3,2]) 
    assert eq(0) == 3 
    assert eq(1) == 5 
    assert eq(2) == 7 

    #y = 1 + 2X + 3X² -> PolynomialEquation([1,2,3]) 
    eq2 = PolynomialEquation([1,2,3]) 
    assert eq2(0) == 1 
    assert eq2(1) == 6 
    assert eq2(2) == 17 

    print(step_integration(eq, 0, 10)) 
    print(step_integration(math.sin, 0, 10)) 

EDIT 바와 같이 단계로 적분 연산의 구현 예 배 + 3과 같이 수학적 함수를 정의하고 제시 할 수 : 진실의 구현은 단지 상부 Darboux 일체. 진정한 Darboux 적분은 더 낮은 Darboux 적분을 계산하여 실제로 필요하면 계산할 수 있습니다 (을 range(steps)로 대체하십시오). step_integration 함수는 더 낮은 Darboux 함수를 제공합니다.두 Darboux 함수의 차이가 정밀도 요구에 따라 작은 값보다 클 때, 그리고, (예를 들면, 0.001가 될 수있는) 상기 매개 변수를 증가시킨다. 따라서 100 단계 적분은 적분 값의 적절한 근사값을 제공한다고 가정합니다.

관련 문제