Deryck
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
|
||||||
1 | ||||||
Погрешность при вычислении синуса26.02.2012, 19:57. Просмотров 2237. Ответов 12
Метки нет Все метки)
(
вот исходный код программы(вычисляет синус через многочлен Тейлора):
0
|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
26.02.2012, 19:57 |
Ответы с готовыми решениями:
12
Ошибка при вычислении функции Ошибки при вычислении выражения Ошибка при вычислении log(x) Ошибка при вычислении выражения |
Питекантроп
249 / 143 / 21
Регистрация: 14.06.2010
Сообщений: 340
|
|
26.02.2012, 22:24 | 2 |
погрешностью можно считать degree(t, i) / factorial(i)
Вообще, программа составлена неэффективно
0
|
Deryck
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
|
|
27.02.2012, 17:16 [ТС] | 3 |
сравнился с формулой... в чем именно погрешность?
да кстати тот же вариант программы но без функций(куча циклов в main), работает идеально.
0
|
Заблокирован
![]() |
|
27.02.2012, 17:34 | 4 |
Deryck, настоятельно рекомендую прочесть http://www.cyberforum.ru/faq/thread436065.html#post2452211
По поводу вашей погрешности - существует погрешность разложения(т.е заменяя функцию на ряд мы уже вносим некую погрешность), причём при меньших значениях аргумента погрешность будет меньше. Попробуйте посчитать по вашему алгоритму sin(0.9) и sin(0.1) и sin(0.01) - будете удивлены! ![]() Добавлено через 1 минуту Deryck, посмотрев ваш код скажу, что находить факториал на каждом шаге - ну очень нерационально, заменяйте всё итератором ![]()
1
|
Deryck
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
|
||||||
27.02.2012, 18:04 [ТС] | 5 | |||||
Ну по поводу факториала, я понимаю что это не рационально, но задание составить программу по функциям, мне показалось что так будет нагляднее, каждая функция выполняет свою часть. В принципе в этом задании эффективность не так уж и важна. Тема про ряды действительно интересно(по ней и матан сдавать можно), но вот что меня смущает, есть еще одна программа, которая работает идеально:
можно ли считать погрешность, полученную в первом варианте программы, допустимой для данного алгоритма?
0
|
Заблокирован
![]() |
|
27.02.2012, 18:16 | 6 |
Deryck, у вас же 30 членов разложения, таким образом точность вашего алгоритма fabs(30-й член разложения) посчиатайте(чесно у вас небольшая каша в коде), где счиается отдельный член разложения сложно увидеть - если вы его так считаете
- то тогда точность fabs(x/fac), я не проверял но помоему вы неверно посчитали итератор...
1
|
Заблокирован
![]() |
||||||
27.02.2012, 18:30 | 7 | |||||
Deryck, вот ваш итератор
Как видите итератор весьма и весьма прост Код ниже считает синус через итератор и оценивает погрешность разложения
1
|
Заблокирован
![]() |
|
27.02.2012, 18:38 | 8 |
Результат работы - яркий пример влияния величины аргумента на значение функции полученной через ряд
![]() PS:Deryck, сравните ваш код с моим и скажите как проще и легче считать пользясь итератором или же вычисляя факториал на каждом шаге? И это вы ограничились 30-ю членами ряда , а если бы взяли их с 1000-чу как бы тогда ваша програмка считала???Она просто бы опрокинулась на факториале, вот поэтому и оговаривал что итератор избавляет наши программы от трудоёмкости и нерационального использования ресурсов. Далее уже выбор за вами... Добавлено через 3 минуты Теперь о погрешности sin(90 градусов) = 1 В расчёте Таким образом погрешность составила 100%*|(0.9994085 - 1)/1| ~ 0.06% Что весьма точно
1
|
Deryck
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
|
|
27.02.2012, 19:35 [ТС] | 9 |
Спасибо огромное. с итератором в принципе разобрался, спасибо за объяснения.
0
|
Том Ардер
Модератор
![]() 3843 / 2455 / 328
Регистрация: 15.06.2009
Сообщений: 4,502
|
|
27.02.2012, 20:05 | 10 |
Ряд знакопеременный, зн. погрешность меньше последнего отброшенного слагаемого. Для
такая точность не оправдывает затраченных усилий. Главный источник ошибок - вычисление факториала, уже при i >=17 factorial(i) выходит за рамки дипазона машинного целого и в памяти оказывается мусор, результат - непредсказуемый. Каждое слагаемое нужно вычислять рекуррентно, тогда проблем с переполнением не будет. (См. посты -=ЮрА=-, ) И вместо float нужно double.
0
|
Deryck
5 / 5 / 0
Регистрация: 01.12.2010
Сообщений: 109
|
|
27.02.2012, 20:20 [ТС] | 11 |
Всем, спасибо. Наконец то довел ее до ума
0
|
Том Ардер
Модератор
![]() 3843 / 2455 / 328
Регистрация: 15.06.2009
Сообщений: 4,502
|
|
27.02.2012, 20:20 | 12 |
-=ЮрА=-, ошибка в итераторе для синуса:
2(n+1)+1 = 2n+3 (было 2n+2)
1
|
|
27.02.2012, 22:18
Погрешность при вычислении синуса
#13
|
Не по теме: Том Ардер, да в знаменателе нужно было
0
|
27.02.2012, 22:18 | |
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
27.02.2012, 22:18 |
Привет! Вот еще темы с ответами:
13
Несоответствие результатов при вычислении функции Проверка на переполнение при вычислении выражения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |