Found an issue with the book? Report it on Github.

화학 시스템(Chemical System)

화학 시스템(Chemical System)

이 섹션에서는 화학 시스템의 동작을 설명하는 몇 가지 다른 방법을 다루어 보겠습니다. 배열 기능을 사용하지 않고 모델을 만들고, 벡터를 사용하여 동일한 동작을 구현하겠습니다.그리고, 마지막으로 열거형을 사용하여 동일한 모델을 다시 구현하겠습니다.

모든 예제에서 `다음과 같은 반응 시스템 <http://library.wolfram.com/infocenter/TechNotes/390/>`_에 대한 모델을 구축할 것입니다.

\begin{split}A + B &\underset{1}{\rightarrow} X \\ A + B &\underset{2}{\leftarrow} X \\ X + B &\underset{3}{\rightarrow} T + S\end{split}

여기에서 X 는 단순히 이 반응의 중간 결과이며, 전체적인 반응은 다음과 같이 표현 할 수 있습니다.

A + 2B \rightarrow T + S

질량 작용의 법칙을 사용하여 이러한 화학 방정식을 다음 수학 방정식으로 변환할 수 있습니다.

\begin{split}\frac{\mathrm{d}[A]}{\mathrm{d}t} &= -k_1 [A] [B] + k_2 [X] \\ \frac{\mathrm{d}[B]}{\mathrm{d}t} &= -k_1 [A] [B] + k_2 [X] -k_3 [B] [X] \\ \frac{\mathrm{d}[X]}{\mathrm{d}t} &= k_1 [A] [B] - k_2 [X] -k_3 [B] [X]\end{split}

여기서 k_1 , k_2 k_3 은 각각 첫 번째, 두 번째 및 세 번째 반응에 대한 반응 계수입니다. 이 것은 종류별 물질의 반응으로 인한 각각의 물질의 변화를 고려해서 도출된 방정식 입니다.예를 들어, 첫 번째 반응 A + B ightarrow X A B 분자를 X 분자로 변환하므로, A 에 대한 균형 방정식 -k_1 [A] [B] 에서 해당 반응의 결과로 A 양의 감소를 나타냅니다.이러한 균형 방정식의 각 항은 유사한 방식으로 파생합니다.

배열 없는 경우(Without Arrays)

배열을 전혀 사용하지 않는 접근 방식부터 시작하겠습니다. 이 경우, 단순히 변수 cA, cB 및 다음과 같이 cX 로 표현할 수 있습니다.

model Reactions_NoArrays "Modeling a chemical reaction without arrays"
  Real cA;
  Real cB;
  Real cX;
  parameter Real k1=0.1;
  parameter Real k2=0.1;
  parameter Real k3=10;
initial equation
  cA = 1;
  cB = 1;
  cX = 0;
equation
  der(cA) = -k1*cA*cB + k2*cX;
  der(cB) = -k1*cA*cB + k2*cX - k3*cB*cX;
  der(cX) = k1*cA*cB - k2*cX - k3*cB*cX;
end Reactions_NoArrays;

이 접근 방식으로 각 종류의 균형에 대한 방정식을 만듭니다. 이 모델을 시뮬레이션하면 다음과 같은 결과를 얻습니다.

/static/_images/RNA.svg

배열을 사용하는 경우(Using Arrays)

화학 시스템의 모델링에 접근하는 또 다른 방법은 벡터를 사용하는 것입니다.이 접근법을 사용하여 A , B X 종류를 인덱스 1 , 2 3 과 연관시켰으며, 각각의 농도는 벡터 변수 C 에 매핑됩니다. 또한 반응 계수를 벡터인 k 로 변환할 수 있습니다.

이 변환을 사용하면 모든 방정식이 벡터 방정식으로 변환합니다.

model Reactions_Array "Modeling a chemical reaction with arrays"
  Real C[3];
  parameter Real k[3] = {0.1, 0.1, 10};
initial equation
  C = {1, 1, 0};
equation
  der(C) = {-k[1]*C[1]*C[2] + k[2]*C[3],
            -k[1]*C[1]*C[2] + k[2]*C[3] - k[3]*C[2]*C[3],
            k[1]*C[1]*C[2] - k[2]*C[3] - k[3]*C[2]*C[3]};
end Reactions_Array;

반응 방정식은 비선형이므로 완전한 선형 형태로 변환할 수 없지만, 행렬-벡터 곱을 사용하여 더 단순화할 수 있습니다. 즉, 방정식은 다음과 같습니다.

\begin{split}\frac{\mathrm{d}[A]}{\mathrm{d}t} &= -k_1 [A] [B] + k_2 [X] \\ \frac{\mathrm{d}[B]}{\mathrm{d}t} &= -k_1 [A] [B] + k_2 [X] -k_3 [B] [X] \\ \frac{\mathrm{d}[X]}{\mathrm{d}t} &= k_1 [A] [B] - k_2 [X] -k_3 [B] [X]\end{split}

이는 다음 형식으로 변환할 수 있습니다.

\begin{split}\frac{\mathrm{d}}{\mathrm{d}t} \left\{ \begin{array}{c} [A] \\[0pt] [B] \\[0pt] [X] \end{array} \right\} = \left[ \begin{array}{rrr} -k_1 [B] & 0 & k_2 \\ -k_1 [B] & -k_3 [X] & k_2 \\ k_1 [B] & -k_3 [X] & -k_2 \end{array} \right] \left\{ \begin{array}{c} [A] \\[0pt] [B] \\[0pt] [X] \end{array} \right\}\end{split}

그러면 모델리카에서 다음과 같이 나타낼 수 있습니다.

der(C) = [-k[1]*C[2], 0,          k[2];
          -k[1]*C[2], -k[3]*C[3], k[2];
          k[1]*C[2],  -k[3]*C[3], -k[2]]*C;

이 접근 방식의 단점은 어떤 인덱스(예: 1, 2 또는 3 )가 어떤 종( 예: A , B 또는 X ) 에 연결되었는지 알기 어렵다는 것입니다.

열거형 사용(Using Enumerations)

숫자에서 이름으로 앞뒤로 매핑해야 하는 이 문제를 해결하기 위해 세 번째 접근 방식은모델리카의 enumeration 자료형을 활용 하는 것입니다.열거형을 사용하면 배열과 관련된 첨자를 정의하는 데 사용할 수 있는 일련의 이름을 정의할 수 있습니다.열거형을 다음과 같이 정의합니다.

type Species = enumeration(A, B, X);

이것은 A, BX 의 세 가지 가능한 값을 갖는 Species 라는 특수한 자료형을 정의합니다. 그런 다음 이 열거형을 다음과 같이 배열의 차원으로 사용할 수 있습니다.

Real C[Species];

Species 자료형에는 세 가지 가능한 값만 있으므로 벡터 C 에는 정확히 세 가지 구성 요소가 있음을 의미합니다. 그런 다음 C 의 개별 구성 요소를 C[Species.A], C[Species.B]C[Species.X] 로 참조할 수 있습니다.

각 종류의 이름 앞에 Species 라는 접두어를 계속 붙이는 것은 어색하기 때문에 다음과 같이 몇 가지 편리한 상수를 정의할 수 있습니다.

constant Species A = Species.A;
constant Species B = Species.B;
constant Species X = Species.X;

이런 식으로, 이제 C[A] A 종의 집중을 참조할 수 있습니다. 이 모든 것을 종합하면 다음과 같이 열거를 사용하여 화학 시스템을 나타낼 수 있습니다.

model Reactions_Enum "Modeling a chemical reaction with enums"
  type Species = enumeration(
      A,
      B,
      X);
  Real C[Species] "Species concentrations";
  parameter Real k[3] = {0.1, 0.1, 10};
  constant Species A = Species.A;
  constant Species B = Species.B;
  constant Species X = Species.X;
initial equation
  C[A] = 1.0;
  C[B] = 1.0;
  C[X] = 0.0;
equation
  der(C[A]) = -k[1]*C[A]*C[B] + k[2]*C[X];
  der(C[B]) = -k[1]*C[A]*C[B] + k[2]*C[X] - k[3]*C[B]*C[X];
  der(C[X]) = k[1]*C[A]*C[B] - k[2]*C[X] - k[3]*C[B]*C[X];
end Reactions_Enum;
/static/_images/RE.svg

결론(Conclusion)

이 장에서는 배열을 사용하거나 사용하지 않고 일련의 화학 방정식을 표시하는 방법을 보여 주었습니다.또한 배열과 함께 enumeration 자료형을 사용하여 숫자 인덱스를 이름으로 대체하여결과 방정식을 더 읽기 쉽게 만드는 방법을 보여주었습니다.또한 이 섹션에서는 enumeration 자료형을 사용하여 배열을 인덱싱할 뿐만 아니라 선언에서 하나 이상의 차원을 정의하는 방법도 설명했습니다.