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

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

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

Прошу помощи в переводе и если возможно с комментариями (решения кубического уравнения методом Кардано)
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <limits>
#include <queue>
#include <string>
#include <set>
#include <stack>
#include <tuple>
 
using namespace std;
 
//Cube root
double croot(double x){
    if (x < 0)
        return -pow(-x, 1.0/3.0);
    return pow(x, 1.0/3.0);
}
 
int main(){         
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    //Ax + By + Cz + D = 0; (A != 0)
    const double M_PI = 3.141592653589793238462;
    //-----
    double A, B, C, D;
    cin >> A >> B >> C >> D;
    if (A == 0){
        cout << "X is any";
        return 0;
    }
    //-----
    double p = (3.0*A*C-B*B)/(3.0*A*A);
    double q = (2.0*B*B*B-9.0*A*B*C+27.0*A*A*D)/(27.0*A*A*A);
    double S = (q*q/4.0) + (p*p*p/27.0);
    //-----
    double F;
    if (q == 0)
        F = M_PI/2.0;
    if (q < 0)
        F = atan(-2.0*sqrt(-S)/q);
    if (q > 0)
        F = atan(-2.0*sqrt(-S)/q) + M_PI;
    //-----
    pair<double, double> x[3];
    for (int i = 0; i < 3; i++)
        x[i].first = x[i].second = 0;
    if (S < 0){
        x[0].first = 2.0*sqrt(-p/3.0)*cos(F/3.0)-B/(3.0*A);
        x[1].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+2.0*M_PI/3.0)-B/(3.0*A);
        x[2].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+4.0*M_PI/3.0)-B/(3.0*A);
    }
    if (S == 0){
        x[0].first = 2.0*croot(-q/2.0)-B/(3.0*A);
        x[1].first = -croot(-q/2.0)-B/(3.0*A);
        x[2].first = -croot(-q/2.0)-B/(3.0*A);
    }
    if (S > 0){
        double temp1 = croot((-q/2.0)+sqrt(S)) + croot((-q/2.0)-sqrt(S));
        double temp2 = croot((-q/2.0)+sqrt(S)) - croot((-q/2.0)-sqrt(S));
        x[0].first = temp1 - B/(3.0*A);
        x[1].first = -temp1/2.0 - B/(3.0*A); x[1].second = sqrt(3)*temp2/2.0;
        x[2].first = -temp1/2.0 - B/(3.0*A); x[2].second = -sqrt(3)*temp2/2.0;
    }
    //-----
    printf("x1 = %.15lf + i * %.15lf\n", x[0].first, x[0].second);
    printf("x2 = %.15lf + i * %.15lf\n", x[1].first, x[1].second);
    printf("x3 = %.15lf + i * %.15lf\n", x[2].first, x[2].second);
    return 0;
}

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

textual
Листинг программы
#include <stdio.h>
#include <math.h>
 
#ifndef M_PI
M_PI = 3.141592653589793238462
#endif
 
//Cube root
double croot(double x){
    if (x < 0)
        return -pow(-x, 1.0/3.0);
    return pow(x, 1.0/3.0);
}
 
int main(){
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    //Ax + By + Cz + D = 0; (A != 0)
 
    //-----
    double A, B, C, D;
    scanf("%lf%lf%lf%lf", &A, &B, &C, &D);
 
    if (A == 0){
        printf("X is any");
        return 0;
    }
    //-----
    double p = (3.0*A*C-B*B)/(3.0*A*A);
    double q = (2.0*B*B*B-9.0*A*B*C+27.0*A*A*D)/(27.0*A*A*A);
    double S = (q*q/4.0) + (p*p*p/27.0);
    //-----
    double F;
    if (q == 0)
        F = M_PI/2.0;
    if (q < 0)
        F = atan(-2.0*sqrt(-S)/q);
    if (q > 0)
        F = atan(-2.0*sqrt(-S)/q) + M_PI;
    //-----
    struct
    {
        double first;
        double second;
    }   x[3];
 
    int i;
    for (i = 0; i < 3; i++)
        x[i].first = x[i].second = 0;
    if (S < 0){
        x[0].first = 2.0*sqrt(-p/3.0)*cos(F/3.0)-B/(3.0*A);
        x[1].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+2.0*M_PI/3.0)-B/(3.0*A);
        x[2].first = 2.0*sqrt(-p/3.0)*cos((F/3.0)+4.0*M_PI/3.0)-B/(3.0*A);
    }
    if (S == 0){
        x[0].first = 2.0*croot(-q/2.0)-B/(3.0*A);
        x[1].first = -croot(-q/2.0)-B/(3.0*A);
        x[2].first = -croot(-q/2.0)-B/(3.0*A);
    }
    if (S > 0){
        double temp1 = croot((-q/2.0)+sqrt(S)) + croot((-q/2.0)-sqrt(S));
        double temp2 = croot((-q/2.0)+sqrt(S)) - croot((-q/2.0)-sqrt(S));
        x[0].first = temp1 - B/(3.0*A);
        x[1].first = -temp1/2.0 - B/(3.0*A); x[1].second = sqrt(3)*temp2/2.0;
        x[2].first = -temp1/2.0 - B/(3.0*A); x[2].second = -sqrt(3)*temp2/2.0;
    }
    //-----
    printf("x1 = %.15lf + i * %.15lf\n", x[0].first, x[0].second);
    printf("x2 = %.15lf + i * %.15lf\n", x[1].first, x[1].second);
    printf("x3 = %.15lf + i * %.15lf\n", x[2].first, x[2].second);
    return 0;
}

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

  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
Похожие ответы