MATLAB에서 미분(차분) 및 적분하는 간단한 코드를 소개하겠습니다. 어떤 형태든 계측기를 사용하든지 하면 ADC든 혹은 해당 계측기의 통신방법을 통해 데이터를 받게 됩니다. 이때, 미분-디지털값이 들어오니까 엄밀히 말하면 차분-과 적분을 수행하게 됩니다. 이를 MATLAB에서 간단히 수행해 보겠습니다. 먼저 대상 함수를 만들어야 할테니 간단히 y = sin(omega * t)를 대상으로 하겠습니다. 이때 샘플타임을 10ms로 하죠.




                                    ts = 0.01;
                                    t=0:ts:10;
                                    oemga = 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일 올렸던 내용입니다.
티스토리로 이전하면서 몇몇 글들을 이렇게 옮기고 있습니다.



http://pinkwink.kr/trackback/25 관련글 쓰기
  • 공학 2010/12/05 14:47

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

    • PinkWink 2010/12/05 21:22

      그런가요?? 실제 수치가있는(그래프에도 나와있지만) 대상을 적분했으니 (실제로는 ZOH의 구분구적분인가요??^^) 그렇죠... 실제 수치가 있는 대상에 대한 모든 적분은 정적분이 아닌가요???

    • 깡셤 2012/12/17 16:09

      cumsum으로 하시면 되는데...

    • PinkWink 2012/12/21 16:24

      네.. 그러면 되죠^^

  • 공돌이 2012/04/08 13:30

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

  • 감사합니다 2012/10/08 14:49

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

    • PinkWink 2012/10/19 12:42

      아.. 그런가요? 오류 리포트 감사합니다.^^