2014-09-17 5 views
2

*이 질문은 매우 간단하다는 것을 알고 있지만 파이썬에서 이러한 for 루프를 설정하는 가장 좋은 방법을 알고 싶습니다.매개 변수 배열에 대한 ODE 해결 (파이썬)

2 차 미분 방정식 (이 코드는 아래에 나와 있음)에 대한 해를 계산하고 플롯하기 위해 이미 프로그램을 작성했습니다.

f 매개 변수 배열 (따라서 f_array)에 대해이 계산을 반복하는 가장 좋은 방법을 알고 싶습니다. 나는. 그 결과 플롯은 각각 의 다른 값을 갖는 t의 함수로서 해를 나타내는 데이터 집합을 20으로 나타냅니다.

아이디어에 대한 환호.

from pylab import * 
from scipy.integrate import odeint 

#Arrays. 
tmax = 100 
t = linspace(0, tmax, 4000) 
fmax = 100 
f_array = linspace(0.0, fmax, 20) 

#Parameters 
l = 2.5 
w0 = 0.75 
f = 5.0 
gamma = w0 + 0.05 
m = 1.0 
alpha = 0.15 
beta = 2.5 

def rhs(c,t): 
    c0dot = c[1] 
    c1dot = -2*l*c[1] - w0*w0*c[0] + (f/m)*cos((gamma)*t)-alpha*c[0] - beta*c[0]*c[0]*c[0] 
    return [c0dot, c1dot] 

init_x = 15.0 
init_v = 0.0 
init_cond = [init_x,init_v] 
ces = odeint(rhs, init_cond, t) 

s_no = 1 
subplot(s_no,1,1) 
xlabel("Time, t") 
ylabel("Position, x") 
grid('on') 
plot(t,ces[:,0],'-b') 
title("Position x vs. time t for a Duffing oscillator.") 
show() 

여기 t 값의 배열 f 단일 값과 관련이 방정식의 해결책을 도시하는 도면이다. f 값의 배열에 대해이 플롯을 신속하게 반복하고 싶습니다.

수정 rhs 제 3 인수, 매개 변수 f을 받아들이 :

http://i61.tinypic.com/28bgyzs.png

답변

3

여기에 한 가지 방법입니다. rhs의 정의는 for 루프로 f_array 이상

def rhs(c, t, f): 
    ... 

으로 반복을 시작해야한다. 이 루프에서는 odeintargs 인수로 호출하여 odeintf의 값을 rhs의 세 번째 인수로 제공합니다. 각 통화의 결과를 odeint에 목록에 저장하십시오. 기본적으로, 당신은 지금 solutions 목록에서 해결책을 가지고, f_arrayf의 각 값에 대해

solutions = [] 
for f in f_array: 
    ces = odeint(rhs, init_cond, t, args=(f,)) 
    solutions.append(ces) 

ces = odeint(rhs, init_cond, t)  

를 교체합니다.

이러한 플롯하려면 다른 for 루프에 plot 통화를 보류 수 :

for ces in solutions: 
    plot(t, ces[:, 0], 'b-') 
+0

좋은 제안, 감사합니다. 필자는 어떻게 관리 했는가 플로팅을위한 배열 목록에서 각 솔루션을 분리하려면 어떻게해야합니까? – user2992169

+1

당신은'solutions'에 대한 루프에서'plot'에 대한 호출을 넣을 수 있습니다. 업데이트 된 답변을 참조하십시오. –