통합

2017-05-01 6 views
2

I 파이썬 함수가 한계로서 NumPy와 배열의 각 요소와 기능을 통합 I 각 요소를 0으로 통합하고자통합

import numpy as np 
from scipy import integrate 
LCDMf = lambda x: 1.0/np.sqrt(0.3*(1+x)**3+0.7) 

정의 (scipy 또한 NumPy와 사용) NumPy와 배열은 빠르고, efficien가있는 경우, 궁금 해서요 내가

an=integrate.quad(LCDMf,0,z[i]) 

그러나 등을 통해 반복 각 요소에 대해 루프를 쓸 수 있습니다 알고 z = np.arange(0,100)

말 각 numpy 요소로 이것을 수행하는 t (그리고 더 간단한) 방법.

+0

오래 전에 np.vectorize 메소드를 사용하여이 문제를 해결했습니다. 나는 그것을 어떻게했는지를 회상 할 수는 없다 ... 그러나 그것은 당시 보편적 인 해결책처럼 보였고 나를 위해 일했다. 누구든지 비슷한 방향으로 해결하는 빛을 던질 수 있습니까? –

+0

'np.vectorize'는 함수 호출에서 단지 반복을 래핑합니다. 그것은 당신의 코드를 빠르게하지 않습니다. – hpaulj

+0

어쨌든 numpy 배열에서 작동하는 데 사용되었습니다 ... 속도를 높이기위한 것이 아닙니다 –

답변

1

np.vectorize으로 해결 한 후 다음 해결책을 찾았습니다. 단순 - 우아하고 작동합니다!

import numpy as np 
from scipy import integrate 
LCDMf = lambda x: 1.0/math.sqrt(0.3*(1+x)**3+0.7) 
np.vectorize(LCDMf) 

def LCDMfint(z): 
    return integrate.quad(LCDMf, 0, z) 

LCDMfint=np.vectorize(LCDMfint) 
z=np.arange(0,100) 

an=LCDMfint(z) 
print an[0] 

이 방법은 정렬되지 않은 플로트 배열이나 우리가 던지는 것으로 작동하며 odeint 메서드와 같은 초기 조건은 없습니다.

나는 누군가가 어딘가에 도움이되기를 바랍니다. 귀하의 의견을 보내 주셔서 감사합니다.

0

확실히 더 효율적으로 수행 할 수 있습니다.

  1. 3.
0에서 LCDMf 통합 2.
  • 0에서 LCDMf 통합 1.
  • 0에서 LCDMf 통합 : 결국 당신이있어하는 일련의 계산이다

    그래서 당신이 할 수있는 첫 번째 것은 (결국, 다른 통합 것입니다!)을 합산 한 후 별개의 서브 인터벌을 통합 변경하고 있습니다 :

    1. 지능 egrate LCDMf 0
    2. 1.하려면 1에서 2로 LCDMf 통합에서, 만약에 뛰어 수 2 단계

    다음의 결과를 추가 2 내지 3 LCDMf 통합 단계 1.

  • 인한 추가

    dx = 0.0001 
    x = np.arange(0, 100, dx) 
    y = LCDMf(x) 
    
    : 당신은 즉시 많은 점에서이 기능을 평가하기 위해 NumPy와 방송을 사용할 수 있습니다

    1.0/np.sqrt(0.3*(1+x)**3+0.7) 
    

    : 이런 식으로 정의된다 LCDMf,

    꽤 빠르며 커브에서 100 만 포인트를줍니다. 이제 scipy.integrate.trapz() 또는 관련 기능 중 하나를 사용하여 통합 할 수 있습니다. 이미 계산 된 y와 dx로 이것을 호출합니다. 위의 워크 플로를 사용하여 각 간격을 통합 한 다음 cumsum()을 사용하여 최종 결과를 얻습니다. 루프에서 호출해야하는 유일한 기능은 통합 자입니다.

  • +0

    나는 당신의 솔루션을 따르지 않을 수도 있습니다. 0에서 1, 0에서 2 등이 예입니다. 등 간격 또는 정수 일 필요는 없습니다. z = [0.1, 0.15, 0.367, 0.265 ...] 그러면 어떻게됩니까? –

    +0

    글쎄,'z = np.arange (0,100)'라고했는데, 다른 'z'가 있으면 먼저 정렬하고 내 솔루션은 여전히 ​​작동해야합니다 - 간단히 0에서 가장 작은'z '값까지 통합 한 다음 그 다음에 가장 작은'z' 등으로'z'가됩니다. –

    4

    ODE로 문제를 다시 표현할 수 있습니다.

    enter image description here

    odeint 함수

    이어서 z의 일련 F(z)을 계산하는데 사용될 수있다.

    >>> scipy.integrate.odeint(lambda y, t: LCDMf(t), 0, [0, 1, 2, 5, 8]) 
    array([[ 0.  ], # integrate until z = 0 (must exist, to provide initial value) 
         [ 0.77142712], # integrate until z = 1 
         [ 1.20947123], # integrate until z = 2 
         [ 1.81550912], # integrate until z = 5 
         [ 2.0881925 ]]) # integrate until z = 8 
    
    +0

    흥미로운 해결 방법. 그러나 초기 상태에 대해 '0'값을 갖는 것은 제한적이며 일견 보편적이지 않습니다. 예를 들어, 예를 들어 0.1에서 0.5까지 다양하게 z와 통합하려는 경우 말하십시오. –

    +0

    @RohinKumar 당신은 항상 [prepend] (http://stackoverflow.com/questions/36998260/prepend-element-to-numpy-array) a 0 일 수 있습니다. – kennytm