Решение кубического уравнения методом Кардано - 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 для проверки значений переменных и различных вычислений в зависимости от результата.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д