요즘 다시 아~주 오래전 기억들을 더듬고 있는데요. ㅎ... 잘 기억나질 않네요.. 머리가 돌이 되었는지.ㅠ..ㅠ. 아무튼 저는 예전에 이산시스템과 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=는 하고 시작하는 부분이 차분방적식을 풀고 있는 부분입니다.
그게 동작한 모양이구요^^
데이터를 긁어다가 엑셀에서 한 번 그려보았습니다.^^....
'Theory > ControlTheory' 카테고리의 다른 글
[필터연재] 1차 디지털 저역/고역 통과필터 (16) | 2017.01.05 |
---|---|
2차계 시스템의 응답 특성 간편히 확인해 보기 (10) | 2016.08.29 |
Bode Plot의 기초 중에서도 기초이야기 (28) | 2016.08.17 |
Craig의 Robotics 5장. Jacobian 자코비안 (25) | 2016.03.18 |
Craig의 Robotics 4장 예제. PUMA 560의 역기구학 풀이 (Inverse Kinematics) (14) | 2016.02.17 |
Craig의 Robotics 3장 예제. PUMA 560 Python으로 확인해보기 (12) | 2016.02.03 |
Craig의 Robotics 3-4예제. RPR Mechanism Arm (20) | 2016.01.22 |