NOMO.asia

인과적 언어와 비인과적 언어

Posted 2017. 11. 24. 12:25, Filed under: 엔지니어링/Modelica

개요

공학 문제를 풀이함에 있어서 인과적 언어와 비인과적 언어에 대한 정의는 여러가지가 있지만 나는 아래와 같이 정의할 수 있을 것 같다.

  • 인과적 언어: 어떠한 문제를 풀기 위해 코드 한줄 한줄을 실행되는 순서대로 작성해야 하는 언어 (goto statement 를 포함 시에도)
  • 비인과적 언어: 어떠한 문제를 풀기 위해 코드 작성 순서를 고려하지 않아도 되는 언어

인과적 언어의 예는 MATLAB 이고, 비인과적 언어의 예는 Modelica 이다.

이렇게만 설명하면 감이 잘 안 오기 때문에, 간단한 예제로 설명하고자 한다.



연립방정식 문제



위 문제는 누구나 쉽게 풀 수 있는 간단한 연립방정식이다.



풀이

1. 수학적 풀이




2. 인과적 언어를 사용한 풀이

MATLAB 을 이용하여 위 문제를 풀기 위해서는, 아래와 같이 코드를 작성해야한다.

A=[1, 1; 2, 1];
B=[2; 3];
X=inv(A) * B;


3. 비인과적 언어를 사용한 풀이

하지만, Modelica language 를 사용하면 아래와 같이 적기만 해도 풀린다.

x+y = 2;
2*x+y = 3;

놀랍지 않은가? 사용자는 문제를 어떻게 풀어야 될지, 어떻게 행렬을 구성해야 될지, 등을 전혀 고려하지 않아도 된다. 단순히 문제를 적는 것 만으로도 문제가 풀린다. 심지어 식의 순서나 좌변과 우변을 구분할 필요도 없다.

3 = 2*x+y;
2 = x+y;

즉 위와 같이 적는 경우에도 아무런 문제 없이 문제가 풀린다. 사용자가 따로 수식을 정리할 필요가 없다는 말이다.


MATLAB의 경우에, 그냥 한 줄에 다 적으면 더 간단한거 아니야? 라고 생각할 수도 있겠지만 그것은 위 문제가 예제로서 간단한 것이라 그렇다. 만약에 식이 10개, 20개, 100개라면 그것을 다 정리해서 적는 것이 과연 편할까?


또한 위 문제의 경우 풀이 방법이 매우 간단하므로 어떤 언어를 쓰든 쉽게 풀 수 있지만 문제가 복잡해지면 그렇지 않은 경우도 많다. 특히 풀어야하는 문제가 선형 방정식이 아니라면 행렬식으로 적는 것도 복잡해진다. 비선형인 경우에는 자코비안을 구해야하고, 사용할 Solver가 요구하는 형태로 행렬을 구성해야 하는 과정이 필요한데 그런 과정들이 전~혀 필요 없다. 그냥 식만 세우기만 하면 자동으로 풀린다. 2차 상미분방정식을 풀고 싶다면 그냥 문제만 적으면 풀린다는 이야기다.


물론 효율이 떨어지고 모든 문제가 항상 원하는대로, 원하는 풀이법을 따라 풀린다는 보장은 없다.

하지만 기본적으로 비인과적 언어를 제공하는 프로그램들은 여러 특성을 가진 솔버(stiff, semi-stiff, non-stiff 등)를 선택할 수 있도록 제공하고 있어서 문제 특성에 맞는 솔버를 선택할 수 있다. 무엇보다 현재 과거보다 컴퓨팅 성능이 많이 좋아졌기 때문에 이러한 제약이 줄어드는 것이라 생각된다.


위와 같은 차이가 인과적 언어와 비인과적 언어의 가장 큰 차이라고 볼 수 있다.