| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Откуда погрешность решения кубического уравнения |
| Автор: Нитонисе 9.1.2010, 18:25 | ||
| Решаю кубическое уравнение, используя тригонометрическую формулу Виета. Однако почему-то возникает довольно ощутимая погрешность. Это следствие несовершенства метода или весь вопрос в численных преобразованиях? Например, при вводе коэффициентов a=b=c=d=1, естественно корень уравнения должен быть -1, однако так не получается. Почему? Кроме того при некоторых значениях коэффициентов возникает ошибка неправильного аргумента. Например, при a=3, b=4, c=4, d=-6, программа не может решить уравнение, потому что ей приходится вычислять натуральный логарифм, где аргументом является отрицательное число, чего быть не должно.
Однако надо отметить, что я прибегаю к вычислению натурального логарифма по той причине, что не могу сразу вычислить значения гиперболических функций Arch, Arsh, ch, sh. Эти функции не реализованы в math.h. Как можно их подключить к программе чтобы не связываться с логарифмами? А вот сама программа. |
| Автор: Alexeis 9.1.2010, 19:12 |
Это сколько? float гарантировано врет в 6й значащей цифре. Если значение составляет сотни, то это уже погрешность в 4м знаке после запятой. |
| Автор: Фантом 9.1.2010, 20:15 | ||
Не такая уж большая. На текст программы не посмотреть, но, судя по имеющемуся кусочку, никаких попыток предотвратить потерю точности Вы не предпринимали. Попробуйте заменить везде float на double и посмотреть, что получится. |
| Автор: Нитонисе 9.1.2010, 20:26 | ||
Вот весь текст.
На double менял - результат аналогичен. |
| Автор: kemiisto 9.1.2010, 21:08 |
1.0/3 или что-то подобное религия написать не позволяет? А вообще, http://docs.sun.com/source/806-3568/ncg_goldberg.html Вам в руки. |
| Автор: Нитонисе 9.1.2010, 21:47 |
| Я писал 1/3 - это не работало, потому вставил 0.33333333333333333 Добавлено через 6 минут и 12 секунд кстати, проверял формулу Виета вручную, округляя до 20 знаков после запятой - ответ получился точно таким же. И еще проблема с отрицательным логарифмом... как все таки можно подключить вычисление гиперболических функций? |
| Автор: baldina 9.1.2010, 22:13 | ||||||||||||||
это у Вас основание натурального логарифма задано с такой поразительной точностью? И какой точности после этого Вы ожидаете в результате?
при таких данных q = 3^2 - 3*4 < 0 и t должно быть fabs ® / sqrt (...) Вобщем поглядите свой "алгоритм" еще раз внимательно, там ошибки. Добавлено через 2 минуты и 59 секунд
1/3 и 1./3 - две большие разницы. первое - целочисленное деление, результат округляется до целого (т.е. 0)
чего её проверять, её 400 лет назад проверили, ошибок нет а вот проверять "до 20 знака", беря e=2.7183 - сами понимаете... |
| Автор: Нитонисе 9.1.2010, 22:23 | ||||
Указанный фрагмент относится к вычисление гиперболического косинуса, который равен: ch(x) = [e^x + e^(-x)]/2 Я взял е равным 2.7183. А чему равно е?
http://ru.wikipedia.org/wiki/Тригонометрическая_формула_Виета Посмотрите ссылку, там все же r берется не по модулю. А где еще? |
| Автор: Фантом 9.1.2010, 22:28 |
А зачем вообще его брать? Функция exp в math.h есть. |
| Автор: Нитонисе 9.1.2010, 22:43 |
Вот так объявлена функция exp double exp (double __x) И что мне передать в нее в качестве параметра х? |
| Автор: Alexeis 9.1.2010, 22:48 |
| Нитонисе M_E -- The base of natural logarithms (e). http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx |
| Автор: Фантом 9.1.2010, 22:54 |
Показатель экспоненты, надо думать. |
| Автор: Нитонисе 9.1.2010, 23:16 |
Заменил экспоненту на M_E, число пи на M_PI. Результат тот же. Добавлено через 1 минуту и 26 секунд Так а что насчет гиперболических функций? Как их подключить? Добавлено через 2 минуты и 4 секунды Ну и какой у нас показатель экспоненты? |