2010-05-31 4 views
1
)

저는 상당한 양의 성공으로 전산 물리 프로젝트 (진동 반응을 나타 내기 위해 서로 관련있는 화학 반응물의 비율을 계획)에서 작업 해 왔습니다. 그러나, 내 시뮬레이션 중 하나는 두 개 이상의 활성 진동 에이전트 (사실, 5) 어떤 단일 시각적 인 음모에 분명히 부적 절한 것입니다 ...Python에서 사용자 입력으로 변수를 호출/선택 (

내 계획은 따라서 사용자가 원하는 두 반응물을 선택하게했습니다 x 축과 y 축에 각각 플롯됩니다. 문자열 입력 값을 각각의 변수 이름으로 변환하려고 시도했지만 (어리석게도), 존재한다면 근본적으로 다른 접근법이 필요하겠습니까?

는 어떤을 명확히 도움이된다면, 여기 내 코드의 일부입니다

def coupledBrusselator(A, B, t_trial,display_x,display_y): 
    t = 0 
    t_step = .01 
    X = 0  
    Y = 0 
    E = 0 
    U = 0 
    V = 0 
    dX = (A) - (B+1)*(X) + (X**2)*(Y) 
    dY = (B)*(X) - (X**2)*(Y) 
    dE = -(E)*(U) - (X) 
    dU = (U**2)*(V) -(E+1)*(U) - (B)*(X) 
    dV = (E)*(U) - (U**2)*(V) 
    array_t = [0] 
    array_X = [0] 
    array_Y = [0] 
    array_U = [0] 
    array_V = [0]  

    while t <= t_trial:    
     X_1 = X + (dX)*(t_step/2) 
     Y_1 = Y + (dY)*(t_step/2) 
     E_1 = E + (dE)*(t_step/2) 
     U_1 = U + (dU)*(t_step/2) 
     V_1 = V + (dV)*(t_step/2) 
     dX_1 = (A) - (B+1)*(X_1) + (X_1**2)*(Y_1) 
     dY_1 = (B)*(X_1) - (X_1**2)*(Y_1) 
     dE_1 = -(E_1)*(U_1) - (X_1) 
     dU_1 = (U_1**2)*(V_1) -(E_1+1)*(U_1) - (B)*(X_1) 
     dV_1 = (E_1)*(U_1) - (U_1**2)*(V_1) 
     X_2 = X + (dX_1)*(t_step/2) 
     Y_2 = Y + (dY_1)*(t_step/2) 
     E_2 = E + (dE_1)*(t_step/2) 
     U_2 = U + (dU_1)*(t_step/2) 
     V_2 = V + (dV_1)*(t_step/2) 
     dX_2 = (A) - (B+1)*(X_2) + (X_2**2)*(Y_2) 
     dY_2 = (B)*(X_2) - (X_2**2)*(Y_2) 
     dE_2 = -(E_2)*(U_2) - (X_2) 
     dU_2 = (U_2**2)*(V_2) -(E_2+1)*(U_2) - (B)*(X_2) 
     dV_2 = (E_2)*(U_2) - (U_2**2)*(V_2) 
     X_3 = X + (dX_2)*(t_step) 
     Y_3 = Y + (dY_2)*(t_step) 
     E_3 = E + (dE_2)*(t_step) 
     U_3 = U + (dU_2)*(t_step) 
     V_3 = V + (dV_2)*(t_step) 
     dX_3 = (A) - (B+1)*(X_3) + (X_3**2)*(Y_3) 
     dY_3 = (B)*(X_3) - (X_3**2)*(Y_3) 
     dE_3 = -(E_3)*(U_3) - (X_3) 
     dU_3 = (U_3**2)*(V_3) -(E_3+1)*(U_3) - (B)*(X_3) 
     dV_3 = (E_3)*(U_3) - (U_3**2)*(V_3) 
     X = X + ((dX + 2*dX_1 + 2*dX_2 + dX_3)/6) * t_step 
     Y = Y + ((dX + 2*dY_1 + 2*dY_2 + dY_3)/6) * t_step 
     E = E + ((dE + 2*dE_1 + 2*dE_2 + dE_3)/6) * t_step   
     U = U + ((dU + 2*dU_1 + 2*dY_2 + dE_3)/6) * t_step 
     V = V + ((dV + 2*dV_1 + 2*dV_2 + dE_3)/6) * t_step 
     dX = (A) - (B+1)*(X) + (X**2)*(Y) 
     dY = (B)*(X) - (X**2)*(Y) 
     t_step = .01/(1 + dX**2 + dY**2) ** .5 
     t = t + t_step 
     array_X.append(X) 
     array_Y.append(Y) 
     array_E.append(E) 
     array_U.append(U) 
     array_V.append(V) 
     array_t.append(t) 

어디 이전

display_x = raw_input("Choose catalyst you wish to analyze in the phase/field diagrams (X, Y, E, U, or V) ") 
display_y = raw_input("Choose one other catalyst from list you wish to include in phase/field diagrams ") 

coupledBrusselator(A, B, t_trial, display_x, display_y) 

감사합니다!

답변

1

다른 배열을 계산하면 이름을 배열에 매핑하는 dict에 추가 할 수 있습니다. 이것은 다음 display_xdisplay_y에 대한 올바른 배열을 조회 할 수 있습니다 :

named_arrays = { 
    "X": array_X, 
    "Y": array_Y, 
    "E": array_E, 
    ... 
} 

return (named_arrays[display_x], named_arrays[display_y]) 
+0

덕분에, 그 자리를 맞았다! :) –

+0

@Jonathan,이 경우에는 @ sth의 대답을 받아 들여야합니다 (답안의 왼쪽에있는 확인란 모양의 윤곽선 아이콘을 클릭하십시오) - 이것은 당신에게 upvote를 가능하게하는 추가 담당자를 줄 것입니다. - 대답의 맨 왼쪽에있는). SO의 에티켓으로 감사합니다,하지만 upvotes 및 받아들이 _matter _! -) –