Found an issue with the book? Report it on Github.
이 섹션에서는 화학 시스템의 동작을 설명하는 몇 가지 다른 방법을 다루어 보겠습니다. 배열 기능을 사용하지 않고 모델을 만들고, 벡터를 사용하여 동일한 동작을 구현하겠습니다.그리고, 마지막으로 열거형을 사용하여 동일한 모델을 다시 구현하겠습니다.
모든 예제에서 `다음과 같은 반응 시스템 <http://library.wolfram.com/infocenter/TechNotes/390/>`_에 대한 모델을 구축할 것입니다.
여기에서 는 단순히 이 반응의 중간 결과이며, 전체적인 반응은 다음과 같이 표현 할 수 있습니다.
질량 작용의 법칙을 사용하여 이러한 화학 방정식을 다음 수학 방정식으로 변환할 수 있습니다.
여기서 , 및 은 각각 첫 번째, 두 번째 및 세 번째 반응에 대한 반응 계수입니다. 이 것은 종류별 물질의 반응으로 인한 각각의 물질의 변화를 고려해서 도출된 방정식 입니다.예를 들어, 첫 번째 반응 는 및 분자를 분자로 변환하므로, 에 대한 균형 방정식 에서 해당 반응의 결과로 양의 감소를 나타냅니다.이러한 균형 방정식의 각 항은 유사한 방식으로 파생합니다.
배열을 전혀 사용하지 않는 접근 방식부터 시작하겠습니다. 이 경우, 단순히 변수 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;
이 접근 방식으로 각 종류의 균형에 대한 방정식을 만듭니다. 이 모델을 시뮬레이션하면 다음과 같은 결과를 얻습니다.
화학 시스템의 모델링에 접근하는 또 다른 방법은 벡터를 사용하는 것입니다.이 접근법을 사용하여 , 및 종류를 인덱스 , 및 과 연관시켰으며, 각각의 농도는 벡터 변수 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;
반응 방정식은 비선형이므로 완전한 선형 형태로 변환할 수 없지만, 행렬-벡터 곱을 사용하여 더 단순화할 수 있습니다. 즉, 방정식은 다음과 같습니다.
이는 다음 형식으로 변환할 수 있습니다.
그러면 모델리카에서 다음과 같이 나타낼 수 있습니다.
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
)가 어떤 종( 예: , 또는 ) 에 연결되었는지 알기 어렵다는 것입니다.
숫자에서 이름으로 앞뒤로 매핑해야 하는 이 문제를 해결하기 위해 세 번째 접근 방식은모델리카의 enumeration
자료형을 활용 하는 것입니다.열거형을 사용하면 배열과 관련된 첨자를 정의하는 데 사용할 수 있는 일련의 이름을 정의할 수 있습니다.열거형을 다음과 같이 정의합니다.
type Species = enumeration(A, B, X);
이것은 A
, B
및 X
의 세 가지 가능한 값을 갖는 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]
로 종의 집중을 참조할 수 있습니다. 이 모든 것을 종합하면 다음과 같이 열거를 사용하여 화학 시스템을 나타낼 수 있습니다.
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;
이 장에서는 배열을 사용하거나 사용하지 않고 일련의 화학 방정식을 표시하는 방법을 보여 주었습니다.또한 배열과 함께 enumeration
자료형을 사용하여 숫자 인덱스를 이름으로 대체하여결과 방정식을 더 읽기 쉽게 만드는 방법을 보여주었습니다.또한 이 섹션에서는 enumeration
자료형을 사용하여 배열을 인덱싱할 뿐만 아니라 선언에서 하나 이상의 차원을 정의하는 방법도 설명했습니다.