0 / 0 / 0
Регистрация: 13.11.2009
Сообщений: 13
|
||||||
1 | ||||||
Расходящиеся ряды или как правильно задать проверку13.11.2009, 15:31. Показов 1470. Ответов 4
Метки нет (Все метки)
Здравствуйте,
наткнулся на проблему, которая не дает покоя мозгу. Ситуация следующая: Работаю в среде MS Visual Studio 2005(C++), написал программу вычисления функции методом рядов Тейлора. Функция разложения : f=ln(1-x), Раскладывается она следующим образом: http://i36.tinypic.com/20fysfp.gif При входе в цикл первое значение вычисляется после 10,000,000 операций (если E задать 1e-7), если же задать E = 1e-8, то первое значение вычисляется уже после 100,000,000 операций (это видно в выводе) Причем если задать дополнительную проверку на максимальное кол-во итераций (допустим 1000), то точность теряется где-то уже после 3-4 знака.. Вообще говоря, происходит какое-то непонятное переполнение, после которого точность сильно повышается, а кол-во итераций снижается на несколько порядков! Как и с чем это может быть связано и возможен ли другой способ проверки значения во втором цикле for?(может быть, y2-y1 < E? Как это можно реализовать?) По-идее, функция(ряд Тейлора) расходится при больших n... Вот здесь то и вопрос: Как быть в таком случае? Код программы (C++):
0
|
13.11.2009, 15:31 | |
Ответы с готовыми решениями:
4
Как правильно организовать проверку на отсутствие или существование записи в mysql Как правильно задать http запрос, если нужно задать reqest header? Подскажите как задать проверку Как задать проверку на дробную часть? |
║XLR8║
|
|||||||||||
13.11.2009, 18:45 | 2 | ||||||||||
здесь
здесь
Это касательно мелочи.. Если что конкретно не ясно, спрашивайте..
0
|
0 / 0 / 0
Регистрация: 13.11.2009
Сообщений: 13
|
|
13.11.2009, 22:43 [ТС] | 3 |
0
|
133 / 132 / 29
Регистрация: 04.01.2009
Сообщений: 415
|
|||||||||||
14.11.2009, 03:01 | 4 | ||||||||||
В случае, когда x = -1, боюсь, что ничего нельзя сделать. Ряд является знакочередующимся, поэтому и накладываються ограничения на значения X.
Добавлено через 44 минуты Хотя, можно использовать следующее условие: Если значение x<0, то вместо него можно использовать обратное ему значение для данной функции, а именно x=x/(x-1); Например ln(1-(-1))=-ln(1-(1/2)). В таком случае ряд перестает быть знакочередующимся, и операция выполняется намного быстрее. Например для значений X = -1 и eps = 1e-7 количество итераций составляет 21, а для eps = 1e-8, всего лишь 22. На примере своей программы приведу дополнительные условия:
Немного ошибся в условиях, вот правильный код
0
|
0 / 0 / 0
Регистрация: 13.11.2009
Сообщений: 13
|
||||||
30.11.2009, 10:56 [ТС] | 5 | |||||
Всем спасибо за поддержку и советы!
В итоге отладив программу пошагово, я понял наконец, где я теряю минус и преобразовал программу к такому виду(работает вполне сносно!): code
P.S. функция немного другая правда: ln(x+1) Но сути это не меняет, она такая же знакопеременная(не нужен только минус за скобкой как в первом примере)
0
|
30.11.2009, 10:56 | |
30.11.2009, 10:56 | |
Помогаю со студенческими работами здесь
5
Ряды. Как правильно записать выражение? Как задать условие на проверку наличия файла Как правильно делать проверку Как задать условие выхода из цикла, проверку на использование каждого элемента в массиве? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |