MATLAB에서 미분(차분) 및 적분하는 간단한 코드를 소개하겠습니다. 어떤 형태든 계측기를 사용하든지 하면 ADC든 혹은 해당 계측기의 통신방법을 통해 데이터를 받게 됩니다. 이때, 미분-디지털값이 들어오니까 엄밀히 말하면 차분-과 적분을 수행하게 됩니다. 이를 MATLAB에서 간단히 수행해 보겠습니다. 먼저 대상 함수를 만들어야 할테니 간단히 y = sin(omega * t)를 대상으로 하겠습니다. 이때 샘플타임을 10ms로 하죠.
ts = 0.01;
t=0:ts:10;
omega = pi/5;
y = sin(omega*t);
이제 미분해 보겠습니다. MATLAB 명령어 " diff " 를 사용할 겁니다. 이는 단순히 앞선값에서 바로 뒤의 값을 빼는 것입니다. 차분을 할려면 그 상태에서 샘플 타임으로 나눠줘야하니까
diff_y = [0, diff(y)/ts];
를 사용하도록 합니다. 이때, 앞에다가 "0"의 값을 추가하는 것은, 차분을 사용하면 데이터 개수가 하나 작습니다. 둘씩 빼니까요... 데이터가 1번,2번,3번이 있으면 2번-1번, 3번-2번... 이러면 2개로 줄자나요. 그래서 갯수를 맞춰줄려고 하나 집어넣습니다. 적분은 구분구적분처럼 샘플링타임으로 잘린 사각형의 넓이의 합으로 구하면 됩니다. 일명, ZOH (Zero-Order Hold) 방법이라고 하죠. 여하튼, " cumsum "이라는 함수는 누적도수를 구하는 함수입니다. 여기다가 샘플 타임을 곱해주면, 나눠진 사각형마다의 넓이를 구해 누적해서 더하는 것이 되겠죠. 그러면 적분(정적분)이 수행됩니다.
int_y = cumsum(y)*ts;
figure plot(t, y, 'LineWidth',2) hold on grid on plot(t, diff_y,'r', 'LineWidth',2) plot(t, int_y,'c', 'LineWidth',2) legend('t', 'y_{diff}', 'y_{int}') hold off
프로그램 전체 코드입니다.
ts = 0.01; t = 0:ts:10; oemga = pi/5; y = sin(omega*t); diff_y = [0, diff(y)/ts]; int_y = cumsum(y)*ts; figure plot(t, y, 'LineWidth',2) hold on grid on plot(t, diff_y,'r', 'LineWidth',2) plot(t, int_y,'c', 'LineWidth',2) legend('t', 'y_{diff}', 'y_{int}') hold off
그 실행 결과 입니다.
티스토리로 이전하면서 몇몇 글들을 이렇게 옮기고 있습니다.
'Software > MATLAB' 카테고리의 다른 글
MATLAB/Simulink Scope 창에서 데이터 축출하기 (16) | 2009.07.11 |
---|---|
Embedded Block을 이용해보자. (2) | 2009.04.15 |
MATLAB/Simulink 기동시 읽기나 쓰기 실패(에러)하는 경우 (2) | 2009.04.15 |
미분(차분) 및 적분하기 (14) | 2009.04.15 |
sptool을 이용한 간단한 필터적용법 (filter) (6) | 2009.04.15 |
cftool 명령으로 Curve Fitting 간단히 하기 (2) | 2009.04.15 |
Figure에서 Legend사용시 아랫첨자 구현하기 (0) | 2009.04.15 |
Simulink에서 Annotation 사용하기 (4) | 2009.04.15 |
보여주신 적분은 sin --> cos(x) -cos(0) 인 정적분이 된것으로 보이는데요
(모두 양수값이죠)
sin -> cos(x) 가 되는 적분은 어찌해야될까요? (우리가 알고있는 cos파형)
high pass 필터로 cos(0) 을 짜르는 방법밖엔 생각이 안나네요.....
그런가요?? 실제 수치가있는(그래프에도 나와있지만) 대상을 적분했으니 (실제로는 ZOH의 구분구적분인가요??^^) 그렇죠... 실제 수치가 있는 대상에 대한 모든 적분은 정적분이 아닌가요???
cumsum으로 하시면 되는데...
네.. 그러면 되죠^^
감사합니다^^ 미분함수그리는 샘플을 찾고있었는데 적합한 자료가 여기 있었네요^^
네.. 다행이네요. 감사합니다.
3번재 줄에 omega 오타있네요.
왜 안되나 했는데.. 그거 수정하니까 잘됩니다.감사합니다,
아.. 그런가요? 오류 리포트 감사합니다.^^
한가지 질문이 있는데요~!
제가 거리, 시간 데이터를 엑셀 파일로 갖고 있거든요
이를 시간에 따라 미분하면 속도 데이터가 되잖아요
갖고 있는 엑셀 파일을 매트랩에서 미분하여 속도 데이터로 변환하는 방법이 있나요?
https://kr.mathworks.com/help/matlab/ref/xlsread.html
에 보시면 MATLAB에서 엑셀파일에 접근하는 방법을 소개하고 있습니다.
이렇게 해도 되고, 그냥 데이터 import를 메뉴에서 선택하셔도 충분합니다.
음...엑셀을 매트랩에 import하는건 알고 있구영
거리-시간 엑셀 데이터를 import해서 이를 속도-시간 그래프로 나타내고 싶으면 어떻게 해야하는지가 궁금하거든요! ㅎㅎ
먼저... 속도를 구하는 공식을 확인하시고...
엑셀데이터를 행렬로 받아서 속도를 구하는 부분을 학습하셔야겠네요....
그리고.. plot 명령에 대해 학습하시면 될듯합니다.
처음 오메가 정의하실때 oemga 라고 오타났어요
앗~
ㅎㅎ 감사합니다.^^.....