2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Решение кубического уравнения аналитическим способом.
Сообщение09.04.2015, 18:57 
Здравствуйте! Есть вопрос по решению кубического уравнения аналитически.

Допустим есть уравнение вида:
$x^{3}+847.12234684510304x^{2}+36496529769.030357x-0.02470037029184359=$0$

У уравнения два комплексных и один действительный корень равный 6.767868191E-13. Программировал метод (формулу) Кардано, тригонометрическое решение, но ничего не дает требуемую точность, так как что-то там в -11 степени не подходит. Понимаю, что по мере нахождения всяких сопутствующих математических операций и машинной точности, что-то может теряться. Те же maple, wolfram alfa находят корень точно. Mapl'у явно говорил, чтобы решал аналитически, про wolfram alfa ничего не могу сказать, что он там делает. Код из интернетов тоже не дает такого ответа. Предполагалось заменить аналитическим решением численное. И вообще в перспективе решать и четвертую степень аналитически (решение кубического уравнения собственно является частью метода для решения четвертой степени).

Есть какой-нибудь выход?

Спасибо!

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение09.04.2015, 20:21 
Конкретно в этом уравнении если отбросить куб, да и квадрат тоже, решение практически не изменится.

 
 
 
 Posted automatically
Сообщение09.04.2015, 20:23 
Аватара пользователя
 i  Тема перемещена из форума «Математика (общие вопросы)» в форум «Помогите решить / разобраться (М)»

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение09.04.2015, 20:37 
venco в сообщении #1002062 писал(а):
Конкретно в этом уравнении если отбросить куб, да и квадрат тоже, решение практически не изменится.


Спасибо за замечание. Это действительно так. Постараюсь набрать статистики и выявить закономерности, может и поможет.

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение09.04.2015, 20:58 
Аватара пользователя
Всё зависит от того, сколько уравнений надо решить и как быстро. Если особых требований по производительности нет, я бы действовал так.
1. Избавился бы от дробей, домножив уравнение на 10^{20}$ и подставив $x = 10^{100}y$
2. Подобрал бы наиболее подходящее целое приближение к корню методом двоичного поиска.
Программу удобно писать на Питоне, где есть целая арифметика неограниченной точности.

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение09.04.2015, 21:01 
Все-таки, так как на компьютере пофиг линейные уравнения или квадратные решать, я бы выбросил только куб, точность (по сравнению с линейным случаем) выросла бы на несколько порядков. Один из корней конечно надо выбросить. И здесь, тоже наберите статистики.

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение10.04.2015, 17:58 
Формулу Кардано можно преобразовать так, чтобы она была более численно устойчивой в таких случаях:

Исходное уравнение
$$ax^3+bx^2+cx+d=0$$
заменами
$$x=t-\frac b{3a}$$
$$P=\frac{3ac-b^2}{9a^2}$$
$$Q=\frac{2b^3-9abc+27a^2d}{54a^3}$$
переводим к виду
$$t^3+3Pt+2Q=0$$
Затем вычисляем величину
$$S=\sqrt[3]{{\left(Q+\sqrt{Q^2+P^3}\right)}^2}$$
и корень
$$t=\frac{-2QS}{P^2+PS+S^2}$$

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение10.04.2015, 21:19 
mihailm в сообщении #1002083 писал(а):
Все-таки, так как на компьютере пофиг линейные уравнения или квадратные решать, я бы выбросил только куб, точность (по сравнению с линейным случаем) выросла бы на несколько порядков. Один из корней конечно надо выбросить. И здесь, тоже наберите статистики.


Проверил возникающие случаи. Действительно, кое-где подходит аппроксимация квадратичной функцией, кое-где линейной, где-то сделать этого нельзя. Проводить анализ и выбирать какой способ использовать, пока считаю путем, приводящем к ошибкам. Тем не менее начальные приближения для численных методов получаются хорошими.

-- 10.04.2015, 22:20 --

Sphinx Pinastri в сообщении #1002082 писал(а):
Всё зависит от того, сколько уравнений надо решить и как быстро. Если особых требований по производительности нет, я бы действовал так.
1. Избавился бы от дробей, домножив уравнение на 10^{20}$ и подставив $x = 10^{100}y$
2. Подобрал бы наиболее подходящее целое приближение к корню методом двоичного поиска.
Программу удобно писать на Питоне, где есть целая арифметика неограниченной точности.


Пока попробовал использовать длинную арифметику без модернизации алгоритма. Результат плохой. Буду пробовать и ваш вариант.

-- 10.04.2015, 22:22 --

venco в сообщении #1002363 писал(а):
Формулу Кардано можно преобразовать так, чтобы она была более численно устойчивой


Применил ваши изменения, результат стал лучше.

-- 10.04.2015, 22:39 --

Более оптимизировал вычисления и результат стал идеальным на тех данных, что у меня были дома, используя формулу venco и длинную арифметику Python. Буду пробовать переносить все на С++ и проверять в общем случае. Спасибо.

 
 
 
 Re: Решение кубического уравнения аналитическим способом.
Сообщение10.04.2015, 22:25 
С++ показал, что все-таки "чудо" сделала длинная арифметика. Буду подключить либу gmp или boost, надеюсь производительность упадет не так существенно.

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group