NOMO.asia

1D 툴과 Modelica language 맛보기

Posted 2018. 10. 7. 17:26, Filed under: 엔지니어링/Modelica

Mass-Spring (MK) 시스템

  • Analytical 해석
    • Dynamics 이론를 바탕으로 한 수식 및 결과
  • OpenModelica Signal 이용한 해석
    • 각 Signal 블록 설명 및 모델링
    • Postprocessor 다루는 법
    • 결과 확인
  • OpenModelica 1D Mechanical block 이용한 해석
    • 1D Mechanical 블록 설명 및 모델링
    • 결과 확인
  • OpenModelica MBD 이용한 해석
    • MBD 블록 설명 및 모델링
    • 결과 확인
    • 3D Visualization 방법
  • 동역학 해석툴 이용한 검증
    • 결과 확인


출처: http://nomo.asia/338 [SU의 블로그]

아래에서는 다양한 방법으로 간단한 진동문제를 풀어보면서, (Modelica 언어 기반) 1D 해석 툴의 장점에 대해 알아보고자 한다.

문제

강성 계수 k, 댐핑 계수 c를 가지는 선형 스프링이 있다. 이 스프링이 초기에 변형이 되지 않은 상태에서, 한쪽 끝은 고정된 벽에, 한쪽 끝은 질량이 m인 강체에 연결되어 있다. 강체는 1D 운동을 한다고 가정하자. 초기 위치 x0, 초기 속도 v0 일 때 0초부터 10초까지 강체의 위치 x(t)를 구하여라.

(m=10, c=10, k=100, 초기 위치 x0=0, 초기 속도 v0=1)


풀이

1. 이론적 풀이

가장 먼저 운동방정식을 세우자.



기계과 학부 2~3학년 때 배우는 아주 간단한 MCK System에 대한 자유진동문제이지만 손으로 풀어본지는 너무 오래되어서 책을 다시 펴보았다 -_-;; General Solution 만 적었고 유도 과정은 생략하였다.


Response of free vibration



wn : undamped natural frequency

wd : damped natural frequency


2. MATLAB language 을 이용한 풀이(이론적 풀이를 바탕으로)

위에서 이론적으로 유도한 수식을 모든 공대인에게 친숙한 MATLAB language 을 이용하여 계산해보자. 작성한 코드는 아래와 같다.


clear all
m = 10;
c = 10;
k = 100;
x0 = 0;
v0 = 1;

t0 = 0;
tf = 10;
step = 1000;

wn=sqrt(k/m);
zeta=c/(2*wn*m);
wd=wn*sqrt(1-zeta^2);
A=sqrt((v0+zeta*wn*x0)^2+(x0*wd)^2)/wd;
pi=atan((x0*wd)/(v0+zeta*wn*x0));

sol = zeros(step+1,2);
tstep=(tf-t0)/step;
sol(:,1) = t0:tstep:tf;

for i=1:1:step
    t=sol(i,1);
    sol(i,2) = A*exp(-zeta*wn*t)*sin(wd*t+pi);
end

plot(sol(:,1),sol(:,2))
xlabel('time');
ylabel('x(t)');


구한 응답은 아래와 같다.



위와 같은 풀이를 한 이유는, 만약 어떠한 시스템이 주어졌을 때, 이론적 풀이가 가능한 경우 MATLAB 등의 언어를 이용하여 문제를 풀 수 있다는 것을 보여주고자 한 것이다.


3. MATLAB Simulink 를 이용한 풀이

MATLAB Simulink 를 이용하면, 이론적 풀이 방법을 몰라도 운동방정식만 세울 줄 알면 문제를 풀 수 있다.

운동방정식을 가속도에 대해 정리하면 아래와 같다.



위 식을 바탕으로 한 MATLAB Simulink 시스템을 구성하면 문제를 풀 수 있다. 이 때, 폐루프를 어떻게 구성할지를 잘 생각해주어야 한다. 익숙한 사람은 쉬울 수 있으나, 그렇지 않은 사람은 시스템이 복잡할 때 어려움을 느낄 수도 있다.


실행한 결과는 아래와 같다.




이론과 동일한 결과를 얻었다.

즉, MATLAB Simulink 와 같은 프로그램을 이용하여 일종의 제어기를 구성하면 이론적 풀이 방법을 몰라도 문제를 풀 수 있다. 다만 제어기를 구성하는 것은 직접 해야한다.


4. Modelica language를 이용한 풀이

1D 툴을 이용한 풀이를 하기 전, 이해를 돕기 위하여 Modelica language를 이용한 풀이 방법에 대해 설명하고자 한다. Modelica language를 이용하여 동일한 문제를 풀기 위한 코드를 작성하면 아래와 같다. (혹시라도 Simscape language 를 본 적이 있는 사람이라면 비슷한 형태임을 알 수 있을 것이다.)
model example_1d_modelica
  Real m = 10;          // Mass
  Real c = 10;          // Damping coefficient
  Real k = 100;         // Spring coefficient
  Real x(start=0);      // Position (unknown)
  Real dx(start=1);     // Velocity (unknown)
  Real ddx;             // Acceleration (unknown)

equation
  m*ddx+c*dx+k*x=0;     // eq. 1 (from equation of motion)
  dx = der(x);          // eq. 2 (from pos.-velo. relation)
  ddx = der(dx);        // eq. 3 (from velo.-acc. relation)

end example_1d_modelica;


Modelica language 의 경우, 식들의 관계를 정의하여 미지수 개수만큼의 식을 만들면 자동으로 풀린다.

위의 코드에서 m, c, k 는 상수이다.

우리가 구하고 싶은 미지수는 세 개 x(pos), dx(velo.), ddx(acc.) 이다. 따라서 식을 세 개 만들어야 한다.

위의 Modelica code 에서 눈여겨봐야 할 부분은 equation 아래의 세 줄이다.

운동 방정식으로부터 식 1번을 얻는다.

위치를 미분하면 속도라는 단순한 관계식으로부터 식 2번을 얻는다. (der 은 미분한다는 의미이다)

속도를 미분하면 가속도이므로, 역시 간단하게 식 3번을 얻는다.


Modelica language 의 경우 좌우변의 구분이 따로 필요하지 않으므로 식 1번과 같이 적을 수 있다. (Modelica language 를 처음 공부할 때 어떤 블록에서 0=x''+x'+... 와 같은 equation이 있었는데, 좌변에 0이 있길래 도대체 이게 무엇인지 한참을 고민하다 결국 이해를 하지 못했었던 경험이 있다^^;;)


식 세 개, 미지수 세 개 이므로 풀 수 있다. 물론 푸는 것은 프로그램이 수치적인 기법을 이용하여 자동으로 해준다.


결과는 아래와 같다.



역시 동일한 결과를 얻었다.


Modelica language 를 이용한 풀이의 경우, 문제를 이론적으로 풀이할 줄 모르더라도, 운동방정식을 세울 줄 알고 미지수 만큼의 식을 만들어줄 수 있으면(보통 쉬운 편이다) 문제를 풀 수 있다.


5. Modelica language 툴 기반, 1D 모델링 기법을 이용한 풀이

사실 위에서 Modelica language 를 이용하여 풀이한 방법을 실제 사용자가 쓰는 경우는 숙련자가 아닌 이상 드물다(다만 대부분의 툴들이 수식입력기를 제공하고, 이를 통해 수식을 입력하면 자동으로 Modelica language를 기반으로한 모델을 생성해준다).


모든 Modelica language 기반 1D 소프트웨어는, 블록의 그림만 봐도 어떤 시스템인지를 알 수 있는, 간단하고 직관적인 스케마틱 모델링 방법을 제공한다(MATLAB Simscape 와 모델링 방식이 똑같다). 이 방법을 사용하면 주어진 문제를 아주 쉽고 직관적으로 푸는 것이 가능하다.


OpenModelica 라는 오픈소스 툴을 이용하여 같은 문제를 풀이해보고자 한다. 아래의 그림을 보자.



문제를 풀이하기 위한 스케마틱 모델링을 마친 상황이다. 블록의 모양만 봐도 어떤 시스템인지 대략 알 수 있고, 폐루프나 제어기를 구성하는 것은 필요없다.


툴은 블록을 드래그해서 생성할 때마다, 선(connect) 을 각 블록의 커넥터에 연결할 때 마다 Modelica language 를 기반으로 한 식을 자동으로 대신 세워준다. 전처리기가 해주는 역할은 딱 거기까지이다. 그 이후는 Modelica language 로 풀 때와 동일한 방식으로 문제가 풀린다.


결과는 아래와 같다.



Modelica language 를 직접 작성하여 푼 것과 블록을 이용한 모델링 방법의 결과는 완전히 동일하다.

1D 모델링을 이용한 방법의 경우에는 운동 방정식을 구성할 줄 몰라도, 문제를 이론적으로 풀 줄 몰라도, 제어기를 구성할 줄 몰라도 라이브러리를 활용하는 간단한 방법만 안다면 문제를 풀 수 있다.


무엇보다 다른 방법은 모델의 사이즈가 커지거나 복잡해지면 운동방정식을 도출하거나 코딩하는데 난이도가 급격하게 증가하는데 반해, 1D 모델링의 방법은 그런 과정이 필요 없으므로 모델의 배치만 잘 해준다면 아주 빠르고 직관적으로 모델링을 할 수 있다.


(참고로 1D 모델링 툴에서도 Gain, Sum, Integral 등 다양한 블록들을 제공하므로, MATLAB Simulink 에서 구성한 것과 동일한 폐루프를 구성하여 문제를 풀 수는 있다. 그렇지만 그렇게 문제를 풀 이유는 없다.)

6. 다물체 동역학 해석 프로그램 DAFUL 을 이용한 해석

위 풀이의 결과가 정말 맞는지 상용 다물체 동역학 해석툴인 DAFUL 을 이용하여 검증해보았다.




해석 결과



역시 동일한 결과를 얻었다.



정리

공학 문제를 풀기 위해서 어떤 방법이 제일 좋은가? 라는 질문에 어느 방법이 좋다, 나쁘다, 라고 하기에는 각각의 방법에 장단점이 있다. 자신의 연구실/회사가 기존에 사용하던 툴이 있다면, 해당 툴과의 관계도 생각해야한다. 자신의 문제에 대한 프로그램의 최적화 정도, 문제 풀이에 적합한 라이브러리 보유 여부 또한 중요하다.


1D 툴의 장점은 모델링 방법이 간단하고, 시간을 절약할 수 있으며, 직관적이며, 비록 라이브러리에 의존되기는 하지만, 전기, 전자, 유공압, 동역학 등 다양한 물리계를 한 프로그램 내에서 다룰 수 있고, 모델의 재사용성이 매우 높다는 점이다.


단점은 어떠한 문제를 푸는데 최적화된 다른 툴에 비해 동일한 모델을 구성하였을 때 해석 속도가 상대적으로 느릴 수 있으며, 시각화(Visualization)가 제한되고, 문제를 풀 수 있는 자유도에 한계가 있고, Geometry 를 반영하기 어렵고, 라이브러리에 대한 의존도가 높다는 점이다.


또한 요즘 3D 기반 상용툴은 시스템에 대한 이론을 제대로 이해하지 못한 사람도 작동 원리만 알면 해석을 할 수 있도록 쉬운 사용을 강조하지만 (FEM, BEAM 이론 등 구조물 변형에 대한 이론을 몰라도 구조해석을 할 수 있고, 오리피스, 파이프 유동 등 유체역학에 대해 몰라도 유동해석을 할 수 있다), 1D 툴은 등가화를 해야하는 경우가 많아서 모델링 할 시스템에 관한 이론을 충분히 이해하고 있어야 모델링과 해석이 가능한 편이다. 대신 1D 툴의 경우 상용 툴을 기준으로 많은 예제 모델을 보유, 제공하니 예제 모델을 적당히 변형&조합해서 쓰면 된다.


종합하면 1D 툴은 초기 설계 단계에서 저자유도 모델을 구성하고, 다양한 설계인자를 바꿔가며 설계방법론을 적용, 설계를 개선하고 설계 인자에 대한 영향도 평가를 하기 좋은 툴이다.


그리고 Modelica 언어의 장점은 오픈소스 라는 점이다. 물론 Modelica 를 기반으로 한 다양한 상용 툴도 존재하지만, OpenModelica 라는 오픈소스 툴은 1D 툴의 사용법을 익히기 충분한 툴이다. 누구나 재미있게 가지고 놀 수 있다.