![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Redstuff |
|
|||
![]() Команда REDSTUFF ![]() ![]() Профиль Группа: Участник Сообщений: 497 Регистрация: 27.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Вот есть уже готовый алгоритм метода хорд
При заданной ф-ии pow(x,2)-2 и отрезке [a;b] = [-5,5]. X0=-1.#IND00 - результат... Что бы это могло значить? При рассмотрении данной ф-ии, можно понять, что она на данном интервале имеет 2 корня. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
в этом случае здесь
получается деление на ноль, и так у тебя будет при любой четной ф-ией с инверсными, но равными границами интервала. |
|||
|
||||
Redstuff |
|
|||
![]() Команда REDSTUFF ![]() ![]() Профиль Группа: Участник Сообщений: 497 Регистрация: 27.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Мдя... делением на ноль у меня обычно подвисало))... А терь вывод непонятностей.. наверно из-за настроек компилятора? Работаю в VS .NET 2005.
Как поступить тогда например для такой ф-ии pow(x.2)-4 [1;3], точность <1, программа виснит, точность =>1. Выводит рез-ат 2.? Это сообщение отредактировал(а) Redstuff - 11.3.2007, 18:55 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
еще один + компилятору, незачем подвисать ![]() она не виснет, а просто не достигается требуемая точность и цикл становится бесконечным, тут уже дело в методе или его реализации, ничем помочь не могу т.к я его не знаю. |
|||
|
||||
Redstuff |
|
|||
![]() Команда REDSTUFF ![]() ![]() Профиль Группа: Участник Сообщений: 497 Регистрация: 27.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Ага, так и есть цикл получается бесконечный... Буду думать как из него выйти)
|
|||
|
||||
O_Nik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.3.2007 Репутация: 1 Всего: 1 |
программа недоработана:
в этом условие проверяется пересекает ли график ось абсцисс, т.е. находится ли корень в текущем диапазоне и в зависимости от этого устанавливаются границы, но если хорда точно попала в корень это не учтено, потому можно доработать: и добавить проверку на равенство нулю функции в точке X (это для данного случая)
вместо 1E-40 можно поставить оч. маленькую величину, желательно меньше точности расчетов компилятора, конечно можно записать и y==0 но это не корректно сравнивать числа с плавающей точкой точными равенствами. А вообще надо метод разобрать прежде чем программу писать, тем более метод хорд простейший, тут возможен еще обратный ньюанс при попадании на другую границу X, но не в данном случае. да и еще при возведении в целую степень не надо исползовать готовую функцию pow, т.к. в целую степень можно возвести циклом обыкновенным, написав свою функцию, функция же pow раскладывает в ряд и считает приближенно, что может быть критично именно в подобных задачах выч математики. |
|||
|
||||
Redstuff |
|
||||||
![]() Команда REDSTUFF ![]() ![]() Профиль Группа: Участник Сообщений: 497 Регистрация: 27.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Вроде справился
![]()
Если не трудно постестите... Вроде нашел в готовом алгоритме ошибку, поправьте если не прав.. Готовый:
Исправление:
Добавлено @ 23:17 O_Nik, пока редактировал свое письмо, ты успел добавить ) |
||||||
|
|||||||
O_Nik |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.3.2007 Репутация: 1 Всего: 1 |
abs ведь целое число возвращает b=2.3, a=2.1, abs(b-a)=0; если a и b будут разницей меньше 1 то условие будет истино при любом положительном eps т.е. надо fabs
было правильно ведь, если разный знак f(x) и f(a), то сдвигаем "b" к "x", т.е. b=x, иниче "a" с двигаем к "x". |
||||
|
|||||
Redstuff |
|
|||
![]() Команда REDSTUFF ![]() ![]() Профиль Группа: Участник Сообщений: 497 Регистрация: 27.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
O_Nik, если оставить if (y*u<0), то зацикливается программа... при x*x-4
|
|||
|
||||
O_Nik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.3.2007 Репутация: 1 Всего: 1 |
Знаю, что зацикливается,
промежуточные результаты a и b выводи и увидишь, что зацикливается из-за совпадения с границей корня уравнения, что не корректно учтено в условии. что можно сделать: протести свой пример при a=0 и b=2, так чтобы одна граница интервала расширилась относительно корня, и убедись, что ты просто подогнал под свои исходные данные задачу. можно добавить в код условие дополнительное, например такое (это самое простенькое):
и все будет ОК Это сообщение отредактировал(а) O_Nik - 12.3.2007, 21:04 |
|||
|
||||
Redstuff |
|
|||
![]() Команда REDSTUFF ![]() ![]() Профиль Группа: Участник Сообщений: 497 Регистрация: 27.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 1 |
O_Nik, спасибо! + однозначно!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |