Решение кубического уравнения методом Кардано - 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; }
Объяснение кода листинга программы
- В данном коде решается кубическое уравнение методом Кардано.
- Переменные A, B, C, D используются для коэффициентов кубического уравнения Ax^3 + By^2 + Cz + D = 0.
- В функции main() происходит чтение коэффициентов уравнения с помощью функции scanf().
- После проверки на равенство нулю коэффициента A, происходит вычисление дискриминанта и определение значений F, p, q, S.
- Затем происходит вычисление корней уравнения в зависимости от значения S.
- Если S < 0, то вычисляются корни как комплексные числа в явном виде.
- Если S = 0, то вычисляются корни как значения x1 и x2, используя формулу квадратного корня.
- Если S > 0, то вычисляются корни как значения x1 и x3, используя формулу вычисления корней кубического уравнения.
- Значения корней выводятся на экран с помощью функции printf().
- В функции croot(x) вычисляется кубический корень из числа x.
- В функции atan(x) вычисляется арктангенс числа x.
- В функции sqrt(x) вычисляется квадратный корень из числа x.
- В функции pow(x, y) вычисляется число x в степени y.
- В функции freopen(x, y, z) происходит перенаправление ввода/вывода в файл x, с помощью функции scanf() и в файл y, с помощью функции printf().
- В функции main() используется цикл for для заполнения массива x координатами корней уравнения.
- В функции main() используется функция exit() для завершения программы.
- В функции main() используется функция fclose() для закрытия файлов ввода/вывода.
- В функции main() используется функция printf() для вывода значений переменных на экран.
- В функции main() используется функция scanf() для чтения значений переменных из стандартного ввода.
- В функции main() используется условный оператор if-else для проверки значений переменных и различных вычислений в зависимости от результата.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д