2010-02-28 4 views
4

나는 파이썬에서 차수 2의 다항식을 사용하여 근사치를 구한 데이터 범위가 있습니다. 이 다항식 밑의 영역을 0에서 1 사이로 계산하고 싶습니다.수학 함수 밑의 면적 계산

사용할 수있는 numpy와 비슷한 패키지가 있습니까? 아니면이 함수를 통합하는 간단한 함수를 작성해야합니까?

저는 수학 함수를 정의하기위한 최선의 접근 방법이 무엇인지 약간은 분명하지 않습니다.

감사합니다.

+2

차수가 2 인 다항식 인 경우 코드를 직접 사용하지 않아도됩니다. 코드를 사용할 필요가 없습니다. –

+0

이것은 40의 일괄 처리로 처리되는 큰 다항식 집합입니다. – djq

+0

차수 2의 다항식 곡선 아래 영역은 차수가 1 인 다항식입니다. 방정식에 값을 연결하기 만하면됩니다. –

답변

8

다항식 만 통합하는 경우 일반 수학 함수를 나타내지 않아도됩니다. integ 통합 방법이있는 numpy.poly1d을 사용하십시오.

>>> import numpy 
>>> p = numpy.poly1d([2, 4, 6]) 
>>> print p 
    2 
2 x + 4 x + 6 
>>> i = p.integ() 
>>> i 
poly1d([ 0.66666667, 2.  , 6.  , 0.  ]) 
>>> integrand = i(1) - i(0) # Use call notation to evaluate a poly1d 
>>> integrand 
8.6666666666666661 

임의의 수치 기능을 통합 들어, 기능에 대한 일반 파이썬 기능 scipy.integrate을 사용합니다. 함수를 분석적으로 통합하려면 sympy을 사용합니다. 이 경우, 특히 후자가 아닌 것처럼 당신이 원하는 것처럼 들리는 것은 아닙니다.

+0

대단히 감사합니다! 그것은 매우 유용합니다. 따라서 0에서 1까지 영역을 계산할 때 다음을 사용할 수 있습니다. Area = i (1) - i (0)? – djq

+1

이것은 0에서 1까지의 정수입니다.이 경우 영역과 동일하지만 일부 상황 (다항식의 일부 또는 전부가 음수 인 경우)에서는 그렇지 않습니다. –

1

'quad'in scipy.integrate는 일정한 간격으로 단일 변수의 기능을 통합하는 일반적인 목적의 방법입니다. 귀하의 질문에 설명 된 것과 같은 간단한 경우에 귀하는 귀하의 기능과 상한 및 하한을 전달합니다. 'quad'는 적분 결과와 오차항의 상한으로 구성된 튜플을 반환합니다.

from scipy import integrate as TG 

fnx = lambda x: 3*x**2 + 9*x # some polynomial of degree two 
aoc, err = TG.quad(fnx, 0, 1) 

[참고 : 나는 내 이전에 게시 된이 내가 대답을 게시하고, NumPy와의 'poly1d'를 사용하여 다항식을 나타냅니다 후.

import numpy as NP 

px = NP.poly1d([2,4,6]) 
aoc, err = TG.quad(px, 0, 1) 
# returns (8.6666666666666661, 9.6219328800846896e-14) 
+0

다항식은 분석적으로 쉽게 통합 될 수 있기 때문에 반복적 인 가우스 직교보다는 더 효율적인 'integ' 방법을 사용하는 것이 가장 좋습니다. –

4
그것은 당신이 대수를 작동하는지 ... 당신의 특별한 경우에 대한 범용 수치 적분 알고리즘에 의존하는 과잉 수 있습니다, 간단한있다

: 바로 위의 내 스크립틀릿은이 형태의 다항식을 받아 들일 수 당신에게 영역을 제공하는 표현.

당신은도 2의 다항식 가지고 F (X) = 도끼 2 + BX + C

참고 범위 X [0에 대한 곡선 아래의 면적을 찾을 , 1].

역도 F (X) = AX 3/3 + BX 2/2 + CX + C

0 내지 1의 곡선 아래의 영역이다 F (1) - F (0) = A/3 + B/2 그래서 + C

만 간격 [0,1]의 영역을 계산하는 경우, 당신은이 간단한 표현을 사용 을 고려보다는 수 범용 메서드를 사용합니다.

5

보세요, 엄마, 수입품 없음!

>>> coeffs = [2., 4., 6.] 
>>> sum(coeff/(i+1) for i, coeff in enumerate(reversed(coeffs))) 
8.6666666666666661 
>>> 

보증 : 모든 양성 등급 또는 환급액의 다항식에서 작동합니다.

우리 연구실의 업데이트 : 보증 확장; S/양극/비 음성/:-)

업데이트 여기 루프에서 함수 호출하지 않고 계수 부유하는 int 얼굴 견고 산업 강도 버전, 그리고 사용도 enumerate() 아니다 설정에서 reversed() :

하나에서 차 또는 차 다항식을 통합하는 경우
>>> icoeffs = [2, 4, 6] 
>>> tot = 0.0 
>>> divisor = float(len(icoeffs)) 
>>> for coeff in icoeffs: 
...  tot += coeff/divisor 
...  divisor -= 1.0 
... 
>>> tot 
8.6666666666666661 
>>> 
+0

+1, 좋은 해결책 (실질적으로 하나의'integ'가 구현 한 것과 동일합니다, 확실합니다). 필자가 'from __future__ import division' 파일을 가지고 있지 않다면 나는'float (i + 1) '을 만들 것입니다. –

1

얻 이동 명시 적 필수적인 표현을 유도하는 대신이 심슨의 규칙을 사용하는 것입니다; 이 방법이 정확히은 차수가 3 이하인 다항식을 적분한다는 것은 깊은 사실입니다.

는 (나는 한 동안 파이썬을 사용하지 않은, 사과 코드가 남았습니다 보이는 경우) 마이크 그레이엄의 예를 빌려 :

>>> import numpy 
>>> p = numpy.poly1d([2, 4, 6]) 
>>> print p 
    2 
2 x + 4 x + 6 
>>> integrand = (1 - 0)(p(0) + 4*p((0 + 1)/2) + p(1))/6 

integrand의 값을 계산 심슨의 규칙을 사용합니다. 이 방법이 광고 된대로 작동 함을 스스로 확인할 수 있습니다.

은 물론, 내가 01 (가) 임의의 값 uv로 대체 될 수 있음을 나타냅니다 integrand의 표현을 단순화하지 않았다, 그리고 코드는 여전히 vu에서 함수의 적분을 찾는 작동합니다.

+0

좋은 답변입니다! 미적분에 대한 심슨의 통치. 파이썬 스킬과 상관없이 매우 우아합니다. –