Вы можете использовать решатель нелинейных уравнений, такой как fsolve
.
fsolve
найдет значение x
для уравнения f(x) == 0
.
Таким образом, вы можете создать функцию f(x)
и запустить fsolve
:
opp_ratings = [1200 1400 1350];
tot_score = 1.5
f = @(x) sum(1./(1+10.^((opp_ratings-x)/400)))-tot_score;
res = fsolve(f,0) %the second argument is the initial point x0
% res = 1317.6
Заметил, что я линеаризовал ваш цикл for, используя операторы .^
(поэлементный оператор мощности) и ./
(поэлементное деление).Теперь стало проще определять однострочное уравнение f(x)
.
Кроме того, это деталь, но для улучшения производительности fsolve (уменьшения необходимого количества итераций) вы можете, например, установить начальноеЗначение x0 равно «среднему рейтингу ELO», скажем, 1000. Таким образом, fsolve(f,1000)
будет статистически сходиться быстрее.
Не рекомендуется:
Если ваше уравнение не могло бытьлинеаризованный, вы действительно могли бы написать f(x)
так:
f = @(x) sum(arrayfun(@(opp_ratings) (1/(1+10^((opp_ratings-x)/400))),opp_ratings))-tot_score
используя arrayfun.Но по возможности избегайте этого решения (потому что оно уродливо и немного медленнее).