2011-01-18 7 views
1

Что происходит с моей реализацией решателя уравнения в квартике?
Это мой код on GitHub. Я последовал за этим: http://www.1728.com/quartic2.htm
Фактическая реализация начинается с строки 271, где я создаю monic poly.Реализация решателя уравнений в квартике не работает

Если я попробую его с полиномом с 4 вещественными корнями, он отлично работает (например, с 3x^4 + 6x^3 - 123x^2 - 126x + 1,080), в противном случае дает неправильные корни.

Спасибо,
рубик

P.S. Я вызвал функцию __quartic, так как она все еще находится в разработке

+4

Можете ли вы (1) Опубликовать только самый маленький соответствующий фрагмент кода и (2) фактический пример, показывающий, что вы ожидали и что на самом деле произошло. Это помогает, если вы все это тщательно и полностью. –

+3

Двойные ведущие подчеркивания - это не что иное, как боль, ожидающая своего появления. Даже не начинай привыкать к нему. Внутри классов имена становятся искалеченными, и вы получаете загадочные ошибки имени - и нулевое преимущество. Используйте один лидирующий знак подчеркивания для личных вещей и ни для чего другого (включая материал в разработке). Также см. [PEP 8] (http://www.python.org/dev/peps/pep-0008/). – delnan

+0

@ delnan: Я стараюсь следовать за PEP 8, и я думаю, что в моем коде не было никаких ошибок стиля. Как я уже сказал, я использовал двойные подчеркивания только для того, чтобы предупредить, что он все еще находится в разработке. Но теперь я переименовал его в «quartic». – rubik

ответ

4

Если это не проблема с кубическим решателем (как phkahler предложил), то я держу пари, что это случай ИНТ деления в этих строках:

f = float(c - (3*b**2/8)) 
g = float(d + (b**3/ 8) - (b*c/2)) 
h = e - (3*b**4/256) + (b**2 * c/16) - (b*d/4) 

Если вы используете версия Python, которая меньше 3.0 и не импортирует деление от __future__, тогда у вас могут быть серьезные проблемы. Например, если b = 3, то (3*b**2/8) равно 3 по принципу int, а не правильному значению с плавающей точкой 3.375. Вероятно, лучший способ исправить это - конвертировать a, b, c, d и e в поплавки, прежде чем вы начнете выполнять вычисления. Ваше преобразование в float после всех вычислений для f и g действительно не нужно после того, как вы сделали эту коррекцию, и теперь они не очень помогают вам сейчас.

Для получения дополнительной информации об этой проблеме разделения и его истории см:

http://www.python.org/dev/peps/pep-0238/

http://python-history.blogspot.com/2009/03/problem-with-integer-division.html

+0

Хорошо, спасибо. Преобразование a, b, c, d и e в поплавки работает. – rubik

1

Работает ли ваш кубический корень? Вы должны сократить его до возврата только одного реального корня для использования в решающем квартете. Сначала запустите ряд тестовых примеров на кубическом решателе, включая уравнения с 1 и 3 вещественными корнями. Только после того, как это будет проверено, вы должны попытаться отладить решатель четверти.

+0

Да, он отлично работает, я тестировал его со многими полисами. Конечно, когда корни являются комплексными числами, они не могут быть идеальными ... – rubik

+0

Всегда найдется хотя бы один настоящий корень. Это тот, который вам нужен, чтобы вернуться к решателю. В любом случае, приятно знать, что это работает. – phkahler

1

Возможно, я могу помочь. Я написал a program and the procedure for solving quartic equations.

Я предполагаю, что вы не пишете программу в JavaScript. Я бы хотел помочь (если смогу).

+0

Ehm no I'm not.К сожалению, я пишу программу в Python для проекта pypol (https://github.com/rubik/pypol). Могу ли я связаться с вами? Как? Спасибо, rubik – rubik

+0

rubik Мой E-Mail: [email protected] – wolf