본문으로 바로가기

미분(차분) 및 적분하기

category Software/MATLAB 2009. 4. 15. 04:56

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


그 실행 결과 입니다.



이 글은 제 이전 홈페이지에 2008년 11월 29일 올렸던 내용입니다.
티스토리로 이전하면서 몇몇 글들을 이렇게 옮기고 있습니다.




댓글을 달아 주세요

  1. 공학 2010.12.05 14:47

    보여주신 적분은 sin --> cos(x) -cos(0) 인 정적분이 된것으로 보이는데요
    (모두 양수값이죠)
    sin -> cos(x) 가 되는 적분은 어찌해야될까요? (우리가 알고있는 cos파형)
    high pass 필터로 cos(0) 을 짜르는 방법밖엔 생각이 안나네요.....

  2. 공돌이 2012.04.08 13:30

    감사합니다^^ 미분함수그리는 샘플을 찾고있었는데 적합한 자료가 여기 있었네요^^

  3. 감사합니다 2012.10.08 14:49

    3번재 줄에 omega 오타있네요.
    왜 안되나 했는데.. 그거 수정하니까 잘됩니다.감사합니다,

  4. 냥냥 2017.05.29 09:23

    한가지 질문이 있는데요~!
    제가 거리, 시간 데이터를 엑셀 파일로 갖고 있거든요
    이를 시간에 따라 미분하면 속도 데이터가 되잖아요
    갖고 있는 엑셀 파일을 매트랩에서 미분하여 속도 데이터로 변환하는 방법이 있나요?

    • BlogIcon PinkWink 2017.05.29 11:38 신고

      https://kr.mathworks.com/help/matlab/ref/xlsread.html
      에 보시면 MATLAB에서 엑셀파일에 접근하는 방법을 소개하고 있습니다.
      이렇게 해도 되고, 그냥 데이터 import를 메뉴에서 선택하셔도 충분합니다.

    • 냥냥 2017.05.29 13:32

      음...엑셀을 매트랩에 import하는건 알고 있구영
      거리-시간 엑셀 데이터를 import해서 이를 속도-시간 그래프로 나타내고 싶으면 어떻게 해야하는지가 궁금하거든요! ㅎㅎ

    • BlogIcon PinkWink 2017.05.30 08:30 신고

      먼저... 속도를 구하는 공식을 확인하시고...
      엑셀데이터를 행렬로 받아서 속도를 구하는 부분을 학습하셔야겠네요....
      그리고.. plot 명령에 대해 학습하시면 될듯합니다.

  5. ㅇㅇ 2019.09.16 07:00

    처음 오메가 정의하실때 oemga 라고 오타났어요