Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Итеративный метод подсчета среднего арифметическог


Автор: cardinal 6.2.2008, 00:22
То есть как бы цикл, в нем надо каждый раз получая новое число считать среднее арифметическое с учетом это числа

То есть на примере: ср. ариф. чисел 2, 5, 8, 14 равно 29/4 = 7.25
а как посчитать это имея
2
потом 5 (ср. ариф. равно 3.5)
потом 8 (ср. ариф. равно 5)
потом 14 (см. выше)

Вот сейчас пишу и думаю, а не самый ли просто вариант считать так:

((((((2)/1+5)/2)+8)/2)+14)/2 = 9.875

Как бы получается примерное среднее арифметическое... Какие есть мысли?

Автор: maxim1000 6.2.2008, 00:51
Цитата(cardinal @  6.2.2008,  00:22 Найти цитируемый пост)
((((((2)/1+5)/2)+8)/2)+14)/2 = 9.875

может, и простой, но неправильный
более поздние значения будут иметь бОльший вес
(на самом деле, иногда это - именно то, что нужно, но среднее арифметическое - несколько другое)
чтобы получить настоящее среднее арифметическое, нужно на каждом шаге считать взвешенное среднее:
s[n]=( (n-1)*s[n-1]+1*x[n] )/n

Автор: cardinal 6.2.2008, 01:18
s[n]=( (n-1)*s[n-1]+1*x[n] )/n

x[1] = 2
x[2] = 5
x[3] = 8
x[4] =14

s[1] = x[1]/1 = 2
s[2] = (s[1] + x[2])/2 = (2 + 5) / 2 = 3.5
s[3] = (2*s[2]+x[3])/3 = (2*3.5 + 8)/3 = 5
s[4] = (3*s[3]+x[4])/4 = (3*5 + 14)/4 = 7.25

...

Вывод: именно это и искал... smile

Спасибо!

Кстати доказывается просто. Можно было и самому додумать... smile

s[1] = x[1]
s[2] = (x[1] + x[2])/2
s[3] = (x[1] + x[2] + x[3])/3 = (2 * (x[1] + x[2])/2 + x[3])/3 = (2 * s[2] + x[3])/3
...
s[n] = ((n-1)*s[n-1] + x[n]) / n

Автор: maxim1000 6.2.2008, 11:51
кстати, можно ещё немного переделать:
s[n]=s[n-1]+(x[n]-s[n-1])/n
есть подозрения, что эффекты погрешностей вычислений будут меньше...

Автор: cardinal 6.2.2008, 17:19
Цитата(maxim1000 @  6.2.2008,  10:51 Найти цитируемый пост)
кстати, можно ещё немного переделать

Ну то есть скобки раскрыть.

Насчет погрешностей не знаю, но то что вместо умножения и деления остается одно деление - это факт. Это мне нравится. smile Спасибо!

Автор: Earnest 20.2.2008, 19:45
Такая задача часто возникает, когда жаба давит каждый раз, при добавлении данных, среднее (или другую статистику) пересчитывать. Я обычно пишу маленький классик с методами Add и Get. 
Он данные накапливает (т.е. суммирует) и хранит еще число объектов. А по запросу выдает текущее среднее. Можно легко на случай с весами расширить и т.д.

Автор: cardinal 20.2.2008, 23:39
Кому "жаба давит", а кто программирует мк, которые работают на гораздо меньшей частота чем PC и памяти у которых гораздо меньше. Вот и думаешь как бы что получше сделать.
Сделал я в итоге правда проще. Брал последнии 4 значения, складывал и делил на 4. Просто и понятно...

Автор: scalosale 8.2.2023, 20:30
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)