본문 바로가기

Software/MATLAB

미분(차분) 및 적분하기

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



반응형