매스매티카 Mathematica | |
<colbgcolor=#dd1100><colcolor=#fff> 개발단체 | 울프럼 리서치 |
최초공개 | 1988년 |
최신버전 | 14.1(2024년 7월 31일) |
링크 |
매스매티카를 이용하여 그래프를 그린 모습[1] |
[clearfix]
1. 개요
Mathematica
울프럼 리서치에서 만들어 판매중인
2. 개발 배경
입자 상호작용의 양자장적 현상들을 이론적으로 분석하는 연구를 하기위해 프로그램을 짜던 이론물리학자 스티븐 울프럼은 1980년대 초반부터 컴퓨터의 작동 구조중 하나인 세포 자동자에 관해 연구하기 시작했고 연구 분야를 이론컴퓨터과학으로 확장시켰다. 연구가 한창 무르익어갈 무렵인 1988년에 컴퓨터과학 R&D 기업 울프럼 리서치의 출범과 함께 매스매티카가 개발되었다.3. 특징
수치계산 자체는 포트란이나 C언어 등을 쓰는 편이 매스매티카를 사용하는 것보다 낫다. 예를 들어 NIntegrate 등의 명령어를 사용하여 다중적분하는 경우는 시간도 오래 걸리고, 컴퓨터의 성능에 크게 의존한다.[2]다만, 매스매티카의 진정한 파워는 심볼릭 계산이라고 할 수 있다. 대부분의 프로그램이 수치해석적 방법으로 문제를 푸는 반면, 매스매티카는 분석적 방법으로, 즉 마치 손으로 방정식을 풀거나, 관계식을 유도하는 것처럼, 복잡한 식을 정리하고, 최적의 형태로 만들어내는 데 매우 유용하다. 물론 계수에 [math(x)]에 대한 다항식이 곱해진 선형 미분방정식이나 아예 비선형인 미분방정식을 풀기 위해 역도함수나 급수해를 구할 때, 부정적분이나 무한급수로 정의된 아주 괴상망측하고 금시초문인 특수함수를 맞닥뜨려야 할 때가 있기는 하다. 안타깝게도 현대수학에서 통용되는 특수함수마저 정의가 되지 않아 수치해석으로 풀어야 하는 경우도 많다.[3]
또한, 입자물리 등에 사용되는 다양한 행렬의 복잡한 계산을 위한 패키지도 따로 존재하고, 손으로 계산할 시 몇 시간이나 걸릴 계산을 단 몇 분으로 가능하게 한다. xAct와 Feyncalc라는 전파인자 계산 패키지가 대표적. 수치결과의 시각화도 꽤 우수하며, 예술적인 표현도 가능하다.
매트랩(MATLAB)과는 용도가 비슷하지만 약간 접근 방식이 다르다. 공대에서는 매트랩을 더 많이 쓰는 편.
인터프리터 언어처럼 작동되지만 Wolfram Virtual Machine이라는 개념이 언급되는 것을 보면, 가상 머신 위에서 작동되며, 바이트코드로 컴파일하는 기능도 가지고 있다. 다른 프로그래밍 언어들과 달리 아무것도 Assign되지 않은 미지수 개념이 존재하고, 이는 Symbol이라는 특수 타입으로 인식되어, 이를 이용해 컴퓨터 프로그래밍 언어에 수식이라는 개념을 접목시킬 수 있다.
3.1. 장점
- 적은 수의 코드
Wolfram 자사의 비교이지만, 비교를 보면 대부분의 프로그래밍 언어들 보다 가장 적은 숫자의 코드를 쓸 수 있다고 나온다. 그래서 숙련될 경우 Python, MATLAB보다 더 빠른 속도로 코딩할 수 있다. 프로그래밍이라기 보다 이런저런 알고리즘 덩어리들을 조합해서 무언가를 만든다고 보면 좋다. 특히 코딩 테스트 용도로 나오는 알고리즘 퍼즐 문제 같은 것을 풀 때나, 전공서적이나 논문에 나오는 수식이나 Pseudocode를 직접 구현해 보는 것들을 해야 할 때 유용하다. - 정확성
사용되는 숫자 타입부터 32비트 정수나 부동 소수점의 한계에서 벗어나, 무한히 확장할 수 있는 정수형이나 부동 소수점 형 숫자를 지원하며, 그래서 무식하게 큰 원주율이나 팩토리얼 등을 계산해도 문제가 없다. 그리고 유리수, 무리수 자체를 그대로 구현할 수 있기 때문에 보통 알고리즘에서 사용되는 부동 소수점 연산에서 발생하는 오류로부터 완전히 자유로운 알고리즘을 실험할 수 있다. - 노트북 인터페이스
IDE를 기본적으로 주는 MATLAB이나 다른 언어와 달리 Notebook을 기본적으로 사용한다. Notebook이라 하는 것은 Microsoft OneNote나 Evernote같은 전자 필기장에 코딩을 접목시킨 것으로, 워드처럼 문서 제목, 내용 같은 스타일을 지정해 놓고, 안에서 코드로 이런 저런 시뮬레이션을 필기처럼 할 수 있는 유용한 도구이다.
그래서 코딩으로 무언가를 만들어야 할 때 뿐만 아니라 수학이나 과학 공부를 할 때도 유용한 편이다. 전공서적 같은 것을 펼쳐 놓고 보이는 내용들을 시뮬레이션 해보면 빠르게 코딩 실력을 쌓고 지식을 얻을 수 있다. - Typesetting 기능
그리스 문자를 변수로 사용 가능하고, LaTeX나 오피스의 수식 편집기처럼 적분 기호나 분수 기호 등을 이용해 함수를 만드는 코딩할 수 있다. 다른 프로그래밍 언어와 달리 그리스 알파벳을 적절한 영문으로 바꾸거나 분수 같은 것을 곱셈, 나눗셈으로 풀어 적지 않아도 된다는 것이기 때문에, 전공 서적에 나온 수식을 코드화 해야 할 때 실수를 줄일 수 있다. - 훌륭한 문서
매스매티카의 최대 장점 중 하나로, 공식 문서가 꼼꼼하고 내용이 방대하다. 예를 들면 Plot, Integrate 같은 함수들의 API 문서를 보면 백 가지 넘는 예시들로 가득한 것을 볼 수 있고, 클릭하면 바로 복사해서 결과가 나오는지 확인할 수 있다. 심지어 어지간한 전공 서적들을 읽는 것 보다 API 문서를 읽는 것이 보다 관련 지식을 공부하기 좋을 수 있다.
3.2. 단점
- 느린 속도
Loop 을 C나 Java에서 배운 for 식의 문법으로 계산을 수행할 경우 수치 해석 용도로 사용되는 프로그래밍 언어들 중 속도가 가장 느린 편이다. 다른 언어를 통해 매스매티카로 유입된 사용자들이 for를 사용하기 때문에 매스매티카는 늦다는 인상을 가지게 된다.
다만 Map같은 매스매티카의 기본 탑재 함수를 활용하면 바로 for에 비해 10배에서 100배 빨라진다. 거기에 컴파일 기능을 활용하거나, 아니면 아예 C나 CUDA/OpenCL로 바이너리를 미리 만들어 놓고 매스매티카와 연결하면 타 프로그래밍 언어에 뒤지지 않는 속도를 낸다. - 난해한 문법
함수형 언어이고, 연산자를 제외하고는 거의 모든 것이 함수로 표현되는 (초보자에게는 괄호가 많은 것으로 보인다) 문법을 가지고 있다.[4] 또한 같은 기능을 하는 문법이 여러 가지로 가능한 등 Syntactic sugar가 많은 편이다.[5] - 어려운 디버깅
언어 전체의 사용자가 적기 때문에 다른 언어처럼 다양한 디버거나 IDE의 도움을 받기는 힘들다. 몇몇 루틴은 자체적인 버그가 있어서 잘못된 입력을 넣었을때 Abort도 잘 안 먹히고 성능을 엄청 잡아먹거나 아예 뻗는 경우도 있다. 하지만 함수형 언어의 특성상 버그가 발생할 기회 자체가 적다. 그리고 노트북 안에서 언제가 변수의 값을 확인할 수가 있다. 이클립스에 Wolfram Workbench를 plug in으로 설치하면 IDE식의 디버깅도 가능하다. - 비싼 가격
MATLAB과 마찬가지로 상업 라이선스의 가격은 비싼 편이고, 게다가 툴박스로 분할되지 않기 때문에 선택지가 없다. 본인이 공돌이라고 하더라도 아래에 나온 기능 중 문돌이들이 쓰는 기능들까지 죄다 구매해야 하는 셈이다. 하지만 모든 기능이 내장되어 있는 매스매티카의 가격과 기본 Matlab과의 가격이 비슷하기 때문에 필요 없는 기능이 무료로 내장되어 오는 것으로 보는 것이 더 정확하다. - 높은 컴퓨터 요구사양
기본적으로도 메모리를 많이 잡아먹기도 하고, 아래에 언급된 기능들 중 각종 Solver들이나 그래픽 기능들을 사용하여 코딩하면 CPU 사용량 100%를 쉽게 달성하니, 웬만하면 좋은 컴퓨터를 사용하자. - API의 버그
일부 적분이나 편미분방정식이 안 풀린다거나 하는 문제도 있을 수 있다. 다만 수식이 안 풀리는 문제는 개발자의 실수로 인한 버그라기 보다 수학이나 컴퓨터 과학적으로 이런저런 연구가 이루어져야 하는 부분이기도 하다.
4. 기능
- 수식 해석
수치해석법으로는 구현이 불가능한 극한이나 부정적분 개념, Infinite Summation, Continuous Time Fourier Transform을 자동적으로 처리할 수 있다. 그리고 Simplify, Refine 등 복잡한 수식을 단순화하는 알고리즘을 가지고 있다. - 방정식 풀이
방정식과 미분 방정식, 부정 방정식, 부등식 등을 풀 수 있다. 수식 해석으로 방정식을 푸는 알고리즘과 수치 해석으로 방정식을 푸는 알고리즘을 둘 다 가지고 있으며, 전자는 해석적으로 해답이 밝혀졌던 문제들만 풀 수 있지만 수학적으로 엄밀한 함수형의 해답을 구할 수 있고 후자는 Runge-Kutta법이나 Finite Element 등의 방법을 동원해 데이터 형태의 해를 만들어 주지만 현실적인 문제 (경계조건이 데이터 형식인)를 풀 수 있다는 차이이다.
그리고 다른 수치해석용 툴들이 방정식을 Parameterization 해 놓는 과정은 여러분에게 맡겨놓는 것과 달리, 매스매티카의 솔버들은 방정식을 수식 형태로 입력받아 놓아도 자동적으로 Linear Equation인지, Polynomial Equation인지, 혹은 미분방정식의 경우 어떤 종류의 미분방정식인지 분류해 적합한 알고리즘과 매칭 시켜 주기 때문에 편리하게 사용할 수 있다. - 플롯(Plot)
전공 서적이나 논문에 사용되는 그림을 그릴 수 있는 다양한 차트을 제공한다. MATLAB과 달리 미리 함수를 샘플링할 필요 없이 함수 하나와 구간만 정해 놓으면 자동으로 처리해 주는 기능을 가지고 있으며 [6], 그래픽 자체도 MATLAB에 비해서 예쁜 편이다. - 벡터 그래픽
2차원, 3차원 도형을 만들 수 있고, 수학적으로 정확한 좌표와 각도를 가진 커브나 폴리곤을 그리고 싶을 때 유용하다. 그리고 도형을 가지고 기하학 연산을 하거나, 수치 적분에 활용하거나 미분 방정식 풀이에 사용하는 등 다양한 응용이 가능하다. - 데이터베이스
각종 과학이나 공학, 경제학, 사회학에 사용되는 데이터를 Entity 형식으로 다운로드 받을 수 있으며, 검색을 하거나 통계자료를 만들거나, 혹은 화학물질의 물성에 대한 정밀한 수치를 얻을 수 있다. - 단위 환산
물리학에 사용되는 각종 단위들을 가지고 있고, 일반적인 단위 환산 계산기와 달리 Dimension 개념을 위의 수식 해석기에 접목시키는 방식으로 구현되어 있기 때문에 단위 여러 가지가 조합된 단위나 잘 쓰이지 않은 단위로도 간단히 환산할 수 있다. 전자기학 등을 공부하다가 단위 환산에서 헷갈리는 부분이 있다면, Solve에 각종 단위가 조합된 방정식을 그대로 때려넣은 후 계산하면 쉽게 풀 수 있다.
이 외에도 연산 시의 유효숫자를 자동으로 관리해주는 기능이나, 미분 방정식에 사용되는 단위계를 Normalization 해주는 알고리즘을 가지고 있다. - 신호·영상 처리
푸리에 해석, Z 해석, Wavelet 해석, Convolution 등을 할 수 있으며, 위의 기능들과 마찬가지로 Continuous Time에서 푸리에 변환이나 Z 변환을 하는 기능도 있기 때문에 유용하다. 또한 주기함수로 만든 실제 오디오나 이미지를 출력해 눈으로 보거나 귀로 들을 수 있다. 그 외에도 Filter Kernel을 자동으로 합성해 주는 기능을 가지고 있다. - 머신 러닝/딥 러닝
데이터를 수식으로 Fitting 해주는 기능부터, 인공 신경망을 구현할 수 있는 프레임워크를 가지고 있다. - 그래프
자료구조에서 나오는 그래프 개념이며, 최단 경로 문제 등을 푸는 알고리즘을 제공하고 있다. Visualization 기능도 있기 때문에 C나 파이썬 기본 기능을 이용해 그래프 알고리즘을 구현하는 것 보다 직관적인 공부가 가능하다. - 통계학
다양한 랜덤 변수를 통해 통계 모델을 만들 수 있으며, 랜덤 프로세스를 시뮬레이션하는 기능을 가지고 있다. - 자연어 처리
문장을 명사, 동사 등으로 분해시켜 주거나, 문법을 정의해서 자연어 인터프리터를 만들 수 있다. 굳이 문과생이 아니라도 유용한 기능이 있는데, 시프트 + = 를 입력하면 자연어 인터프리터가 나오는데, 여기에 10 meter 같은 것을 입력하면 자동으로 코드로 만들어 준다. - Automatic Theory Proving
3단 논법 등, 가정들로부터 이런 저런 중간 증명을 해 결론에 이르는 것을 자동적으로 계산하는 알고리즘이다. - Optimization
함수의 극대/극소점 등을 찾거나, Linear Programming 문제를 푸는 알고리즘을 의미한다. 공과 대학이라면 여러분들이 흔히 풀어야 하는, 주어진 부품들로 원하는 결과를 만족시키는 기계를 설계할 때 부품들의 파라미터를 어떻게 설정하라는 유형의 문제들을 컴퓨터로 풀고 싶으면 둘러봐야 할 개념이다. - 분자 모형
분자 모형을 제작하고 3차원으로 표현할 수 있다. 위의 화학 데이터베이스와 연동된다. 여러분이 화학과나 화학공학과라면 눈여겨봐야 할 기능일 것이다. - 제어·시스템
블록 다이어그램이나 회로도로 기술되는 공학 설계도를 시뮬레이션하는 기능이다. 자사 솔루션인 SystemModel와, Modelica라는 오픈 소스 모델링 언어와 연동된다. - GUI
Manipulate, Animate, Dynamic 등의 이벤트 기반 처리를 이용하여 그래픽이나 플롯을 이용해 애니메이션을 만들거나, 과학 실험용 위젯을 만드는 데 유용하다. Wolfram Demonstration사이트에 들어가 보면 이를 활용한 다양한 시뮬레이션이 올라와 있다. 다만 이런 이벤트 핸들러를 너무 많이 만들 경우 렉이 걸리므로 유의하자. - 컴파일러
속도가 느리다면 매스매티카 가상 머신의 바이트코드나, LLVM 혹은 C로 컴파일 해서 성능을 향상할 수 있다. 그 외에도 OpenCL이나 CUDA로 GPU에 프로그래밍 할 수 있는 기능이 있다.
기본적으로 수학과 수치 해석을 위한 언어이지만, 함수가 몇 천 가지나 되는 만큼 기능이 많은 편이다. 게다가 셀룰러 오토마타, 자동차 내비게이션, 유니티 엔진과 같은 괴상해 보이는 시뮬레이션들까지 할 수 있다.
5. 기타
물리학과 그 이웃 학문을 연구하게 된다면 메이플, MATLAB과 함께 많이 다루게 될 것이다.상상만 했던 각종 다변수함수를 매스매티카에서 실제로 그릴 수 있다.
매스매티카라는 이름은 스티브 잡스가 지어줬다. 그 전에는 오메가, 폴리매스라는 이름을 후보로 정해뒀었다고.#
NeXT 사에서 컴퓨터를 팔아먹으려고 이걸 번들로 넣었다가
50편으로 만들어진 한국어로 된 매스매티카 넓고 얇은 입문 강의를 유튜브에서 무료로 볼 수 있다. 버전 10으로 만든 강의이지만 모든 명령어를 11에서도 그대로 사용할 수 있다.
워낙 비싼 프로그램이기 때문에 학교에서 라이선스를 사 주는 것이 아니면 열에 아홉은 구버전을 어둠의 루트로 구해서 사용하는 경우가 많다. 학생용은 학교에서 라이선스를 사 주더라도 따로 울프럼에 사용자 등록을 해서 키를 받아 사용해야 한다. 게다가 이렇게 불편한 짓을 매년 해야 계속해서 쓸 수 있다.
2013년, 라즈베리 파이와 제휴를 맺어서 Raspberry Pi OS의 기본 설치 환경에 무료로 실리게 되었다. # 다만 고성능 PC도 버벅거리게 만드는 프로그램을 그런 작은 디바이스에 무슨 생각으로 올린 건지는 의문이 든다.
울프럼 리서치의 정보연산 엔진인 Wolfram Alpha 역시 매스매티카를 기반으로 제작되었기 때문에 매스매티카 문법이 그대로 먹힌다.
6. 사용 예
기본적인 함수의 그래프 작성과 미적분, 행렬 대수, 편·상미분 방정식 풀이, 데이터 분석, 이미지 계산 등 무궁무진하게 사용 가능하다.기본적인 방정식 풀이 |
기본적인 행렬대수 |
편미분 방정식을 풀고, 시각화[7] |
편미분 방정식을 풀고, 시각화[8] |
벡터장(Vector Field)의 시각화[9] |
이렇듯, 각종 수치계산과 자연계열 학생들의 경우엔 전공에서 식으로만 풀었던 것을 시각화해서 공부할 수 있다.
[1] 해당 그래프는 양자역학 중 2차원 무한 퍼텐셜 우물 문제에서 한 변의 길이가 [math(\pi)]인 정사각형 상자 내에 갇힌 입자의 확률밀도함수를 나타낸 것이다.[2] 물론, C나 포트란으로 하려면 본인이 불편한 개발 환경에서 Quadrature이나 Monte-Carlo 같은 수치 적분 알고리즘들을 설계하고 검증할 수 있는 시간이나 노력이 있어야 한다.[3] 대표적인 예시가 "코드클린"과 같은 허위 백신 프로그램을 제거하기 위해 수학 문제를 풀어야 하는 상황을 풍자하기 위해 만들어진 [math(\displaystyle \int_0^\frac{1}{3} \frac{e^{-x^2}}{\sqrt{1-x^2}} \mathrm d x)]의 참값을 구하라는 문제인데, 골때리는 것이 피적분함수의 역도함수가 학계에서 정의되지 않았기 때문에 참값을 도출할 수 없어 수치해석적 방법으로 해결해야 한다. 다만, [math(\displaystyle \int_{-\infty}^{\infty} \frac{e^{-x^2}}{\sqrt{1-x^2}} \mathrm d x)]의 값은 [math(\frac{\pi}{\sqrt{e}} I_0(\frac{1}{2}))]라는 제1종 수정 베셀 함수를 활용한 참값이 도출된다.[4] If문도 함수처럼 써야 한다.[5] 예를 들면 Not에 ! 기호와 ¬기호를 둘 다 사용한다거나 변수의 지역화를 위해서는 Block, Module을 설정해 첫번째 Argument로 변수들을 넣어야 하는 특이한 문법을 써야 하고, 그 외에 Type Checking만을 하기 위해서 정규 표현식 수준의 Pattern Matching을 이용해야 하는 등 배워야 할 문법들이 많다.[6] List가 붙은 것은 데이터를 입력으로 받고, 그렇지 않은 것은 함수를 형식으로 받는다고 보면 된다.[7] 해당 내용은 수리물리학에서 라플라스 방정식()을 이용하여, 사각 평면의 한 변은 100℃로, 나머지 세 변은 0으로 유지시켰을 때의 정상 온도 분포를 시각화한 것이다.[8] 해당 내용은 줄을 뜯었을 때, 진동을 어떻게 하는 지 시각화 한 것이다.[9] 해당 내용은 전자기학 중에서 균일한 전기장 영역에 도체 구를 넣었을 때의 전기장 분포를 알아본 것이다.(조건은 임의로 잡고 시각화)