Форум программистов, компьютерный форум CyberForum.ru

Код решения кубического уравнения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
vlad0995
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 27
20.12.2013, 17:55     Код решения кубического уравнения #1
Нужно написать в С++ код решения уравнения типа: A*x^3+B*x^2+C*x+D, кто знает, пожалуйста напишите, мне сказали, что нужно решать по схеме Горнера. На вход поступают числа A,B,C,D, на выход корни уравнения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 17:55     Код решения кубического уравнения
Посмотрите здесь:

C++ как должен быть составлен код решения кв. уравнения на C++
Заданы три корня кубического уравнения: a, b, c. C++
Функция для решения кубического уравнения с комплексными коэффициентами C++
C++ Алгоритм и код программы решения уравнения Пуассона методом матричной прогонки
Найти действительный корень кубического уравнения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2013, 18:15     Код решения кубического уравнения #2
Цитата Сообщение от vlad0995 Посмотреть сообщение
код решения уравнения типа: A*x^3+B*x^2+C*x+D
Это не уравнение. В уравнении должен быть знак равно. Так что скорее всего вам надо не решать уравнение, а вычислить значение. Схема Горнера делает именно это. Так что сначала уточните задачу.
vlad0995
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 27
20.12.2013, 21:47  [ТС]     Код решения кубического уравнения #3
забыл дописать A*x^3+B*x^2+C*x+D=0
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2013, 22:09     Код решения кубического уравнения #4
А какой способ решения вам не сказали? Потому что можно решать по формуле Кардано - довольно муторная история, либо численно. Могут быть два комплексных корня. Их тоже надо считать?
Можно ли использовать пакет комплексной арифметики или комплексные числа тоже самому программировать?
vlad0995
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 27
20.12.2013, 22:32  [ТС]     Код решения кубического уравнения #5
преподавателю без разницы каким способом я буду решать, я сначала попробовал решить по Кардано, сам написал код, но он не работает, потом вспомнил что программа не может вычислить квадратный корень из отрицательного числа.

Добавлено через 4 минуты
преподавателю без разницы каким способом я буду решать, я сначала попробовал решить по Кардано, сам написал код, но он не работает, потом вспомнил что программа не может вычислить квадратный корень из отрицательного числа.
Вот код, который я написал, может сможете исправить, был бы очень благодарен ) Пользовался формулами с этого сайта: http://ateist.spb.ru/mw/kardano.htm
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
73
74
75
76
77
#pragma once
#include <iostream>
#include <stdio.h>  
#include <conio.h>
#include <locale.h>
#include <math.h>
const double PI = 3.1415926535897932384626433832795;
using namespace std;
double a,b,c,d,p,q,s,f,x1,x2,x3,x2i,x3i;
int main()
{
setlocale(LC_ALL,"Russian");
m:cout<<"Введите коэффициенты кубического уравнения Ax^3+Bx^2+Cx+D"<<endl;
cout<<"A= "<<endl;
cin>>a;
cout<<"B= "<<endl;
cin>>b;
cout<<"C= "<<endl;
cin>>c;
cout<<"D= "<<endl;
cin>>d;
if (a==0)
{
    cout<<"Ошибка !"<<endl;
    goto m;
}
else
{
p=((3.*a*c-b*b)/(3.*a*a));
q=((2.*b*b-9.*a*b*c+27.*a*a*d));
s=(((q*q)/4.)+(p*p*p)/27.);
if (q<0)
{
    f=(atan(pow(-s,0.5)/(-q/2)));
}
else if (q>0)
{
    f=(atan(pow(-s,0.5)/(-q/2))+PI);
}
else
{
    f=(PI/2);
}
if (s<0)
{
    x1=(2.*pow((-p/3.),0.5)*cos(f/3.)-b/3.*a);
    x2=(2.*pow((-p/3.),0.5)*cos(f/3.+(2.*PI)/3.)-b/3.*a);
    x3=(2.*pow((-p/3.),0.5)*cos(f/3.+(2.*PI)/3.)-b/3.*a);
}
else if (s>0)
{
x1=(pow(-q/2.+pow(s,0.5),1./3.)+pow(-q/2.-(pow(s,0.5)),1./3.)-b/(3.*a));
    x2=(-0.5*(pow(-q/2.+pow(s,0.5),1./3.)+pow(-q/2.-(pow(s,0.5)),1./3.)-b/(3.*a)));
    x2i=((pow(3.,0.5)/2.)*(pow(-q/2.+(pow(s,0.5)),1./3.)-pow(-q/2.-(pow(s,0.5)),1./3.)));
    x3=(-0.5*(pow(-q/2+pow(s,0.5),1/3)+pow(-q/2-(pow(s,0.5)),1/3)-b/(3*a)));
    x3i=((pow(3.,0.5)/2.)*(pow(-q/2.+(pow(s,0.5)),1./3.)-pow(-q/2.-(pow(s,0.5)),1./3.)));
}
else
{
    x1=(2.*pow(-q/2.,1./3.)-b/(3.*a));
    x2=(-1.*pow(-q/2.,1./3.)-b/(3.*a));
    x3=(-1.*pow(-q/2.,1./3.)-b/(3.*a));
}
cout<<"Х1= "<<x1<<endl;
if (s>0)
{
    cout<<"X2= "<<x2<<"+"<<x2i<<"i"<<endl;
    cout<<"X3= "<<x3<<"-"<<x3i<<"i"<<endl;
}
else
{
cout<<"X2= "<<x2<<endl;
cout<<"X3= "<<x3<<endl;
}
}
system("pause");
}
Добавлено через 4 минуты
задача звучит так: найти все целые корни уравнения A*x^3+B*x^2+C*x+D=0, где A,B,C,D - целые числа.
(Замечание: целыми корнями могут быть только положительные и отрицательные делители коэффициента D).
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
20.12.2013, 23:01     Код решения кубического уравнения #6
Там у вас извлечение корня третьей степени. Оно тоже может быть из отрицательного числа, так что функция pow работать не будет. Нужно вычислять все три значения корня. А потом комбинировать с другим кубичным корнем. В описании формул Кардано об этом говорится. Там морока очень большая.

Я бы вычислил численно один действительный корень x_0, который всегда есть, а потом разделил многочлен на x-x_0. Получится квадратный трехчлен, корни которого (здесь уже, возможно, комплексные) можно найти уже школьным способом.

Добавлено через 2 минуты
Цитата Сообщение от vlad0995 Посмотреть сообщение
задача звучит так: найти все целые корни уравнения A*x^3+B*x^2+C*x+D=0, где A,B,C,D - целые числа.
Вы что, смеетесь? - это совсем другая задача. Может быть у вас A,B,C,D тоже целые?

Добавлено через 4 минуты
Тогда подбирайте корни среди делителей свободного члена. Но только если вам нужно найти еще и кратность корня, то деление многочленов вам все равно придется программировать.

Цитата Сообщение от vlad0995 Посмотреть сообщение
целыми корнями могут быть только положительные и отрицательные делители коэффициента D
Такое бывает справедливо только если A=1, а остальные коэффициенты целые. У вас в задаче говорится что коэффициенты именно такие?

Добавлено через 2 минуты
Цитата Сообщение от palva Посмотреть сообщение
Может быть у вас A,B,C,D тоже целые?
Извините, не прочитал это в задаче, -- разволновался...

Добавлено через 15 минут
Цитата Сообщение от palva Посмотреть сообщение
то деление многочленов вам все равно придется программировать.
Деление многочленов это схема Горнера. Вам правильно сказали.
Yandex
Объявления
20.12.2013, 23:01     Код решения кубического уравнения
Ответ Создать тему
Опции темы

Текущее время: 16:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru