#include #include #include #include #include #include static void usage(char *progname) { fprintf(stderr, "\n" "usage: %s [options]\n\n" " -p [kp] proportional constant (default 0.7)\n" " -i [ki] integration constant (default 0.3)\n" " -t [num] sample period in seconds (default 1.0)\n" " -h prints this message and exits\n" "\n", progname); } static void roots(double p, double i) { double complex z, r; r = (p + i) * (p + i) - 4.0 * i; r = csqrt(r); z = 2.0 - p - i + r; z /= 2.0; r = conj(z); printf("%.9f %.9f %.9f %.9f %.9f %.9f %.9f %.9f\n", creal(z), cimag(z), creal(r), cimag(r), carg(z), cabs(z), carg(r), cabs(r)); } int main(int argc, char *argv[]) { char *progname; int c; double kp = .7; double ki = .3; double t = 1.0; /* Process the command line arguments. */ progname = strrchr(argv[0], '/'); progname = progname ? 1+progname : argv[0]; while (EOF != (c = getopt(argc, argv, "p:i:t:h"))) { switch (c) { case 'p': kp = atof(optarg); break; case 'i': ki = atof(optarg); break; case 't': t = atof(optarg); break; case 'h': usage(progname); return 0; default: usage(progname); return -1; } } printf("# kp %f ki %f t %f\n", kp, ki, t); roots(kp * t, ki * t); return 0; }