2012-02-25 4 views
3

복잡한 값을 가진 1 차 ODE 시스템 인 광학 피치 방정식을 소홀히하는 데 문제가 있습니다. 나는 scipy가 그런 시스템을 해결할지도 모른다는 것을 알았지 만, 그들의 웹 페이지는 정보가 너무 적어서 거의 이해할 수 없다.scipy의 복잡한 ODE 시스템

나는 8 일차 미분 방정식을 결합, 그리고 내가 좋아하는 함수를 생성해야합니다

  1. 내 y는 목록되지 않습니다 :

    def derv(y): 
        compute the time dervative of elements in y 
        return answers as an array 
    

    다음 complex_ode(derv)

    내 질문은 할 하지만 매트릭스, 어떻게 내가 corrent 출력을 줄 수 complex_ode()에 맞는가요?

  2. complex_ode()은 야 코비 행렬이 필요합니다. 어떤 유형을 사용해야하나요? 을 구성하는 방법을 알지 못합니까?
  3. 어디서 정상적인 ode와 시간 linspace와 같은 초기 조건을 넣어야합니까? 나는 좀 더 배울 수 있도록 http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.complex_ode.html

    누구보다 정보] 나에게 제공 할 수있다 :

이 scipy의 complex_ode 링크입니다.

답변

5

적어도 올바른 방향으로 안내 할 수 있다고 생각합니다. 광학 블로흐 방정식은 과학적으로는 커뮤니티에서 잘 이해되는 문제입니다. :-) 나름의 문제는 아니지만, 이미이 문제에 대한 인터넷 의 해결책이 있습니다.

http://massey.dur.ac.uk/jdp/code.html

그러나, 귀하의 요구를 해결하기 위해, 당신은 내가 괜찮 가정 complex_ode을 사용하는 말,하지만 난 그냥 평범한 scipy.integrate.ode 자신의 문서에 따라 뿐만 아니라 잘 작동합니다 생각 :

from scipy import eye 
from scipy.integrate import ode 

y0, t0 = [1.0j, 2.0], 0 

def f(t, y, arg1): 
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2] 
def jac(t, y, arg1): 
    return [[1j*arg1, 1], [0, -arg1*2*y[1]]] 
r = ode(f, jac).set_integrator('zvode', method='bdf', with_jacobian=True) 
r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0) 
t1 = 10 
dt = 1 
while r.successful() and r.t < t1: 
    r.integrate(r.t+dt) 
    print r.t, r.y 

당신은 또한 더 설립 나이가 더 나은 문서화 기능의 추가 혜택이있다. 나는 당신이 ODE를 8 개가 아닌 9 개를 가지고 놀랐지 만 나는 을 잘 이해하고 있습니다. 예, 정확합니다. 은 형태 여야하는데 def derv()이라고 부르지 만, 당신은 입니다. 함수가 적어도 두 개의 매개 변수 (derv(t,y))을 필요로하는지 확인해야합니다. y이 매트릭스에있는 경우 문제가 없습니다! 만큼

Y = numpy.reshape(y,(num_rows,num_cols)); 

num_rows*num_cols = 8로, ODE의의 전화 번호 당신은 괜찮을 것 : 그냥과 같이 에 derv(t,y) 기능을 "바꿀". 그런 다음 행렬을 계산에 사용하십시오. 모두 마쳤 으면 바로 에게 같은 벡터가 아닌 매트릭스 반환해야합니다 : 코비안가 필요하지

out = numpy.reshape(Y,(8,1)); 

을하지만, 계산이 훨씬 빨리 을 진행할 수 전망이다.이것을 계산하는 방법을 모른다면 위키 백과 또는 미적분 텍스트 북을 참조하십시오. 꽤 간단하지만 시간이 많이 걸릴 수 있습니다.

초기 상태에서 복잡성 여부와 상관없이 의 대상이 무엇인지 이미 알고 있어야합니다. 이유 안에서 인 값을 선택하는 한 큰 문제가 아니어야합니다.

+0

위대한 답변을 주셔서 대단히 감사합니다. 상당히 많은 시간을 들여야합니다. 링크는 내가 원하는 것을 절대적으로 완벽하게 제공합니다. 예, 당신은 어딘가에 문제가 있다면, 그래, 맞아, 9 시야 :) 그래, 오늘은 시간있어, 내가 다시 올 수도 있습니다? 다시 한번 감사드립니다. – user1233157

관련 문제