요즘은 굉장히 다양한 오픈소스 프로그램들이 있습니다. 


수치 분석에 주로 MATLAB 을 사용하곤 했지만 요즘은 MATLAB 을 꼭 써야 하는 것들이 아니라면 Python 을 주로 사용하고 있습니다.


회사에서는 차량용 MBD(Model Based Development) 개발을 위해 Simulink 환경에서 Stateflow 툴박스를 주로 활용하는데


모델링의 일부는 Stateflow API 를 사용하여 MATLAB 스크립트를 통해 자동으로 모델을 구성하는 작업을 하곤 합니다.


모델링 구성후에는 당연히 simulation 을 수행하고 simulation 을 마치면 Embedded Coder 를 사용하여 MATLAB 알고리즘/Simulink 모델에 대해 C 코드 생성후 타겟 보드에서 테스트를 진행 합니다.


위와 같은 작업들은 MATLAB/simulink 를 꼭 써야 하는 작업이므로 사용을 하지만, 제어기 로직 설계 하는 것 이외의 다른 분야들에서는 주로 Python 을 사용하고 있습니다.


Python과 같은 프로그램들은 오픈소스 프로그램이라 누구나 사용할 수 있으니 협업시에도 편한것 같네요.


Python 에서도 MATLAB 과 같이 예쁜 그래프들을 표현 할 수 있는데 matplotlib 모듈을 사용하시면 됩니다.


matplotlib 모듈의 홈페이지는 아래와 같습니다. 


https://matplotlib.org/gallery/index.html


위 주소에 들어가 보시면 다양한 그래프 예제들이 있습니다.


하니씩 실행해 보시는것도 재미 있을 겁니다. MATLAB 에 익숙하신 분들은 코드를 이해하는것도 조금더 편할 것 같네요.


matplotlib 는 Anaconda 를 설치하면 기본적으로 설치가 됩니다. 예전에 아래 포스팅에서는 각 모듈들을 하나하나 찾아가며 설치 했었는데


http://iamaman.tistory.com/377


그냥 간편하게 Anaconda 를 설치해서 사용하시는게 정신건강에 이롭더군요.


저도 그래프 하나 그려 봤는데~~ 다음과 같이 코딩을 하면 그래프를 쉽게 그릴수 있습니다.


MATLAB 에서 그래프 그리는것과 유사하죠~ savefig() 함수를 사용하면 아래와 같이 그림으로 저장도 할 수 있습니다. 

matplotlib 의 메뉴얼은 아래 주소에서 확인 할 수 있습니다. 


https://matplotlib.org/tutorials/index.html


UUID(Universally Unique Identifier) 는 개체를 식별하기 위한 고유 번호이다. 사람의 주민 번호와 비슷하다고 생각하면 될 것 같다.

 

UUID 에 대한 자세한 설명은 아래 주소에서 확인해 보자.

 

https://ko.wikipedia.org/wiki/%EB%B2%94%EC%9A%A9_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90

 

오라클 데이터베이스나 마이크로소프트 등에서는 GUID (Globally Unique Identifier) 라는 이름으로 사용한다고 한다.

 

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%97%AD_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90

 

어쨌든 이런 UUID 는 다양한 프로그램에서 생성할 수 있는데~ 오늘은 내가 주로 사용하는 Powershell, Autohotkey, Python 에서 생성하는 방법에 대해 간단히 소개하려 한다.

 

Powershell 에서는 아래와 같은 명령어를 통해 GUID 를 생성 할 수 있다.

 

[guid]::NewGuid()

 

ToString() Method 를 통해 string 으로 표현할 수 있는데~ 아래와 같이 여러 개의 GUID 를 만들 수 있다.

 

1..10 | foreach { [guid]::NewGuid().ToString()}  


 

다음으로 Autohotkey 에서는 아래 명령으로 GUID 를 생성할 수 있다.

 

TypeLib := ComObjCreate("Scriptlet.TypeLib")

NewGUID := TypeLib.Guid

MsgBox %NewGUID%

 

이런 결과가 나오는 것을 확인 할 수 있다.

 

 

Python 등에서는 uuid 라는 모듈이 있으며~ 아래와 같이 간단하게 random 한 uuid 를 생성 할 수 있다.

 

import uuid

uuid.uuid4()


 

uuid 모듈에 대한 자세한 설명은 아래 매뉴얼을 참조하기 바란다.

 

https://docs.python.org/2/library/uuid.html

아래 포스팅 들에서도 소개했지만, MATLAB 을 사용하면 다양한 random 변수들을 생성할 수 있습니다.  

2011/03/23 - [programming language/MATLAB] - MATLAB random number 생성


2011/03/23 - [programming language/MATLAB] - MATLAB Rayleigh random variable 생성


2011/03/26 - [programming language/MATLAB] - MATLAB Exponential random variable generation


2011/04/06 - [programming language/MATLAB] - MATLAB Bernoulli random variable generation


2011/04/17 - [programming language/MATLAB] - MATLAB binomial r.v. generation


기복적으로 rand, randn, randi, randperm 과 같은 함수들을 제공해 줘서 Uniformly distributed(균일 분포)뿐만 아니라 Normally distributed(정규 분포) 등도 기본적으로 생성 할 수 있습니다.

 

요즘은 C++ 에서도 기본적으로 정규 분포 생성 함수 등을 제공해 주지만 예전에는 정규분포 random variable을 생성하려면 균일 분포를 사용해서 함수로 만들어 사용하곤 했습니다.

  

2012/08/26 - [컴퓨터일반] - C++11 많이 좋아졌네요.


그러다 보니 MATLAB 에서 정규분포를 기본적으로 제공해 주는 건 큰 메리트로 느껴지던 시절이 있었습니다.

 

MATLAB 에서는 Statistics Toolbox 를 사용하면 좀더 다양한 분포들을 아주 쉽게 생성 할 수도 있습니다.

 

그런데 이런 random variable 들도 사실은 그리 random 한 것만은 아닙니다.

 

일단 이해를 위해 MATLAB 을 실행하고 다음과 같이 command window에 작성해 보죠~

 

아래 코드는 간단하게 현재의 시간과 3 × 3균일 분포를 만드는 코드 입니다.

 

>> datestr(now), a=rand(3)

 

결과는 이렇습니다.

 

이제 MATLAB 을 껐다가 다시 실행 시키고 위와 똑 같은 코드를 다시 실행해 보죠~ 아래에 그 결과를 보면 시간은 분명히 달라졌는데 rand() 함수의 결과가 동일하죠?

 

다른 프로그래밍 언어들을 접해 보신 분들은 대부분 아시겠지만, 프로그래밍 언어에서의 random variable 값들은 seed 에 따라 생성 되게 됩니다.

 

MATLAB 에서 random number generation 을 Control 하는 함수로 rng 라는 함수가 있습니다.

 

Command Window 에 rng 라고 타이핑 하면 현재의 seed 상태를 알 수 있습니다. default 세팅은 아래와 같습니다.

 

>> rng

ans =

 

Type: 'twister'

Seed: 0

State: [625x1 uint32]

 

seed 값을 설정할 때 보통 시간에 따라 변화하도록 설정하곤 하는데~ MATLAB 에서는 다음과 같이 설정하면 시간에 따라 seed 값이 변화하도록 할 수 있습니다.

 

rng('shuffle')

 

seed 를 처음 상태로 되 돌리기 위해서는 rng('default') 라고 해 주면 됩니다.

 

그럼 이제 MATLAB 을 껐다가 다시 켜고~ rng('shuffle') 을 한 후에 위에서 사용했던 명령어들을 다시 실행해볼까요?

 

확인을 위해 MATLAB 을 재 시작 시키고 똑같이 발생 시켜 보죠~

 

이젠 rand() 함수의 결과가 바뀌는 것을 확인 할 수 있죠~

 

만약 rng('shuffle') 이라는 코드를 MATLAB 실행 할 때마다 넣어주는 게 불편하다 하시는 분들은 아래 글 참조하셔서 startup 파일에 rng('shuffle') 을 넣어준다면 좀더 편하게 사용할 수 있을 겁니다.


2013/09/30 - [programming language/MATLAB] - MATLAB 시작 폴더 변경 및 startup.m 파일 설정



Random Variable을 생성하기 위해서는 r.v. 의 CDF 값을 알고 있어야 한다.

 

CDF 값을 알고 있으면, 대부분의 컴퓨터 언어에서 기본적으로 제공하는 uniform r.v. 을 생성한 후 CDF 의 inverse 를 통해 r.v. 을 생성한다.

 

오늘의 포스팅에서는 MATLAB 을 이용하여 Bernoulli r.v. 를 생성해 보고 그 PMF(Probability Mass Function)와 CDF 를 확인한다.

 

bernoulli r.v. 은 k=0, 1 에 대하여 다음과 같은 PMF 및 CDF 값을 갖는다.

 

PMF:

 

CDF:

 

그럼 이제 MATLAB을 이용하여 Bernoulli r.v. generation 을 생성해 보자.

 

코드는 다음과 같다.

 

 

 

 

위 코드는 p = 0.3 인 경우의 Bernoulli r.v. 를 생성하고 이에 대한 pmf, cdf 를 표현했으며

 

시뮬레이션에 따른 평균과 분산은 다음과 같다.

 

 

bernoulli r.v. 의 이론적인 평균은 p 이며 위 시뮬레이션의 경우 p=0.3

 

이론적 분산은 p(1-p)=0.3 x 0.7=0.21

 

이므로 시뮬레이션 결과와 이론적 평균 분산 값이 일치 함을 확인 할 수 있다.


  1. ㅠㅜ 2016.12.04 17:49

    bernoulli cdf를 전체 실수 정의역에서 plot할 수는 없나요? 올려주신 코드는 0, 1에서의 값만 알아볼 수 있는데 x에 -1을 입력하면 0, 5를 입력하면 1이 되는 코드를 짜려면 어떻게 해야 하는지 궁금합니다. if문으로는 단일 입력에 대한 값만 볼 수 있고 plot 등 벡터에 대한 값은 볼 수 없던데..

+ Recent posts