Автообновление таблицы
Имеется такая задача : нужно использовать метод Монте-Карло для нахождения числа π . Из входных данных имеется 1 миллион точек и 5000 итераций, после которых получается среднее арифметическое всех значений π.
Если с нахождением числа π проблем никаких не возникает, то как автоматически обновлять всю таблицу и одновременно с этим записывать сумму каждых последующих итераций в некую ячейку?
Используемые формулы:
A2=СЛЧИС()
B2=СЛЧИС()
С2=ЕСЛИ((A2^2+B2^2)<=1;1;0)
D2=СУММ(C2:C1000002)
E2=СЧЁТ(C2:C1000002)
F2=D2*4/E2
Ответы (2 шт):
Если вы используете формулы, то они (по умолчанию) автоматически обновляются, при изменении данных. Также можно запросить перерасчет в ручную, клавишей F9.
Если у вас не происходит автоматический перерасчет, то стоит обратить внимание на следующую ссылку: Автоматический пересчет формул в Excel и вручную
UPD: есть формула СЛМАССИВ, с ее помощью вы можете сразу генерировать необходимое вам количество элементов в двумерном массиве, но даже 1ккХ5к массив мне excel не дал сделать (закончились ресурсы). Единственный вариант я вижу - работа с VBA
Макрос VBA
Sub IterationAndMonteCarloMethod()
Dim dSum As Double, Quantity As Long
Dim i As Long, n As Long
Const NumberOfSteps As Long = 1000 ' к-во значений '
Const IterationsCount As Long = 500 ' к-во итераций '
Randomize
For i = 1 To IterationsCount
Quantity = 0
For n = 1 To NumberOfSteps
If Rnd ^ 2 + Rnd ^ 2 <= 1 Then Quantity = Quantity + 1
Next n
If Quantity > 0 Then dSum = dSum + Quantity * 4 / NumberOfSteps
Next i
Debug.Print "Сумма: " & dSum
If IterationsCount > 0 Then Debug.Print "Среднее: " & dSum / IterationsCount
End Sub
Но при 1000000*5000 будет работать ой как долго...
Результат смотреть в окне Immediate в редакторе VBA
Инструмент Итеративные вычисления предназначен для точных вычислений (например, геодезических). Его "фишка" - разрешенные зацикливания вычислений. Применение итераций для данной задачи - это больше познавательный вариант, чем практический.
Использование итеративных вычислений имеет ряд подводных камней: при включении/выключении итераций эта настройка применяется для всех открытых книг; можно пропустить нежелательные зацикливания вычислений. Но если открыта только одна книга и в ней нет других вычислений, кроме конкретных расчетов с применением этого инструмента, то опасаться нечего.
Большой минус этого варианта для данной задачи - пересчет 5000 раз 2 млн случайных чисел займет много времени. Например, запуск 100 итераций (50 вычислений) - около 1 минуты (зависит от мощности железа). Но если есть другое занятие, то минус превращается в большой плюс - запустить расчет и вскопать за это время сотку земли или разгрузить грузовик цемента :)
Файл-Параметры-Формулы-Параметры вычислений -установить галку Включить итеративные вычисления, Предельное число итераций = 10000 - OK (10000 - потому что сумма будет вычисляться через одну итерацию)
F4 - флаг сброса суммы, или иначе: разрешение счета (любое ненулевое число)/запрет счета (пусто или ноль).
F5 - триггер (переключатель), 1/0:
=--ЕСЛИ(F4;F5=0;)
F6 - счет шагов:
=ЕСЛИ(F4;ЕСЛИ(F5;F6+1;F6);)
F7 - накопительное суммирование чисел, вычисленных в каждой итерации:
=ЕСЛИ(F4;ЕСЛИ(F5;F2+F7;F7);)
F8 - формула среднего:
=ЕСЛИ(F4;F7/F6;)
Также необходимо изменить формулы генерации случайных чисел (естественно, протянуть до строки 1000002):
A2 =ЕСЛИ($F$5=0;СЛЧИС();A2)
B2 =ЕСЛИ($F$5=0;СЛЧИС();B2)
При F4 = 0 (или F4 пусто) сумма и среднее не вычисляются. При F4 = 1(или F4<>0) запускаются итерации.
Триггер принимает значения 0 или 1. При нуле генерируются случайные числа, на следующем шаге к накопленной сумме добавляется вычисленное значение.
При каждой итерации вычисляется среднее значение.


