Решение кубического уравнения методом Кардано - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Прошу помощи в переводе и если возможно с комментариями (решения кубического уравнения методом Кардано)
Листинг программы
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <limits>
  6. #include <queue>
  7. #include <string>
  8. #include <set>
  9. #include <stack>
  10. #include <tuple>
  11. using namespace std;
  12. //Cube root
  13. double croot(double x){
  14. if (x < 0)
  15. return -pow(-x, 1.0/3.0);
  16. return pow(x, 1.0/3.0);
  17. }
  18. int main(){
  19. freopen("input.txt", "rt", stdin);
  20. freopen("output.txt", "wt", stdout);
  21. //Ax + By + Cz + D = 0; (A != 0)
  22. const double M_PI = 3.141592653589793238462;
  23. //-----
  24. double A, B, C, D;
  25. cin >> A >> B >> C >> D;
  26. if (A == 0){
  27. cout << "X is any";
  28. return 0;
  29. }
  30. //-----
  31. double p = (3.0*A*C-B*B)/(3.0*A*A);
  32. double q = (2.0*B*B*B-9.0*A*B*C+27.0*A*A*D)/(27.0*A*A*A);
  33. double S = (q*q/4.0) + (p*p*p/27.0);
  34. //-----
  35. double F;
  36. if (q == 0)
  37. F = M_PI/2.0;
  38. if (q < 0)
  39. F = atan(-2.0*sqrt(-S)/q);
  40. if (q > 0)
  41. F = atan(-2.0*sqrt(-S)/q) + M_PI;
  42. //-----
  43. pair<double, double> x[3];
  44. for (int i = 0; i < 3; i++)
  45. x[i].first = x[i].second = 0;
  46. if (S < 0){
  47. x[0].first = 2.0*sqrt(-p/3.0)*cos(F/3.0)-B/(3.0*A);
  48. x[1].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+2.0*M_PI/3.0)-B/(3.0*A);
  49. x[2].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+4.0*M_PI/3.0)-B/(3.0*A);
  50. }
  51. if (S == 0){
  52. x[0].first = 2.0*croot(-q/2.0)-B/(3.0*A);
  53. x[1].first = -croot(-q/2.0)-B/(3.0*A);
  54. x[2].first = -croot(-q/2.0)-B/(3.0*A);
  55. }
  56. if (S > 0){
  57. double temp1 = croot((-q/2.0)+sqrt(S)) + croot((-q/2.0)-sqrt(S));
  58. double temp2 = croot((-q/2.0)+sqrt(S)) - croot((-q/2.0)-sqrt(S));
  59. x[0].first = temp1 - B/(3.0*A);
  60. x[1].first = -temp1/2.0 - B/(3.0*A); x[1].second = sqrt(3)*temp2/2.0;
  61. x[2].first = -temp1/2.0 - B/(3.0*A); x[2].second = -sqrt(3)*temp2/2.0;
  62. }
  63. //-----
  64. printf("x1 = %.15lf + i * %.15lf\n", x[0].first, x[0].second);
  65. printf("x2 = %.15lf + i * %.15lf\n", x[1].first, x[1].second);
  66. printf("x3 = %.15lf + i * %.15lf\n", x[2].first, x[2].second);
  67. return 0;
  68. }

Решение задачи: «Решение кубического уравнения методом Кардано»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #ifndef M_PI
  5. M_PI = 3.141592653589793238462
  6. #endif
  7.  
  8. //Cube root
  9. double croot(double x){
  10.     if (x < 0)
  11.         return -pow(-x, 1.0/3.0);
  12.     return pow(x, 1.0/3.0);
  13. }
  14.  
  15. int main(){
  16.     freopen("input.txt", "rt", stdin);
  17.     freopen("output.txt", "wt", stdout);
  18.     //Ax + By + Cz + D = 0; (A != 0)
  19.  
  20.     //-----
  21.     double A, B, C, D;
  22.     scanf("%lf%lf%lf%lf", &A, &B, &C, &D);
  23.  
  24.     if (A == 0){
  25.         printf("X is any");
  26.         return 0;
  27.     }
  28.     //-----
  29.     double p = (3.0*A*C-B*B)/(3.0*A*A);
  30.     double q = (2.0*B*B*B-9.0*A*B*C+27.0*A*A*D)/(27.0*A*A*A);
  31.     double S = (q*q/4.0) + (p*p*p/27.0);
  32.     //-----
  33.     double F;
  34.     if (q == 0)
  35.         F = M_PI/2.0;
  36.     if (q < 0)
  37.         F = atan(-2.0*sqrt(-S)/q);
  38.     if (q > 0)
  39.         F = atan(-2.0*sqrt(-S)/q) + M_PI;
  40.     //-----
  41.     struct
  42.     {
  43.         double first;
  44.         double second;
  45.     }   x[3];
  46.  
  47.     int i;
  48.     for (i = 0; i < 3; i++)
  49.         x[i].first = x[i].second = 0;
  50.     if (S < 0){
  51.         x[0].first = 2.0*sqrt(-p/3.0)*cos(F/3.0)-B/(3.0*A);
  52.         x[1].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+2.0*M_PI/3.0)-B/(3.0*A);
  53.         x[2].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+4.0*M_PI/3.0)-B/(3.0*A);
  54.     }
  55.     if (S == 0){
  56.         x[0].first = 2.0*croot(-q/2.0)-B/(3.0*A);
  57.         x[1].first = -croot(-q/2.0)-B/(3.0*A);
  58.         x[2].first = -croot(-q/2.0)-B/(3.0*A);
  59.     }
  60.     if (S > 0){
  61.         double temp1 = croot((-q/2.0)+sqrt(S)) + croot((-q/2.0)-sqrt(S));
  62.         double temp2 = croot((-q/2.0)+sqrt(S)) - croot((-q/2.0)-sqrt(S));
  63.         x[0].first = temp1 - B/(3.0*A);
  64.         x[1].first = -temp1/2.0 - B/(3.0*A); x[1].second = sqrt(3)*temp2/2.0;
  65.         x[2].first = -temp1/2.0 - B/(3.0*A); x[2].second = -sqrt(3)*temp2/2.0;
  66.     }
  67.     //-----
  68.     printf("x1 = %.15lf + i * %.15lf\n", x[0].first, x[0].second);
  69.     printf("x2 = %.15lf + i * %.15lf\n", x[1].first, x[1].second);
  70.     printf("x3 = %.15lf + i * %.15lf\n", x[2].first, x[2].second);
  71.     return 0;
  72. }

Объяснение кода листинга программы

  1. В данном коде решается кубическое уравнение методом Кардано.
  2. Переменные A, B, C, D используются для коэффициентов кубического уравнения Ax^3 + By^2 + Cz + D = 0.
  3. В функции main() происходит чтение коэффициентов уравнения с помощью функции scanf().
  4. После проверки на равенство нулю коэффициента A, происходит вычисление дискриминанта и определение значений F, p, q, S.
  5. Затем происходит вычисление корней уравнения в зависимости от значения S.
  6. Если S < 0, то вычисляются корни как комплексные числа в явном виде.
  7. Если S = 0, то вычисляются корни как значения x1 и x2, используя формулу квадратного корня.
  8. Если S > 0, то вычисляются корни как значения x1 и x3, используя формулу вычисления корней кубического уравнения.
  9. Значения корней выводятся на экран с помощью функции printf().
  10. В функции croot(x) вычисляется кубический корень из числа x.
  11. В функции atan(x) вычисляется арктангенс числа x.
  12. В функции sqrt(x) вычисляется квадратный корень из числа x.
  13. В функции pow(x, y) вычисляется число x в степени y.
  14. В функции freopen(x, y, z) происходит перенаправление ввода/вывода в файл x, с помощью функции scanf() и в файл y, с помощью функции printf().
  15. В функции main() используется цикл for для заполнения массива x координатами корней уравнения.
  16. В функции main() используется функция exit() для завершения программы.
  17. В функции main() используется функция fclose() для закрытия файлов ввода/вывода.
  18. В функции main() используется функция printf() для вывода значений переменных на экран.
  19. В функции main() используется функция scanf() для чтения значений переменных из стандартного ввода.
  20. В функции main() используется условный оператор if-else для проверки значений переменных и различных вычислений в зависимости от результата.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы