Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вычислить работы цикла математически (http://www.flasher.ru/forum/showthread.php?t=211424)

PlutDem 29.08.2015 17:06

Вычислить работы цикла математически
 
Здравствуйте, можно ли вычислить результат работы цикла без использования самого цикла? По какой нибудь формуле?
Код AS3:

var x:Number  = 0;
for (var i:int = 0; i < 100; i++){
    x *= 0.9;
    x += 10;
}


Bletraut 29.08.2015 18:48

Может быть как-то через прогрессии.

Добавлено через 1 час 1 минуту
В принципе я могу вывести подобное.

Добавлено через 1 час 2 минуты
Код AS3:

                        var x:Number = 0;
                        var x2:Number = 0;
 
                        var d:Number = 0.9;
                        var m:Number = 10;
                        var j:int = 100;
 
                        for (var i:int = 0; i < j; i++)
                        {
                                x *= d;
                                x += m;
                        }
 
                        x2 = x2 * Math.pow(d, j - 1) + d * m * (1 + (d * (1 - Math.pow(d, j - 2))) / (1 - d)) + m;
                        trace(x, x2);

выводит

Код AS3:

99.99734386011124 
99.99734386011126

Числа немного отличаются.

Добавлено через 1 час 7 минут
Вот искомая формула, где d = 0.9, m = 10, j - размерность цикла.
Код AS3:

x2 = x2 * Math.pow(d, j - 1) + d * m * (1 + (d * (1 - Math.pow(d, j - 2))) / (1 - d)) + m;

Добавлено через 1 час 16 минут
А если не секрет, то где такое тебе понадобилось?

caseyryan 29.08.2015 20:51

Похоже на какое-то тестирование. В OCPJP такие вопросы встречал

PlutDem 30.08.2015 12:51

Bletraut, Использовал в игре для нахождения максимальной скорости которою может развить транспортное средство с двигателем определенной мощности. В оригинале опытным путём было выбрано 300 итераций для цикла - дальше прирост уже незначительный.
Если не секрет, как Вы вывели формулу? Какой это раздел математики?

samana 30.08.2015 13:21

p.s. Формула работает в два раза быстрее цикла, проверил.

Bletraut 30.08.2015 15:10

PlutDem, прогрессии. Я не математик и не имею глубоких познаний в математике, поэтому объясню как умею, выводил я следующим образом:
Нужное нам число состоит из арифметической и геометрической прогрессии + исходное число.
d - коэффициент умножения, m - коэффициент сложения, a1 - первый член прогрессии (в нашем случае 0), an - n-ый член прогрессии.

Чтобы найти an для геометрической прогрессии воспользуемся формулой an = a1*d^(n-1), где n - номер нужного нам члена геометрической прогрессии.
В нашем случае прогрессия смешанная, чтобы увидеть закономерность, выведем формулу нескольких первых членов прогрессии.

Код:

1) a1 = 0
2) a2 = a1*d + m
3) a3 = a2*d + m = (a1*d + m)*d + m = a1*d^2 + d*m + m
4) a4 = a3*d + m = (a1*d^2 + d*m + m)*d = a1*d^3 + d^2*m + d*m + m

Разберем первую часть формулы. Нетрудно заметить, что это есть формула n-ого члена геометрической прогрессии, следовательно можем заменить данный кусок формулы на a1*d^(n-1)
Код:

2) a1*d
3) a1*d^2
4) a1*d^3

Далее разберем конец формулы, очевидно, что ничего не меняется, поэтому мы можем просто записать +m
Код:

2) + m
3) + m
4) + m

Теперь самое интересное, рассмотрим середину. Последовательность трудно заметить, поэтому выведем пятый член прогрессии:
Код:

a5 = a1*d^4 + d^3*m + d^2*m + d*m + m
, внимательно посмотрим на пятое выражение
Код:

d^3*m + d^2*m + d*m
, вынесем d*m за скобки и получим
Код:

d*m*(d^2 + d + 1)
. Можно заметить, что в скобках у нас получилась сумма членов геометрической прогрессии к которой прибавляется 1. Сумма членов геометрической прогрессии (k1, k2, k3, ...kn) вычисляется по формуле S = (k1*(1 - q^n))/ (1-q), для нашего случая k1 = q = d. Так же заметим, что степень нашей последовательности начинается n - 2. Поэтому середину формулы мы запишем как
Код:

d*m*(1 + (d*(1 - d^(n-2)))/(1-d))
Код:

2) 0
3) d*m
4) d^2*m + d*m
5) d^3*m + d^2*m + d*m

В итоге вся формула будет иметь вид
Код:

an = a1 * d^(n-1) + d * m * (1 + (d * (1 - d^(n - 2))) / (1 - d)) + m;


Часовой пояс GMT +4, время: 23:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.