Advertisement
pVinc

Untitled

May 16th, 2021
826
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <cmath>
  2. #include <complex>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <iostream>
  6.  
  7. #if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64)
  8. /* Sekcyjo `define` do przipodku kompilowanio pod VS2019 */
  9.  
  10. #define clear() system("cls")
  11. #define pause() system("pause");
  12.  
  13. #elif defined(__unix__) || defined(linux)
  14. /* jw. przi kompilowaniu pod linuxym */
  15.  
  16. #define clear() system("clear")
  17. #define pause()                                                                \
  18.   getchar();                                                                   \
  19.   getchar();
  20.  
  21. #define printf_s printf
  22. #define scanf_s scanf
  23.  
  24. #endif
  25.  
  26. /* defincyjo do skrocanio wzorow */
  27. #define fe (double)(sqrt(3.0) / 2.0)
  28.  
  29. using namespace std;
  30.  
  31. void wypisz_zesp(char *tekst, complex<double> z) {
  32.   printf_s("%s%lf", tekst, real(z));
  33.   if (imag(z) >= 0) {
  34.     printf_s(" + i%lf\n", abs(imag(z)));
  35.   } else {
  36.     printf_s(" - i%lf\n", abs(imag(z)));
  37.   }
  38.  
  39. }
  40.  
  41. int main(void) {
  42.   /*
  43.    * Rownani we postaci ogolnej
  44.    * [fa]x^3 + [fb]x^2 + [fc]x + [fd]
  45.    *
  46.    * Rownani we postaci kanonicznej
  47.    * z^3 + [fp]z + [fnq]
  48.    *
  49.    * fD - wyroznik rownanio
  50.    */
  51.   double fa, fb, fc, fd, fnq, fp, fD;
  52.  
  53.   /* Zespolone pierwiastki rownanio */
  54.   complex<double> z1, z2, z3;
  55.  
  56.   /* Czysci ekran przed zaczynciym */
  57.   clear();
  58.   printf_s("Elektrotechnika, grupa I, sekcja 1.1.9: Konrad Sowula, Bartosz "
  59.            "Kowalczyk\nZagadnienie 1: Rozwiazania rownania szesciennego\n");
  60.  
  61.   printf_s("Podaj parametr a: ");
  62.   scanf_s("%lf", &fa);
  63.  
  64.   /* kej a == 0, wyjdz z programu */
  65.   if (fa == 0) {
  66.     printf_s("a == 0\n");
  67.     exit(-1);
  68.   }
  69.  
  70.   printf_s("Podaj parametr b: ");
  71.   scanf_s("%lf", &fb);
  72.  
  73.   printf_s("Podaj parametr c: ");
  74.   scanf_s("%lf", &fc);
  75.  
  76.   printf_s("Podaj parametr d: ");
  77.   scanf_s("%lf", &fd);
  78.  
  79.   /* fnq = (-[fb]^3 / 27*[fa]^3) + ([fb]*[fc] / 6*[fa]^2) + [fd]/2*[fa] */
  80.   fnq = (-(fb * fb * fb) / (27 * fa * fa * fa)) + ((fb * fc) / (6 * fa * fa)) -
  81.         (fd / (2 * fa));
  82.  
  83.   /* fp = ([fc]/3*[fa]) - ([fb]^2/9*[fa]^2) */
  84.   fp = (fc / (3 * fa)) - ((fb * fb) / (9 * fa * fa));
  85.  
  86.   /* fD = [fnq]^2 + [fp]^3 */
  87.   fD = (fnq * fnq) + (fp * fp * fp);
  88.  
  89.   if (fD >= 0) {
  90.     (fD == 0) ? printf_s("\n+----------------------------+\n"
  91.                          "| Dwa pierwiaski rzeczywiste |\n"
  92.                          "| Jeden podwojny             |\n"
  93.                          "+----------------------------+\n")
  94.               : printf_s("\n+-------------------------------+\n"
  95.                          "| Jeden pierwiastek rzeczywisty |\n"
  96.                          "| Dwa zespolone                 |\n"
  97.                          "+-------------------------------+\n");
  98.     /*
  99.      * jedyn rzeczywisty, dwa zespolone
  100.      */
  101.     double fu, fv, fx, fre_z, fim_z;
  102.  
  103.     fu = cbrt(fnq + sqrt(fD));
  104.     fv = cbrt(fnq - sqrt(fD));
  105.  
  106.     /* fx - pierwiastek rzeczywisty */
  107.     fx = fu + fv - (fb / (3 * fa));
  108.  
  109.     /* fre_z - rzeczywisto czynsc zespolonych pierwiastkow */
  110.     fre_z = -((fu / 2.0) + (fv / 2.0) + (fb / (3.0 * fa)));
  111.  
  112.     /* fim_z - urojono czynsc zespolonych pierwiastkow */
  113.     fim_z = (fu * fe) - (fv * fe);
  114.  
  115.     z1 = complex<double>(fx, 0);
  116.     z2 = complex<double>(fre_z, fim_z);
  117.     z3 = complex<double>(fre_z, -fim_z);
  118.  
  119.     wypisz_zesp("z1 = ", z1);
  120.     wypisz_zesp("z2 = ", z2);
  121.     wypisz_zesp("z3 = ", z3);
  122.   } else {
  123.     /*
  124.      * trzi rzeczywiste
  125.      */
  126.     printf_s("\n+------------------------------+\n"
  127.              "| Trzy pierwiastki rzeczywiste |\n"
  128.              "+------------------------------+\n");
  129.  
  130.     double ff = (((3 * fc) / fa) - ((fb * fb) / (fa * fa))) / 3.0;
  131.     double fg = (((2 * fb * fb * fb) / (fa * fa * fa)) -
  132.                  ((9 * fb * fc) / (fa * fa)) + ((27 * fd) / fa)) /
  133.                 27.0;
  134.     double fh = ((fg * fg) / 4.0) + ((ff * ff * ff) / 27.0);
  135.     double fi = sqrt(((fg * fg) / 4) - fh);
  136.     double fM = cos(acos(-(fg / (2 * fi))) / 3);
  137.     double fN = sqrt(3.0) * sin(acos(-(fg / (2 * fi))) / 3);
  138.  
  139.     z1 = (2 * cbrt(fi) * fM) - (fb / (3 * fa));
  140.     z2 = -cbrt(fi) * (fM + fN) - (fb / (3 * fa));
  141.     z3 = -cbrt(fi) * (fM - fN) - (fb / (3 * fa));
  142.  
  143.     wypisz_zesp("z1 = ", z1);
  144.     wypisz_zesp("z2 = ", z2);
  145.     wypisz_zesp("z3 = ", z3);
  146.   }
  147.  
  148.   printf_s("\nMetoda Hornera:\n");
  149.   wypisz_zesp("W(z1) = ", ((fa * z1 + fb) * z1 + fc) * z1 + fd);
  150.   wypisz_zesp("W(z2) = ", ((fa * z2 + fb) * z2 + fc) * z2 + fd);
  151.   wypisz_zesp("W(z3) = ", ((fa * z3 + fb) * z3 + fc) * z3 + fd);
  152.  
  153.   printf_s("\nMetoda klasyczna:\n");
  154.   wypisz_zesp("W(z_1) = ",
  155.               fa * pow(z1, 3.0) + fb * pow(z1, 2.0) + fc * z1 + fd);
  156.   wypisz_zesp("W(z_2) = ",
  157.               fa * pow(z2, 3.0) + fb * pow(z2, 2.0) + fc * z2 + fd);
  158.   wypisz_zesp("W(z_3) = ",
  159.               fa * pow(z3, 3.0) + fb * pow(z3, 2.0) + fc * z3 + fd);
  160.   /*
  161.    * Zatrzymuje wykonani az do entera
  162.    */
  163.   pause();
  164.  
  165.   exit(0);
  166. }
  167.  
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement