Название: Реализация метода Кардано для решения кубических уравнений Отправлено: ingwarsmith от Апрель 15, 2015, 14:54 Создан класс CubicEquationCardano (обычный класс C++, но с применением объектов из библиотеки Qt, таких как объекты класса QVector, а также всё GUI - Qt-шное), реализующий решение кубического уравнения методом Кардано (вычисляются только действительные корни).
Уравнение общего вида ax^3 + bx^2 + cx + d = 0 реализовано так: koeff_A*x^3 + koeff_B*x^2 + koeff_C*x + koeff_D = 0. (1) При этом по умолчанию koeff_A = 1, т.е. решается уравнение вида x^3 + koeff_B*x^2 + koeff_C*x + koeff_D = 0. (2) В алгоритме класса вид (1) приводится к канонической форме y^3 + koeff_p*y + koeff_q = 0 (3) с помощью замены переменных: y = x + koeff_A / (3.0*koeff_B) => x = y - koeff_A / (3.0*koeff_B) p = (3.0*koeff_A*koeff_C - koeff_B^2) / (3.0*koeff_A^2) q = (2.0*koeff_B^3 - 9.0*koeff_A*koeff_B*koeff_C + 27.0*koeff_A^2*koeff_D) / (27.0*koeff_A^3) В Википедии приводится алгоритм решениям данным методом не полностью. За восстановление всего алгоритма решения методом Кардано - отдельное спасибо математику Роману Скоробогатову :) Проект Qt с исходниками лежит тут (https://yadi.sk/d/d3MKx74gg8CTS) (ссылка исправлена 21.04.2015) Название: Re: Реализация метода Кардано для решения кубических уравнений Отправлено: m_ax от Апрель 15, 2015, 16:46 Мало того, что он написан ужасно, так оно ещё и неправильные корни выдаёт(
(а частные случаи: квадратичных и линейных уравнений вообще не может сосчитать) Короче, плохо, очень плохо( Название: Re: Реализация метода Кардано для решения кубических уравнений Отправлено: ingwarsmith от Апрель 21, 2015, 04:46 Спасибо вам за конструктивную критику. Ошибки исправил. Сейчас корни выдает верные (с точностью до 0.00005, имеется в виду максимально допустимое отклонение от нуля значения многочлена ax^3 + bx^2 + cx + d после подстановки корней, иначе программа выдает сообщение о критической ошибке). Насчет того, что частные случаи - квадратные и линейные уравнения не решает - это да, только изначально было задумано, чтоб решались уравнения вида ax^3 + bx^2 + cx + d = 0 только при ненулевом коэффициенте "a".
Исправленный проект здесь (https://yadi.sk/d/d3MKx74gg8CTS) (ссылка в первом сообщении также исправлена) |