Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 13
1

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

10.05.2013, 15:49. Показов 1890. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помощи в переводе и если возможно с комментариями (решения кубического уравнения методом Кардано)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#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;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2013, 15:49
Ответы с готовыми решениями:

Решение кубического уравнения методом хорд и методом простой итерации
Необходимо написать 2 программы, каждая из которых реализует метод решения уравнения...

Решение уравнения методом подбора
Помогите пожалуйста, как выразить x из уравнения? Или написать решение методом подбора? ...

Решение уравнения методом деления пополам
Доброго времени суток снова обращаюсь к вам за помощью возникла некоторая проблемка написал...

Решение нелинейного уравнения методом Ньютона
Ребята, мне очень нужна ваша помощь:cry: Я думаю для тех, кто шарит в языке СИ, это труда не...

1
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
10.05.2013, 19:02 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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
10.05.2013, 19:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2013, 19:02
Помогаю со студенческими работами здесь

Решение нелинейного уравнения методом хорд
Здраствуйте ребят.Огромная прозьба помогите з написанией данной проги.Курсач.Нада до завтра.Ато мне...

Решение уравнения методом деления отрезка пополам
Составить программу, которая находит решение x0 уравнения x-2cosx=0 на отрезке методом деления...

Решение уравнения методом половинного деления отрезка
решить уравнение x^2-7x+8=0 на отрезке я не понимаю почему у меня получается точный ответ...

Решение нелинейного уравнения методом деления отрезка пополам
X^3+0.2*X^2+0.5*X-2=0 Вот код, не пойму, что сделал не так... #include &quot;stdafx.h&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru