Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Непростая задачка по нахождению прогрессии (http://www.flasher.ru/forum/showthread.php?t=197331)

caseyryan 05.04.2013 15:15

[Решено] Непростая задачка по нахождению прогрессии
 
Тема во флейме, потому что ни под один другой раздел не подходит.

Нужна помощь, с нахождением формулы по которой высчитывается число
в общем, представим что есть целочисленная шкала от 1 до бесконечности. 1, 2, 3...
к каждому из этих делений привязано число. Точно известны некоторые числа:
1 -> 100
2 -> 110
3 -> 130
4 -> 150
15 -> 700
34 -> 10060
40 -> 23290
50 -> 94230
52 -> 124620
70 -> 1 542230
74 -> 2 697380


Нужна формула для вычисления остальных, если она тут вообще возможна. Уже всю голову сломал, но логическая цепочка обрывается на 70.

п.с. Не принципиально, чтобы получались именно такие числа. Но нужно чтобы что-то примерное. Примерно такая же прогрессия. Даже если к 70 числа будут отличаться от этих на 250 - 500 тысяч, это уже хорошо.

iflamberg 05.04.2013 15:48

Похоже на какую-то квадратичную функцию вида f(x) = a + bx^x. Кажется, в пакетах, типа mapple, matchcad, были возможности экстраполяции.

caseyryan 05.04.2013 15:50

Понятно, что похожа, но их полно. Нужна подходящая.

iflamberg 05.04.2013 16:15

Я ж говорю. Есть математические пакеты, которые умеют это делать. Куча методик в "численных методах", в зависимости от цели и желания заморачиваться: интерполяция, экстраполяция, аппроксимация, поиск минимальной функции.

Берем, скажем, вольфрам, и пробуем, скажем что-нибудь такое

Ну или берем карандаш в руки, делам предположение, что это ф-я определенного типа, строим систему уравнений, пытаемся ее решить.

caseyryan 05.04.2013 18:48

Не. Не вариант. Поробовал этот вольфрам. Никаких результатов. Тут даже цифры слишком большие, чтобы зрительно функцию нарисовать. Так что не выдал они ни графической функции (что естественно), ни формулы.
Цитата:

Ну или берем карандаш в руки, делам предположение, что это ф-я определенного типа, строим систему уравнений, пытаемся ее решить.
Да да, это как раз то, чем я занимаюсь уже несколько дней. И то, после чего и решил создать эту тему )

wvxvw 05.04.2013 19:53

Вложений: 1
Код:

function [Poly] = fitLevelDataToSecondLevelPoly ()
  xdata = [1, 2, 3, 4, 15, 34, 40, 50, 52, 70, 74];
  ydata = [100, 110, 130, 150, 700, 10060, 23290, 94230, 124620, 1542230, 2697380];
  order = 2;
  p = polyfit (xdata, ydata, order);
  x = linspace (min (xdata), max (xdata), 101);
  y = polyval (p, x);
  plot (x, y, '-', xdata, ydata, 's');
  legend ('Fitted polynomial', 'Level Data');
  ## 1.0220e+03 * x^2 + -4.7642e+04 * x + 1.7550e+05
  Poly = p;
endfunction

function [Poly] = fitLevelDataToFourthLevelPoly ()
  xdata = [1, 2, 3, 4, 15, 34, 40, 50, 52, 70, 74];
  ydata = [100, 110, 130, 150, 700, 10060, 23290, 94230, 124620, 1542230, 2697380];
  order = 4;
  p = polyfit (xdata, ydata, order);
  x = linspace (min (xdata), max (xdata), 101);
  y = polyval (p, x);
  plot (x, y, '-', xdata, ydata, 's');
  legend ('Fitted polynomial', 'Level Data');
  ## 8.2722e-01 * x^4 + -9.3058e+01 * x^3  3.3344e+03 * x^2 + -3.8139e+04 * x + 7.2091e+04
  Poly = p;
endfunction

function [Poly] = fitLevelDataToEighthLevelPoly ()
  xdata = [1, 2, 3, 4, 15, 34, 40, 50, 52, 70, 74];
  ydata = [100, 110, 130, 150, 700, 10060, 23290, 94230, 124620, 1542230, 2697380];
  order = 8;
  p = polyfit (xdata, ydata, order);
  x = linspace (min (xdata), max (xdata), 101);
  y = polyval (p, x);
  plot (x, y, '-', xdata, ydata, 's');
  legend ('Fitted polynomial', 'Level Data');
  ## 9.2922e-08 * x^8 + -2.0911e-05 * x^7 +  1.9908e-03 * x^6 + -1.0071e-01 * x^5 +
  ## 2.8741e+00 * x^4 + -4.4839e+01 * x^3 + 3.4286e+02 * x^2 + -9.5543e+02 * x +
  ## 8.3935e+02
  Poly = p;
endfunction

Вот что можно получить, если делать аппроксимацию разной степени полиномами.
Проблема в том, что последнее значение "вываливается" из общей тенденции...

Вложение 29358

caseyryan 05.04.2013 22:44

Цитата:

Проблема в том, что последнее значение "вываливается" из общей тенденции...
wvxvw, да у меня тоже на 70 точке получалось не то, что до этого. Такое впечатление, что после 70 нужно все значения на 2 делить

п.с. Вообще, график очень похож на ease out expo графики в твин движках. Надо попробовать их задействовать.

wvxvw 06.04.2013 03:10

Так а чего, разве последняя функция не подошла? Я просто надеялся, что более коротким полиномом можно будет обойтись, но полином восьмой степени вроде как очень даже крсивую кривую нарисовал.

caseyryan 06.04.2013 09:43

Цитата:

Так а чего, разве последняя функция не подошла?
Мне бы ее привести в более подходящий для меня вид. Я что-то не врубаюсь..
Нужно передать в нее "контрольную точку", скажем 35, а на выходе получить соответствующее ей второе число. Это возможно?

wvxvw 06.04.2013 17:14

Код:

y = 9.2922e-08 * x^8 + -2.0911e-05 * x^7 + 1.9908e-03 * x^6 + -1.0071e-01 * x^5 +
    2.8741e+00 * x^4 + -4.4839e+01 * x^3 + 3.4286e+02 * x^2 + -9.5543e+02 * x +
    8.3935e+02

Т.е. Х в восьмой умножить на 9.2922e-08 плюс Х в седьмой умножить на -2.0911e-05 ... и т.д.

caseyryan 06.04.2013 17:38

wvxvw, премного благодарен :)
Протестировал, получается почти то, что нужно. А так как мне не принципиально точное совпадение, этот вариант отлично подходит

Добавлено через 5 минут
А нет.. блин, не совсем правильно работает
Сделал это на ас3:
Код AS3:

private function getValue(x:Number):int {
                        return 9.2922e-08 * Math.pow(x, 8) + -2.0911e-05 * Math.pow(x, 7) + 1.9908e-03 * Math.pow(x, 6) + -1.0071e-01 * Math.pow(x, 5) +
                        2.8741e+00 * Math.pow(x, 4) + -4.4839e+01 * Math.pow(x, 3) + 3.4286e+02 * Math.pow(x, 2) + -9.5543e+02 * x +
                        8.3935e+02;
                }

В результате получается так:
Код AS3:

trace(getValue(16)); // 604
trace(getValue(8)); // 1133
trace(getValue(10)); // 1193
trace(getValue(20)); // 770

т.е. для чисел меньше, иногда выдает больший результат

wvxvw 06.04.2013 18:31

Ну тогда, наверное, имеет смысл задать значения для теоретически минимальных и максимальных входных параметров функции.

Да, и посчитать все Х полинома можно было бы за один проход, типа:
Код:

var result:Array = new Array(8);
var i:uint = 8;
var lastResult = x;
while (i--) {
    result[i] = lastResult * x;
    lastResult = result[i];
}

;)

А, прошу прощения, я сразу не понял, что случилось. ОК... надо думать.
Что-то ничего типа b + c^x хорошего не придумывается. Показатель степени растет как-то непонятно: быстрее чем log(x), но медленнее чем x, но быстрее чем x/log(x)...

caseyryan 07.04.2013 20:07

Код AS3:

package 
{
        import flash.display.Sprite;
 
        public class Main extends Sprite {
 
                private var _health:int = 100;
 
                public function Main() {
                        for (var i:int = 1; i < 75; i++) {
                                getValue();
                                trace("HEALTH", _health, "LEVEL", i);
                        }
                }
 
                private function getValue():void {
                        _health += (int(_health / 97) * 15.19);
                }       
        }
}

Вот таким образом числа получаются близкими к этим. Но добиться чтобы последнее число было кратным 10 не получается

Если изменить на
Код AS3:

_health += int((int(_health / 97) * 15.19) / 10) * 10;

То результаты уже будут совсем не близкими

Добавлено через 10 минут
В общем, после кучи экспериментов с подстановкой чисел, пришел к такому алгоритму:
Код AS3:

private function getValue():void {
        _health += Math.round((int(_health / 100) * 15.1) / 10) * 10;
}

Результат его работы такой:
Код:

HEALTH 120 LEVEL 1
HEALTH 140 LEVEL 2
HEALTH 160 LEVEL 3
HEALTH 180 LEVEL 4
HEALTH 200 LEVEL 5
HEALTH 230 LEVEL 6
HEALTH 260 LEVEL 7
HEALTH 290 LEVEL 8
HEALTH 320 LEVEL 9
HEALTH 370 LEVEL 10
HEALTH 420 LEVEL 11
HEALTH 480 LEVEL 12
HEALTH 540 LEVEL 13
HEALTH 620 LEVEL 14
HEALTH 710 LEVEL 15
HEALTH 820 LEVEL 16
HEALTH 940 LEVEL 17
HEALTH 1080 LEVEL 18
HEALTH 1230 LEVEL 19
HEALTH 1410 LEVEL 20
HEALTH 1620 LEVEL 21
HEALTH 1860 LEVEL 22
HEALTH 2130 LEVEL 23
HEALTH 2450 LEVEL 24
HEALTH 2810 LEVEL 25
HEALTH 3230 LEVEL 26
HEALTH 3710 LEVEL 27
HEALTH 4270 LEVEL 28
HEALTH 4900 LEVEL 29
HEALTH 5640 LEVEL 30
HEALTH 6490 LEVEL 31
HEALTH 7460 LEVEL 32
HEALTH 8580 LEVEL 33
HEALTH 9860 LEVEL 34
HEALTH 11340 LEVEL 35
HEALTH 13050 LEVEL 36
HEALTH 15010 LEVEL 37
HEALTH 17280 LEVEL 38
HEALTH 19880 LEVEL 39
HEALTH 22870 LEVEL 40
HEALTH 26310 LEVEL 41
HEALTH 30280 LEVEL 42
HEALTH 34840 LEVEL 43
HEALTH 40090 LEVEL 44
HEALTH 46130 LEVEL 45
HEALTH 53090 LEVEL 46
HEALTH 61090 LEVEL 47
HEALTH 70300 LEVEL 48
HEALTH 80920 LEVEL 49
HEALTH 93140 LEVEL 50
HEALTH 107200 LEVEL 51
HEALTH 123390 LEVEL 52
HEALTH 142010 LEVEL 53
HEALTH 163450 LEVEL 54
HEALTH 188120 LEVEL 55
HEALTH 216520 LEVEL 56
HEALTH 249210 LEVEL 57
HEALTH 286840 LEVEL 58
HEALTH 330150 LEVEL 59
HEALTH 380000 LEVEL 60
HEALTH 437380 LEVEL 61
HEALTH 503410 LEVEL 62
HEALTH 579420 LEVEL 63
HEALTH 666910 LEVEL 64
HEALTH 767610 LEVEL 65
HEALTH 883520 LEVEL 66
HEALTH 1016930 LEVEL 67
HEALTH 1170480 LEVEL 68
HEALTH 1347210 LEVEL 69
HEALTH 1550640 LEVEL 70
HEALTH 1784780 LEVEL 71
HEALTH 2054270 LEVEL 72
HEALTH 2364450 LEVEL 73
HEALTH 2721470 LEVEL 74

Что меня вполне устраивает =)

Вопрос исчерпан, всем спасибо за участие! :)

GBee 08.04.2013 00:02

:D Теперь я знаю почему Фобос-грунт упал.

caseyryan 08.04.2013 08:26

:D придется тебя убить, раз уж тайна раскрыта

iNils 08.04.2013 14:58

В начале...
Цитата:

Сообщение от caseyryan (Сообщение 1128394)
Тема во флейме, потому что ни под один другой раздел не подходит.

Потом...
Цитата:

Сообщение от caseyryan (Сообщение 1128519)
Сделал это на ас3:

А теперь читаем описание раздела флейм, самую нижнею строчку.
Цитата:

Флейм (просматривают: 5)
Раздел для болтовни и выпуска пара.
Алгоритмы и программирование обсуждаются в разделах AS 1/2, AS 3 и тп.


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

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