|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Решение кубических уравнений на С++ |
|
|
C/C++ - Решение кубических уравнений на С++
|
Старожил Сообщения: 158 |
Само объяснение есть, вот - http://cubic-solver.info/ Тока я чёт не собиру всё это в кучу, может кто поможет составить последовательность действий.
Вот как я думаю: 1. берём уравнение a*x^3 + b*x^2 + c*x + d = 0 2. заменяем х на у, да так чтоб x = y - (b / 3*a), 3. приводим к более простому (каноническом) виду: y^3 + p*y + q = 0, 4. вводим р= -(b^2 / 3*a^2) + c/a и вводим q= (2*b / 27*a^3) - (b*c / 3*a^2) + b/a 5. с помошью формулы Кардано находим у, только я не пойму формулу (я только в 8-ом классе) kardano.png, напишите плиз, мне её в виде кода! 6. теперь если q^2/4 + p^3/27 > 0 , то кубическое уравнение имеет три различных корня: один из них действительный, два других - сопряженные комплексные; если q^2/4 + p^3/27 = 0, то все три корня действительные, два из них равны если q^2/4 + p^3/27 < 0, то все три корня действительные и различные. чё-то я запутался... А можно было приведя к каноническому виду найти значения p и q, а затем найти "y", используя дискриминант (D = -4p3 - 27q2) только как находится "y" дальше, уже с найденным дискриминантом? (также как x1 и x2 в квадратных уравнениях) Обязательно ознакомьтесь с материалом на странице http://cubic-solver.info/ |
|
Отправлено: 20:51, 30-03-2009 |
Старожил Сообщения: 158
|
Профиль | Отправить PM | Цитировать crashtuak,
Цитата crashtuak:
P.S. Ты ведь фанат Half-Life 2 да? Если так, то да поможет тебе великий Фримен... |
|
Отправлено: 21:15, 30-03-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Арккосинус
Цитата XEN_STRANGER:
Вот пример программы Главное помнить что аргумент функции арккосинус acos() может быть от -1 до 1 включительно, то есть те значения которые может принимать сам косинус. |
|
Отправлено: 03:31, 31-03-2009 | #3 |
Старожил Сообщения: 158
|
Профиль | Отправить PM | Цитировать Admiral, сдесь ты находил арккосинус от х, а я нахожу от (R/ sqrt(Q^3)), но эт не важно... Я что-то не пойму это цикл, конечный ответ, который будет использоваться дальше в вычислениях, тот, который равен арккосинусу от х или от моего (R/ sqrt(Q^3)) - это последнее решение цикла (сомневаюсь)? Что, все последующие вычисления программы надо вставлять внутрь тела цикла?
Admiral, посмотри на формулу с нахождением арккосинуса по этой ссылкеи скажи правильно ли я её перевёл: (кстати что это за зачёркнутый кружок, его можно взять за любую обычную переменную, например U, может это перечисляемая переменная, кажется тип enum ?) #include <stdio.h> #include <math.h> int main(int argc,char *argv[]) { float x; x= (R/ sqrt(Q^3)); for (x=-1;x<=1;x=x+0.01) cout << x << " = acos of x"; return 0; } Пожалуйсто, переведите в код формулы, а там мне почти всё ещё не известно: тригонометрические косинусы (мы изучали пока только геометрические), непонятное слово Arch, ch, sign, sh, переменная "а" под углом корня. Вобщем очень прошу, зайдите на ту страничку в "Вики" и попробуйте перевести те формулы в код. ![]() |
Отправлено: 08:38, 31-03-2009 | #4 |
Старожил Сообщения: 158
|
Профиль | Отправить PM | Цитировать Admiral, crashtuak, Всё вобщем я прогу написал, только при компиляции кода:
Отрывок кода: //----------Кубические уравнения----------------------------------------------------------------------- int x3yravn () { cout << "-----NEXT-------------------------------------------------------" << endl; double a, b, c, x; double error; cout << "Ввод уравнения: " << endl; cout << endl << "(a=) "; cin >> a; cout << "(b=) "; cin >> b; cout << "(c=) "; cin >> c; error = GetX3yravn (x, a, b, c); if (!error) { backer (); } else { cout << endl << "Ошибка! а=0 или b=0, уравнение не кубическое" << endl; } char response; cin >> response; return 0; } // Функция нахождения корней кубического уравнения double GetX3yravn (double *x,double a,double b,double c) { double value = 0; if ((a == 0) || (b == 0)) value = 1; else { double q, r, q3, r2; value = 0; q=(a*a-3.*b)/9.; r=(a*(2.*a*a-9.*b)+27.*c)/54.; r2=r*r; q3=q*q*q; if(r2<q3) { double t=acos(r/sqrt(q3)); a/=3.; q=-2.*sqrt(q); x[0]=q*cos(t/3.)-a; x[1]=q*cos((t+M_2PI)/3.)-a; x[2]=q*cos((t-M_2PI)/3.)-a; cout << "=====РЕЗУЛЬТАТ=================================================="; cout << endl << "Найдено три корня, x1 = " << x[0] << ", x2 = " << x[1] << ", x3 = " << x[2] << endl; cout << "================================================================" << endl; } else { double aa,bb; if(r<=0.) r=-r; aa=-pow(r+sqrt(r2-q3),1./3.); if(aa!=0.) bb=q/aa; else bb=0.; a/=3.; q=aa+bb; r=aa-bb; x[0]=q-a; x[1]=(-0.5)*q-a; x[2]=(sqrt(3.)*0.5)*fabs(r); if(x[2]==0.) { cout << "=====РЕЗУЛЬТАТ=================================================="; cout << "Найдено два корня, x2 = " << x[1] << ", x3 = " << x[2] << endl; cout << "================================================================" << endl; } cout << "=====РЕЗУЛЬТАТ=================================================="; cout << "Найден один корень, x = " << x[0] << endl; cout << "================================================================" << endl; } value = 0; } return value; } //-------END------------------------------------------------------------------------------------- There is no context in which this conversion is possible Как это исправить? |
|
Отправлено: 13:20, 31-03-2009 | #5 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 13:33, 31-03-2009 | #6 |
Старожил Сообщения: 158
|
Профиль | Отправить PM | Цитировать Drongo, А... ясно, спасибо, посмотри плиз на код, он вообще верный, в плане решения уравнений?
Drongo, сейчас проверял и нифига, прога запускается, но после ввода a, b, и c вылетает... Что исправить надо? |
Отправлено: 13:48, 31-03-2009 | #7 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата XEN_STRANGER:
![]() |
|
------- Отправлено: 14:33, 31-03-2009 | #8 |
Старожил Сообщения: 158
|
Профиль | Отправить PM | Цитировать Drongo,
Цитата Drongo:
Тоесть дальше всё выключить? |
|
Отправлено: 15:25, 31-03-2009 | #9 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Выдели в редакторе строку или поставь курсор на нужную стоку и нажми F5
|
------- Отправлено: 16:04, 31-03-2009 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - Решение квадратных уравнений на С++ | ShadowMas | Программирование и базы данных | 29 | 20-05-2011 17:23 | |
Wireless - Посоветуйте WI-FI решение. | krec | Сетевое оборудование | 2 | 29-06-2009 10:39 | |
Теория - Решение системы уравнений | quaker_strelok | Программирование и базы данных | 3 | 23-09-2007 14:29 | |
*Теория* | Решение системы линейных уравнений | DeadBoy | Программирование и базы данных | 5 | 23-02-2005 17:12 | |
Терминальное решение | Baboon | Сетевые технологии | 2 | 06-10-2003 17:13 |
|