From 3da80b055277dd03b0c15c20c1c64f8327ae30c4 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 17 Mar 2020 10:47:04 +0000 Subject: [PATCH] [fun-gen] add Nova fractal --- fun-gen.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/fun-gen.c b/fun-gen.c index 62cd5ef..91649fd 100644 --- a/fun-gen.c +++ b/fun-gen.c @@ -196,7 +196,8 @@ usage(void) fprintf(stderr, "Usage:\n" "\t%s p-degree q-degree p-coefs q-coefs\n" "\t%s -h p-degree p-coefs\n" - "\t%s -n p-degree p-coefs\n", p, p, p); + "\t%s -N ra ia p-degree p-coefs\n" + "\t%s -n p-degree p-coefs\n", p, p, p, p); exit(1); } @@ -276,6 +277,43 @@ do_halley(int argc, char *argv[]) poly_free(&q); } +static void +do_nova(int argc, char *argv[]) +{ + struct poly f, df, p; + double complex a; + double ra, ia; + int i, j, f_degree; + + if (argc < 3) + usage(); + + ra = parse_double(argv[0]); + ia = parse_double(argv[1]); + a = ra + I * ia; + argc -= 2; argv += 2; + + f_degree = parse_integer(argv[0], 0, MAX_DEGREE); + if (argc != f_degree + 1 + 1) + usage(); + + poly_init(&f, f_degree, "f"); + for (j = 0, i = 1 + f.degree; + i > 0; + i--, j++) + f.coefs[j] = parse_double(argv[i]); + + poly_derivate(f, &df, "q"); + poly_init(&p, f_degree, "p"); + for (i = 0; i <= f.degree; i++) + p.coefs[i] = (i == 0 ? 0.0 : df.coefs[i - 1]) - a * f.coefs[i]; + + print_funs(p, df); + poly_free(&f); + poly_free(&df); + poly_free(&p); +} + static void do_newton(int argc, char *argv[]) { @@ -309,14 +347,17 @@ do_newton(int argc, char *argv[]) int main(int argc, char *argv[]) { - int ch, hflag, nflag; + int ch, hflag, Nflag, nflag; - hflag = nflag = 0; - while ((ch = getopt(argc, argv, "hn")) != -1) + hflag = Nflag = nflag = 0; + while ((ch = getopt(argc, argv, "hNn")) != -1) switch (ch) { case 'h': hflag = 1; break; + case 'N': + Nflag = 1; + break; case 'n': nflag = 1; break; @@ -328,6 +369,8 @@ main(int argc, char *argv[]) if (hflag) do_halley(argc, argv); + else if (Nflag) + do_nova(argc, argv); else if (nflag) do_newton(argc, argv); else