본문 바로가기

Theory/ControlTheory

역 Z-변환된 차분 방정식을 C 코드로 계산하기

요즘 다시 아~주 오래전 기억들을 더듬고 있는데요. ㅎ... 잘 기억나질 않네요.. 머리가 돌이 되었는지.ㅠ..ㅠ. 아무튼 저는 예전에 이산시스템과 Z-변환[바로가기]이라는 글을 적은 적이 있습니다. 거기서 Z 변환과 역 Z 변환을 다루었었는데요... 기억도 가물거리고 그 때 교재들도 다 없어서 최근 책하나를 구매했지요. 개인적으로 살짝~ 얼굴만 알고 있는 고경철 교수님의 C언어로 구현하는 디지털 제어 기술 및 실습[바로가기]이라는 책입니다. 

아주 흥미로운 책입니다. 예전 기억을 떠올리기에 좋더라구요^^. 아무튼 이 책의 역 Z-변환된 차분 방정식을 C 코드로 계산하는 예제가 있어서 소개해 드릴까 합니다.^^

Z-domain에서 표현된 함수가 주어졌구요... 이를 간편히 역변환해보면

이런 수식을 얻게 되네요.

이때 델타함수의 정의는 위와 같습니다. 이제 위 수식이 어떤 형태인지 알고 싶은건데요. 그걸 C 코드로 간편히 구현해 보는거죠... 이를 실습할려면 C 컴파일러가 필요한데요. 하드디스크의 용량이 충분하다면(^^) 개인에게는 무료로 배포되는 MS의 Visual Studio Community 2015[바로가기]가 괜찮습니다. 거기서 Win Console 모드로 코드를 짜면 됩니다.^^

#include "stdafx.h"
#include <iostream>

double difference_eq(double u)
{
    static double x, x1, x2, u1, u2;

    x = 1.2328 * x1 - 0.8805*x2 + 0.8767*u1 - 0.5593*u2;
    u2 = u1;
    u1 = u;
    x2 = x1;
    x1 = x;

    return x;
}

int main()
{
    int k;

    double x[100], u[100];

    for (k = 0; k < 100; k++)
    {
        if (k == 0) u[k] = 1.0;
        else u[k] = 0.0;
    }

    for (k = 0; k < 100; k++)
    {
        x[k] = difference_eq(u[k]);
    }

    for (k = 0; k < 100; k++)
    {
        printf("output x[%d] = %10.6f \n", k, x[k]);
    }

    system("pause");

    return 0;
}

위 코드가 고경철 교수님이 책에서 제시한 코드입니다. 위 수식을 입력해 두고 print하는 것 뿐이죠.^^ difference_eq함수 안에 x=는 하고 시작하는 부분이 차분방적식을 풀고 있는 부분입니다.

그게 동작한 모양이구요^^

데이터를 긁어다가 엑셀에서 한 번 그려보았습니다.^^....

반응형