Сразу хочу дать пояснение--на теннис я не ставил, не ставлю и ставить не собираюсь...в теннисе ни ХУ не понимаю...но я буду говорить языком цифр..надеюсь не напрасно.
Причиной и поводом открыть данную тему явилось мнение,--- что народ находится в полном непонимании того о чём воЩе речь, куда и что намазывать и откуда слизывать..... все высказывания практически ни чем не подкрепляются за редким исключением и то эти исключения ни коим образом не могут повлиять на составляющие части кошелька....
Думаю что тема будет интересна не только попанам(вроде меня), но и видавшим виды и в анфас и в профиль.....
Начнём-с с основного (постулата) ---все выкладки и выражения и прочее будут относиться к одной из ветвей развития событий.
Что бы соединить две ветви триггера нам потребуется применять одну и туже концепцию-формулу и так для любых событий (и ставок).
На чём основан постулат? дело в том что при моделировании событий теннисного матча и сравнивая эти данные с реальными показателями я пришёл к выводу что матч нельзя представить таким образом как его преподносят многие публикации (в основном буржуйские на тему моделирования)..в чём собственно подвох...разберёмся на простом конкретном примере....
Примем себе на вооружение модель следующего толка---пусть геймы и сеты уже прошедшие не влияют на ход дальнейших событий...
(так конечно можно принять с натягом, но иного мы пока не имеем и такая модель в виду того что ХЗ как там что на чё влияет вполне будет уместна для старта). Таким образом наша модель будет--цепью Маркова.
Для некоторых вероятностей есть аналитические выражения но я их не буду приводить ибо они очень громозские и тока в основном на гейм---дело в том что например для 5-ти сетового матча нам придётся расписывать ХЗ скока вариантов окончания каждого сета и сочетать с другими..... и нах это надо---намного проще пойти колхозным путём и генерить 10000-20000 матчей а потом тупо считать частоты (ну они будут немного плавать около среднего но для оценок может вполне покатить...)....Будем считать что расчёт у нас есть.
Для расчёта по такой модели (ну тут уже были темы на форуме на эту тему поэтому можно там подсмотреть что-то) нам надо Р взять очко со своей подачи для игрока 1 и Р взять очко для игр2.
Теперь пока предположим что мы располагаем набором этих Р (вероятностей).
Начнём-с с функции листа ехсель определяющей вин матча и распределение и тотал.(напоминаю---это для одной ветви триггера)
теперь ОСНОВА ОСНОВ ТРИГГЕРНОЙ КОНЦЕПЦИИ.
матч может срельнуть в два состояния---вин или лоз вероятность реализации того или иного состояния мы априорно можем оценить
ну тупо вот так в данных по прецедентам 0.6(60%) вин 0.4 (40%) лоз так вот у каждого такого состояния будут свои средние по Р-взять очко для игрока 1 и для игрока 2 (пока на этом не будем заострять внимание---в смысле --как определить...это отдельный базар-вокзал)..
Так вот ВСЁ (подчёркиваю все --и тоталы и моталы и вины и хуи..) всё считаем по одной хрени
Ртригер_вин*Рсобытия ветвь вин+(1-Ртригер_вин)*Рсобытия ветвь лоз.
Пока ни ХУ не понятно но далее поясню на конкретных примерах.
=Tns(A9;B9;C9;D9;tb;mark1;0;J9;E9;F9;G9;H9)
A9-вероятность игрока1 выиграть гейм со своей подачи (нужны для расч. Сета)
B9-вер. Иг.2 выиграть гейм при своей подаче
C9-вероятность для игр.1 взять очко со своей подачи (по ней можно рассчитать Р в яч A9)
D9-вероятность для игр.2 взять очко со своей подачи (по ней можно рассчитать Р в яч В9)
tb- маркер тай-брейка (1—с тай-бр. 0-без тай-бр.)
mark1-маркер подачи в сете (1-ПОДАЧА 1-ГО ИГР. 0-ПОДАЧА ВТОРОГО)
0-маркер генератора жеребьёвки 1-ой подачи (не используется…генератор не встроен в функцию)
J9-число сетов (3 или 5 можно указать и непосредственно в функции как числа)
E9-текущий счёт по сетам для игр.1( это счёт матча типа 1-1 2-1-уже вин и так не может для 3-ёх сетового, например )
F9-тек. счёт по сетам для игр.2
G9-текущий счёт в сете по геймам для игрока.1 (типа 5-4)
H9 тек. счёт в сете для игр.2
mtb,mark1 вводим в какие-то яч excel и указываем адреса в функции
=FGeim(C9;0;0)—функция нахождения вероятности выигрыша гейма при своей подаче
C9-вероятность взять очко со своей подачи (с первой подачи). Можно вводить значение Р непосредственно в функию =FGeim(0,68;0;0)
0-счёт игр 1
0-счёт игр.2 (так понятнее =FGeim(C9;s1;s2) например FGeim(C9;0;0) вставляем в яч A9 для передачи потом в функцию Tns)
В ячейку B9 соответственно вставим FGeim(D9;0;0).
Теперь этих инструментов достаточно для нахождения вероятности вин. матча (или сета) с любой точки счёта по счёту в матче, сета и гейма. Вопрос—как? Чтоб понять надо посмотреть и разобраться в работе
=FGeim. Мы передаём вероятность для игрока 1 которому соответствует счёт гейма s1 (причём счёт условно 1,2,3…по числу выигрышей итд, а не как принято в теннисе 15-0 30-….итд)
Тогда для игрока 2 для вычисления вероятности вин. гейм со своей подачи (кроме счёта 0-0 …то есть счёт не открыт) есть два варианта найти Р2вин.гейм
1.Вставить вероятность Р2 взять очко с подачи и поменять счёт в функции местами FGeim(Р2;s2;s1)
2.Вставить в функцию FGeim вместо вероятности Р2 вер. 1-Р2 (это вероятность для первого игрока взять гейм при подаче второго игрока). Полученное значение вычесть из 1
Формула так будет выглядеть Р2вин.гейм =1- FGeim(1-Р2;s1;s2)Теперь надо понять алгоритм позволяющий найти вероятность при любом счёте в игре.
Для этого воспользуемся куском(звеном) цепи Маркова. Предположим у нас идёт какой-то
Гейм и там счёт s1:s2 в матче по сетам m1- m2 а в сете st1-st2
Тогда одна функция=Tns(A9;B9;C9;D9;1;1;0;J9;m1;m2;st1;st2) нам не даёт ответа на наш вопрос.
Пусть счёт гейма s1:s2 сета a:b при подаче игрока 1 (или 2) имеем расчётную вероятность выиграть
гейм Pwin_i пусть для определённости будем всегда искать вероятность для игр.1 (ибо для второго она
1- Pwin_1 для всех раскладов). Тогда возможны переходы в счёт a+1:b или в a:b+1 при этом
в a+1:b игрок 1 переходит при своей подаче с Pwin_1= FGeim(P1;s1;s2) в a:b+1 с вероятностью 1-Pwin_1.
Рассматривая такое звено Марковской цепи приходим к выражению для вероятности P1 win math
8]P1 win math =Pwin1* Tns(…….a+1:b ) + (1- Pwin1)* Tns(…….a +1:b )
8]Где для Tns выставляем mark1=в соответствии с игроком начавшим подавать в сете
8](1—для игрока 1 и 0--- для игр2) Если имеем распределения то складываем их сообразно данной формулы.
8]Если подаёт игрок 2 то для игрока 1(для которого и будем считать) Pwin_1= FGeim(1-P2;s1;s2) где P2 –вер. взять очко со своей подачи для игр.2
Function Gen(ByVal P As Double, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim Pg, t As Double
Pg = P
t = Rnd()
t = Rnd()
If t <= Pg Then
Gen = 1
Else
Gen = 0
End If
End Function
Function Tns(ByRef rp1st As Range, ByRef rp2st As Range, ByRef rp1g As Range, ByRef rp2g As Range, ByRef Mmarktb As Range _
, ByRef Vmark_1 As Range, ByVal Mmarkmany As Integer, ByRef Mnst As Range, ByRef fshm1 As Range, ByRef fshm2 As Range _
, ByRef fshst1 As Range, ByRef fshst2 As Range, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim Rasp(13) As Single
Dim m1, m2, st1, st2, marktb, mark1, markmany, G, n, ws1, ws2 As Integer
Dim i, j, k, sumws1, sumws2, g1, g2 As Long
Dim Pp1st, Pp2st, Pp1g, Pp2g, shm1, shm2, shst1, shst2, z, nst, mtb As Variant
Dim Pwin1, Pwin2, p1g, p2g, p1st, p2st, tb_0, tb_1, summRasp As Single
Set Pp1st = rp1st
Set Pp2st = rp2st
Set Pp1g = rp1g
Set Pp2g = rp2g
markmany = Mmarkmany
Set nst = Mnst
Set shm1 = fshm1
Set shm2 = fshm2
Set shst1 = fshst1
Set shst2 = fshst2
Set z = Vmark_1
Set mtb = Mmarktb
p1g = Pp1g.Value
p2g = Pp2g.Value
tb_0 = 0
tb_1 = 0
If nst.Value = 3 Then
n = 2
Else
n = 3
End If
marktb = mtb.Value
summRasp = 0
For j = 0 To 13
Rasp(j) = 0
Next j
For k = 1 To 25000 Step 1
mark1 = z.Value
m1 = shm1.Value
m2 = shm2.Value
st1 = shst1.Value
st2 = shst2.Value
ws1 = m1
ws2 = m2
Do Until (ws1 = n And ws2 < n) Or (ws2 = n And ws1 < n)
If mark1 = 1 Then
p1st = Pp1st.Value
p2st = Pp2st.Value
ElseIf mark1 = 0 Then
p1st = 1 - Pp2st.Value
p2st = 1 - Pp1st.Value
End If
If marktb = 0 Then 'без тай-брейка
Do Until (st1 >= 6 And st1 - st2 >= 2) Or (st2 >= 6 And st2 - st1 >= 2)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
If st1 = 6 And st2 = 0 Then
Rasp(1) = Rasp(1) + 1
ElseIf st1 = 6 And st2 = 1 Then
Rasp(2) = Rasp(2) + 1
ElseIf st1 = 6 And st2 = 2 Then
Rasp(3) = Rasp(3) + 1
ElseIf st1 = 6 And st2 = 3 Then
Rasp(4) = Rasp(4) + 1
ElseIf st1 = 6 And st2 = 4 Then
Rasp(5) = Rasp(5) + 1
ElseIf st1 = 7 And st2 = 5 Then
Rasp(6) = Rasp(6) + 1
ElseIf st1 = 6 And st2 = 6 Then
Rasp(7) = Rasp(7) + 1
ElseIf st1 = 5 And st2 = 7 Then
Rasp(8) = Rasp(8) + 1
ElseIf st1 = 4 And st2 = 6 Then
Rasp(9) = Rasp(9) + 1
ElseIf st1 = 3 And st2 = 6 Then
Rasp(10) = Rasp(10) + 1
ElseIf st1 = 2 And st2 = 6 Then
Rasp(11) = Rasp(11) + 1
ElseIf st1 = 1 And st2 = 6 Then
Rasp(12) = Rasp(12) + 1
ElseIf st1 = 0 And st2 = 6 Then
Rasp(13) = Rasp(13) + 1
End If
Loop
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
ElseIf mark1 = 0 And Not (i Mod 2 = 0) Then
mark1 = 1
End If
st1 = 0
st2 = 0
End If
If marktb = 0 Then GoTo M 'с тай-брейком
Do Until (st1 = 6 And st1 - st2 >= 2) Or (st2 = 6 And st2 - st1 >= 2) Or (st1 = 6 And st2 = 6) Or (st1 = 7 And st2 = 5) Or (st2 = 7 And st1 = 5)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
Loop
If st1 = 6 And st2 = 0 Then
Rasp(1) = Rasp(1) + 1
ElseIf st1 = 6 And st2 = 1 Then
Rasp(2) = Rasp(2) + 1
ElseIf st1 = 6 And st2 = 2 Then
Rasp(3) = Rasp(3) + 1
ElseIf st1 = 6 And st2 = 3 Then
Rasp(4) = Rasp(4) + 1
ElseIf st1 = 6 And st2 = 4 Then
Rasp(5) = Rasp(5) + 1
ElseIf st1 = 7 And st2 = 5 Then
Rasp(6) = Rasp(6) + 1
ElseIf st1 = 6 And st2 = 6 Then
Rasp(7) = Rasp(7) + 1
ElseIf st1 = 5 And st2 = 7 Then
Rasp(8) = Rasp(8) + 1
ElseIf st1 = 4 And st2 = 6 Then
Rasp(9) = Rasp(9) + 1
ElseIf st1 = 3 And st2 = 6 Then
Rasp(10) = Rasp(10) + 1
ElseIf st1 = 2 And st2 = 6 Then
Rasp(11) = Rasp(11) + 1
ElseIf st1 = 1 And st2 = 6 Then
Rasp(12) = Rasp(12) + 1
ElseIf st1 = 0 And st2 = 6 Then
Rasp(13) = Rasp(13) + 1
End If
If Not (st1 = 6 And st2 = 6) Then
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
ElseIf st2 >= 6 And st2 - st1 >= 2 Then
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
Else
mark1 = 1
End If
st1 = 0
st2 = 0
End If
If Not (st1 = 6 And st2 = 6) Then GoTo M
'тай-брейк
tb_1 = tb_1 + 1
g1 = 0
g2 = 0
If mark1 = 1 Then
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
Else
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
End If
If mark1 = 1 Then
Do
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 0
Else
Do
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 1
End If
If g1 > g2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
st1 = 0
st2 = 0
M: Loop
If ws1 > ws2 Then
sumws1 = sumws1 + 1
Else
sumws2 = sumws2 + 1
End If
Next k
Pwin1 = sumws1 / 25000
Rasp(0) = Pwin1
For j = 1 To 13
Rasp(j) = Rasp(j) / 25000
Next j
For j = 1 To 13
summRasp = summRasp + Rasp(j)
Next j
For j = 1 To 13
Rasp(j) = Rasp(j) / summRasp
Next j
Tns = Rasp
End Function
Function FGeim(ByVal Pi As Double, ByVal si As Double, ByVal sj As Double, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim P, s1, s2, win1 As Double
Dim j As Long
P = Pi
For j = 1 To 50000
s1 = si
s2 = sj
Do Until (s1 >= 4 And s1 - s2 >= 2) Or (s2 >= 4 And s2 - s1 >= 2)
G = Gen(P)
s1 = s1 + G
s2 = s2 + 1 - G
Loop
If s1 > s2 Then
win1 = win1 + 1
End If
Next j
FGeim = win1 / 50000
End Function
Function FGeim_Rasp(ByVal Pi As Double, ByVal si As Double, ByVal sj As Double, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim Rasp(11) As Single
Dim P, s1, s2, win1 As Double
Dim j As Long
P = Pi
For j = 0 To 11
Rasp(j) = 0
Next j
For j = 1 To 50000
s1 = si
s2 = sj
Do Until (s1 >= 4 And s1 - s2 >= 2) Or (s2 >= 4 And s2 - s1 >= 2)
G = Gen(P)
s1 = s1 + G
s2 = s2 + 1 - G
Loop
If s1 > s2 Then
win1 = win1 + 1
End If
If s1 = 4 And s2 = 0 Then
Rasp(1) = Rasp(1) + 1
ElseIf s1 = 4 And s2 = 1 Then
Rasp(2) = Rasp(2) + 1
ElseIf s1 = 4 And s2 = 2 Then
Rasp(3) = Rasp(3) + 1
ElseIf s1 = 5 And s2 = 3 Then
Rasp(4) = Rasp(4) + 1
ElseIf s1 = 6 And s2 = 4 Then
Rasp(5) = Rasp(5) + 1
ElseIf s1 >= 5 And s2 >= 5 Then
Rasp(6) = Rasp(6) + 1
ElseIf s1 = 4 And s2 = 6 Then
Rasp(7) = Rasp(7) + 1
ElseIf s1 = 3 And s2 = 5 Then
Rasp(8) = Rasp(8) + 1
ElseIf s1 = 2 And s2 = 4 Then
Rasp(9) = Rasp(9) + 1
ElseIf s1 = 1 And s2 = 4 Then
Rasp(10) = Rasp(10) + 1
ElseIf s1 = 0 And s2 = 4 Then
Rasp(11) = Rasp(11) + 1
End If
Next j
Rasp(0) = win1 / 50000
For j = 1 To 11
Rasp(j) = Rasp(j) / 50000
Next j
FGeim_Rasp = Rasp
End Function
Function FPP(ByVal P As Single, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim i As Integer
Dim Pg, f As Single
Pg = P
f = 0.5
For i = 1 To 100
f = 0.5 * (Pg * (1 + 2 * f ^ 2) - f ^ 4 * ((15 - 4 * f) * (1 - 2 * f * (1 - f)) - 10 * f ^ 2)) / Pg
Next i
FPP = f
End Function
Приближённая формула определения вероятности выиграть гейм со своей подачи при известной Р взять очко со своей подачи.
Pwin_geim = p^4*( 15-4*p-10*p^2/(1-2*p*(1-p)) )
Но нам надо уметь находить и обратную функцию p=F(Pwin_geim) это может например понадобиться
Для проверки адекватности модели по экспериментальным данным или попыток вычислить вероятность взять очко через частоты вин-лоз гейма со своей подачи через какие-то кучи данных итд итп.
Воспользуемся принципом сжатых отображений и перепишем равенство в виде
p(i+1) = 0.5 * (Pwin_geim * (1 + 2 * pi ^ 2) - pi ^ 4 * ((15 - 4 * pi) * (1 - 2 * pi* (1 - pi)) - 10 * pi ^ 2)) / Pwin_geim
таким образом начав итерационный процесс с некоторого значения p (можно взять его равным 0,5)
мы будем вычислять каждое новое значение вероятности на основании значения предыдущего значения p.
Функцию можно сделать например так ( встроенную в excel)
Function FPP(ByVal P As Single, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim i As Integer
Dim Pg, f As Single
Pg = P
f = 0.5
For i = 1 To 100
f = 0.5 * (Pg * (1 + 2 * f ^ 2) - f ^ 4 * ((15 - 4 * f) * (1 - 2 * f * (1 - f)) - 10 * f ^ 2)) / Pg
Next i
FPP = f
End Function
Примеры ввода данных
Если мы указали для m1,m2,st1,st2 нули то естественно мы получим вероятность выигрыша матча . а если m1=1 m2=1 то если сетов 3 в матче получим вероятность выиграть сет.
Допустим Вам интересно кто выиграет тай-брейк (или кто победит при счёте в сете 6-6 (или поровну))
Тогда m1=1,m2=1,st=61,st2=6 получим соответствующую Р для вин. тай-брейка….и так далее ….
Всё получаем для игрока1 (которому соответствуют параметры m1 , st1) маркер первой подачи надо установить по первой подаче текущего сета (а когда неизвестно то можно менять маркер (mark1) с1 на 0 или с 0 на 1).
=Tns(A9;B9;C9;D9;tb;mark1;0;J9;E9;F9;G9;H9)
Вводится сразу в 14 ячеек листа как функция ТРАНСП() так как Tns возвращает массив.
Будет так в окне {=Tns(A9;B9;C9;D9;tb;mark1;0;J9;E9;F9;G9;H9)}
Если нам потребуется разнести частоты распределения 6-6 по тайбреку (или условно тай-бр—когда по 6-6 и играется до перевеса в 2 очка) то мы можем поступить так
Взять частоту 6-6 в распределении и найти вероятность для первого игрока выиграть ситуацию
отражённую в функции {Tns(A9;B9;C9;D9;K9;I9;0;J9;E9;F9;G9;H9)}, где в функцию передано
m1=1 m2=1 st1=6 st2=6 (ячейки E9;F9;G9;H9) тогда частоты разнесутся согласно
f66* Tns ---для игрока 1 и f66*(1-Tns)---для игрока 2
функция {=FGeim_Rasp(W34;P29;Q29)} возвращает вероятность вин.гейм и распределение
4-0 4-1 4-2 5-3 6-4 s1&s2>=5 4-6 3-5 2-4 1-4 0-4
Можно при желании имея распределение по экспериментальным данным найти парамтр
Вероятности взять очко при своей подачи не только по обратной функции FPP а используя
инструмент «поиск решения» (или свой алгоритм оптимизации) –для этого находим сумму
квадратов разности исходного(экспериментального) и распред. функции FGeim_Rasp.
Число итераций в цикле уменьшаем до 10000 и можно добавить условие для поиска Р_очко
0<=Р_очко<=1 (по сути надо два условия забить в поиск 0<=Р_очко и Р_очко<=1 )
Функция аналогичная Tns но возвращающая ещё и вероятность тотала геймов в матче
{=Tns_tot(A9;B9;C9;D9;K9;I9;0;J9;E9;F9;G9;H9;A7;B7)}
A7-значение текущего тотала при выставленном счёте в функции;B7—тотал букмекера.
Функция возвращает вероятность появления события ТОТ матча меньше значения в B7
В ячейки A9;B9 можно ввести приближённое аналитическое выражение для вероятности win
гейм при своей подаче (описывается формулой Ргейма =C9^4*(15-4*C9-10*C9^2/(1-2*C9*(1-C9)))
C9—вероятность взятия очка. (для B9 по аналогии)
Могут пригодится формулы для вероятности выиграть матч при известной вероятности выиграть сет.
Для 3-ёх сетового матча Pwin_match = p^2*(1+2*(1-p))
Для 5-ти сетового матча Pwin_match =p^3*(1+3*(1-p)+6*(1-p)^2)
Раскрыв скобки получим компоненты по вероятности 2-0 2-1 1-2 0-2 (для 5-ти сетов по аналогии).
Допустим 2-0 Р= p^2 (для 3-ёх сетового)
Function Tns_tot(ByRef rp1st As Range, ByRef rp2st As Range, ByRef rp1g As Range, ByRef rp2g As Range, ByRef Mmarktb As Range _
, ByRef Vmark_1 As Range, ByVal Mmarkmany As Integer, ByRef Mnst As Range, ByRef fshm1 As Range, ByRef fshm2 As Range _
, ByRef fshst1 As Range, ByRef fshst2 As Range, ByRef Tec_tot As Range, ByRef TOT_Buk As Range, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim Rasp(14) As Single
Dim m1, m2, st1, st2, marktb, mark1, markmany, G, n, ws1, ws2 As Integer
Dim i, j, k, sumws1, sumws2, g1, g2 As Long
Dim Pp1st, Pp2st, Pp1g, Pp2g, shm1, shm2, shst1, shst2, z, nst, mtb As Variant
Dim Pwin1, Pwin2, p1g, p2g, p1st, p2st, tb_0, tb_1, summRasp, Tt, Tb, summtot, t_if As Single
Set Pp1st = rp1st
Set Pp2st = rp2st
Set Pp1g = rp1g
Set Pp2g = rp2g
Set Tc_tot = Tec_tot
Set T_buk = TOT_Buk
Tt = Tc_tot.Value
Tb = T_buk.Value
t_if = 0
markmany = Mmarkmany
Set nst = Mnst
Set shm1 = fshm1
Set shm2 = fshm2
Set shst1 = fshst1
Set shst2 = fshst2
Set z = Vmark_1
Set mtb = Mmarktb
p1g = Pp1g.Value
p2g = Pp2g.Value
tb_0 = 0
tb_1 = 0
If nst.Value = 3 Then
n = 2
Else
n = 3
End If
marktb = mtb.Value
summRasp = 0
For j = 0 To 14
Rasp(j) = 0
Next j
For k = 1 To 25000 Step 1
mark1 = z.Value
m1 = shm1.Value
m2 = shm2.Value
st1 = shst1.Value
st2 = shst2.Value
ws1 = m1
ws2 = m2
summtot = 0
Do Until (ws1 = n And ws2 < n) Or (ws2 = n And ws1 < n)
If mark1 = 1 Then
p1st = Pp1st.Value
p2st = Pp2st.Value
ElseIf mark1 = 0 Then
p1st = 1 - Pp2st.Value
p2st = 1 - Pp1st.Value
End If
If marktb = 0 Then 'без тай-брейка
Do Until (st1 >= 6 And st1 - st2 >= 2) Or (st2 >= 6 And st2 - st1 >= 2)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
If st1 = 6 And st2 = 0 Then
Rasp(1) = Rasp(1) + 1
ElseIf st1 = 6 And st2 = 1 Then
Rasp(2) = Rasp(2) + 1
ElseIf st1 = 6 And st2 = 2 Then
Rasp(3) = Rasp(3) + 1
ElseIf st1 = 6 And st2 = 3 Then
Rasp(4) = Rasp(4) + 1
ElseIf st1 = 6 And st2 = 4 Then
Rasp(5) = Rasp(5) + 1
ElseIf st1 = 7 And st2 = 5 Then
Rasp(6) = Rasp(6) + 1
ElseIf st1 = 6 And st2 = 6 Then
Rasp(7) = Rasp(7) + 1
ElseIf st1 = 5 And st2 = 7 Then
Rasp(8) = Rasp(8) + 1
ElseIf st1 = 4 And st2 = 6 Then
Rasp(9) = Rasp(9) + 1
ElseIf st1 = 3 And st2 = 6 Then
Rasp(10) = Rasp(10) + 1
ElseIf st1 = 2 And st2 = 6 Then
Rasp(11) = Rasp(11) + 1
ElseIf st1 = 1 And st2 = 6 Then
Rasp(12) = Rasp(12) + 1
ElseIf st1 = 0 And st2 = 6 Then
Rasp(13) = Rasp(13) + 1
End If
Loop
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
ElseIf mark1 = 0 And Not (i Mod 2 = 0) Then
mark1 = 1
End If
If st1 >= 6 And st2 >= 6 Then
summtot = summtot + 13
Else
summtot = summtot + st1 + st2
End If
st1 = 0
st2 = 0
End If
If marktb = 0 Then GoTo M 'с тай-брейком
Do Until (st1 = 6 And st1 - st2 >= 2) Or (st2 = 6 And st2 - st1 >= 2) Or (st1 = 6 And st2 = 6) Or (st1 = 7 And st2 = 5) Or (st2 = 7 And st1 = 5)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
Loop
If st1 = 6 And st2 = 0 Then
Rasp(1) = Rasp(1) + 1
ElseIf st1 = 6 And st2 = 1 Then
Rasp(2) = Rasp(2) + 1
ElseIf st1 = 6 And st2 = 2 Then
Rasp(3) = Rasp(3) + 1
ElseIf st1 = 6 And st2 = 3 Then
Rasp(4) = Rasp(4) + 1
ElseIf st1 = 6 And st2 = 4 Then
Rasp(5) = Rasp(5) + 1
ElseIf st1 = 7 And st2 = 5 Then
Rasp(6) = Rasp(6) + 1
ElseIf st1 = 6 And st2 = 6 Then
Rasp(7) = Rasp(7) + 1
ElseIf st1 = 5 And st2 = 7 Then
Rasp(8) = Rasp(8) + 1
ElseIf st1 = 4 And st2 = 6 Then
Rasp(9) = Rasp(9) + 1
ElseIf st1 = 3 And st2 = 6 Then
Rasp(10) = Rasp(10) + 1
ElseIf st1 = 2 And st2 = 6 Then
Rasp(11) = Rasp(11) + 1
ElseIf st1 = 1 And st2 = 6 Then
Rasp(12) = Rasp(12) + 1
ElseIf st1 = 0 And st2 = 6 Then
Rasp(13) = Rasp(13) + 1
End If
If Not (st1 = 6 And st2 = 6) Then
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
ElseIf st2 >= 6 And st2 - st1 >= 2 Then
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
Else
mark1 = 1
End If
If st1 = 6 And st2 = 6 Then
summtot = summtot + 13
Else
summtot = summtot + st1 + st2
End If
st1 = 0
st2 = 0
End If
If Not (st1 = 6 And st2 = 6) Then GoTo M
'тай-брейк
tb_1 = tb_1 + 1
g1 = 0
g2 = 0
If mark1 = 1 Then
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
Else
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
End If
If mark1 = 1 Then
Do
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 0
Else
Do
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 1
End If
If g1 > g2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
st1 = 0
st2 = 0
M: Loop
If ws1 > ws2 Then
sumws1 = sumws1 + 1
Else
sumws2 = sumws2 + 1
End If
If summtot + Tt < Tb Then
t_if = t_if + 1
End If
Next k
Pwin1 = sumws1 / 25000
Rasp(0) = Pwin1
Rasp(14) = t_if / 25000
For j = 1 To 13
Rasp(j) = Rasp(j) / 25000
Next j
For j = 1 To 13
summRasp = summRasp + Rasp(j)
Next j
For j = 1 To 13
Rasp(j) = Rasp(j) / summRasp
Next j
Tns_tot = Rasp
End Function
Обратные функции для расчёта вероятности выиграть сет при известной вероятности win.матч
Function FOBR_5(ByVal P As Single, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim i As Integer
Dim Pg, f, A, Y1, Y2, Y3 As Single
Pg = P
f = 0.5
A = 0.05
For i = 1 To 200
Y1 = 10 * f ^ 3 + 6 * f ^ 5 - 15 * f ^ 4 - Pg
Y2 = 10 * (f + A) ^ 3 + 6 * (f + A) ^ 5 - 15 * (f + A) ^ 4 - Pg
Y3 = 10 * (f - A) ^ 3 + 6 * (f - A) ^ 5 - 15 * (f - A) ^ 4 - Pg
If (Abs(Y1) < Abs(Y2)) And (Abs(Y1) < Abs(Y3)) Then
f = f
A = A / 5
ElseIf (Abs(Y2) < Abs(Y1)) And (Abs(Y2) < Abs(Y3)) Then
f = f + A
Else
f = f - A
End If
Next i
FOBR_5 = f
End Function
Function FOBR_3(ByVal P As Single, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim i As Integer
Dim Pg, f, A, Y1, Y2, Y3 As Single
Pg = P
f = 0.5
A = 0.05
For i = 1 To 200
Y1 = 3 * f ^ 2 - 2 * f ^ 3 - Pg
Y2 = 3 * (f + A) ^ 2 - 2 * (f + A) ^ 3 - Pg
Y3 = 3 * (f - A) ^ 2 - 2 * (f - A) ^ 3 - Pg
If (Abs(Y1) < Abs(Y2)) And (Abs(Y1) < Abs(Y3)) Then
f = f
A = A / 5
ElseIf (Abs(Y2) < Abs(Y1)) And (Abs(Y2) < Abs(Y3)) Then
f = f + A
Else
f = f - A
End If
Next i
FOBR_3 = f
End Function
Обратная функция для обоих случаев FOB_3_5(вероятность ; число сетов) число сетов вводится в ячейку excel
Function FOB_3_5(ByVal P As Single, ByRef Mn As Range, Optional VolatileOn As Boolean = True) As Variant
Application.Volatile VolatileOn
Dim i, nset As Integer
Dim Pg, f, A, Y1, Y2, Y3 As Single
Pg = P
f = 0.5
A = 0.05
Set n = Mn
nset = n.Value
For i = 1 To 200
If nset = 3 Then
Y1 = 3 * f ^ 2 - 2 * f ^ 3 - Pg
Y2 = 3 * (f + A) ^ 2 - 2 * (f + A) ^ 3 - Pg
Y3 = 3 * (f - A) ^ 2 - 2 * (f - A) ^ 3 - Pg
Else
Y1 = 10 * f ^ 3 + 6 * f ^ 5 - 15 * f ^ 4 - Pg
Y2 = 10 * (f + A) ^ 3 + 6 * (f + A) ^ 5 - 15 * (f + A) ^ 4 - Pg
Y3 = 10 * (f - A) ^ 3 + 6 * (f - A) ^ 5 - 15 * (f - A) ^ 4 - Pg
End If
If (Abs(Y1) < Abs(Y2)) And (Abs(Y1) < Abs(Y3)) Then
f = f
A = A / 5
ElseIf (Abs(Y2) < Abs(Y1)) And (Abs(Y2) < Abs(Y3)) Then
f = f + A
Else
f = f - A
End If
Next i
FOB_3_5 = f
End Function
ПРОДОЛЖЕНИЕ СЛЕДУЕТ