모델리카는 Equation Based Language로서 식을 대입시켰을때 시뮬레이션 모델이 작동을 한다는 특징을 가진다.
예제들을 통해서 모델리카가 어떻게 작동하는지 알아보도록 하겠다.
1. 모델의 생성
model HelloWorld "A simple equation"
Real x (start=1);
parameter Real a = -1;
equation
der (x) = a*x;
end HelloWorld;
model HelloWorld "A simple equation"
HelloWorld라는 모델을 생성한다. 따음표 안의 글은 설명문이다.
Real x (start=1);
실수의 데이터 타입인 x라는 변수를 만들고 초기값은 1이다.
parameter Real a = -1;
모델의 특성을 좌우하는 상수인 실수 a 를 선언하고 -1 의 값을 대입한다.
equation
식에 관한 선언을 한다.
der (x) = a*x;
모델의 식은 d(x)/dt = ax 식의 형태를 가진다.
end HelloWorld;
모델 HelloWorld의 선언을 마친다.
※ 연립방정식을 풀때 변수의 개수와 식의 개수가 같거나 식의 개수가 더 많아야 하듯 본 프로그램에서도 식과 변수의 개수가 같아야 한다.
2. 기본적인 모델리카 변수의 종류
Booleann : true or false
Integer : 정수형
Real : 실수형
String : 문자열
Enumeration : ShirtSize.Medium 과 같이 논리적으로 보이게 하는 변수형 (순서를 나타내는 변수)
constant Real PI=3.141592653589793;
constant String redcolor = "red";
constant Integer one = 1;
parameter Real mass = 22.5;
parameter 값은 변경이 가능한 변수이지만, constant 의 경우엔 변경이 가능하지 않은 상수이다. parameter값은 시뮬레이션 중에는 변경되지 않는다.
3. 간단한 로켓 모델의 생성
한 로켓이 가속한다고 가정할 때,
thrust : 추진력 (위로 올라가는 힘)
mg : 중력에 의해 당기는 힘
mass' : 시간에 따른 질량의 소모량 (질량을 얼마나 많이 배출했는가에 따른 힘)
massLossRate : 시간에 따른 분출량
altitude' = 시간에 따른 위치 변화량 (속도)
velocity' = 시간에 따른 속도 변화량 (가속도)
class Rocket "rocket class"
parameter String name;
Real mass(start=1038.358);
Real altitude(start = 59404);
Real velocity(start = -2003);
Real acceleration;
Real thrust;
Real gravity;
parameter Real massLossRate = 0.00277;
equation
(thrust-mass*gravity)/mass = acceleration;
der(mass) = - massLossRate * abs(thrust);
der(velocity) = acceleration;
end Rocket;
4. 모델리카의 Functions 의 사용
function sum
input Real arg1;
input Real arg2;
output Real result;
algorithm
result := arg1+arg2;
end sum;
function sum
sum이라는 function 을 생성한다.
input Real arg1;
input Real arg2;
output Real result;
2개의 입력 변수와 1개의 출력 변수 하나를 선언한다.
result := arg1+arg2;
arg1+arg2 의 결과를 result에 대입한다.
일반적인 프로그래밍 언어에서의 equal은 대입의 형식인데, 모델리카의 equal은 대입이 아닌 식 자체의 equal 이고 기호는 = 를 사용한다. 대입의 경우 :=의 기호를 사용한다.
5. For 문이 들어간 Function
for i in 1:size(A,1) loop
sum := sum + A[i]*xpower;
xpower := xpower*x;
endfor;
6. 이벤트
6.1 If 문
if <condition>then
<equations>
elseif <condition>then
<equations>
end if;
6.2 When 문
when <conditions> then
<equations>
end when;
6.3 반복 이벤트 생성 Sample( t0, d)
t0 : 시작시간
d : 반복 시간 간격
model SamplingClock
Integer i;
discrete Real r;
equation
when sample(2,0.5) then
i = pre(i) + 1;
r = pre(r) + 0.3;
end when;
end SamplingClock;
sample (t0 ,d) 이라는 콜은 true를 리턴하고 시간이 t0 + i*d 일때 이벤트를 실행시킨다.
7. 비연속적인 변화들 Reinit
reinit 기능을 통해서 탄성계수 c를 이용한 속도의 감소를 적용하여 다시 공을 튀기는 방식의 시뮬레이션 모델을 생성하였다.