Russian Qt Forum

Qt => Уроки и статьи => Тема начата: ingwarsmith от Апрель 15, 2015, 14:54



Название: Реализация метода Кардано для решения кубических уравнений
Отправлено: 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) (ссылка в первом сообщении также исправлена)