Ajuda com uma conversão

6 respostas
Polimorphism

Olá a todos. Me desculpe por postar novamente questões de matemática, mas no caso é urgente para o sistema de pontuação no projeto no qual participo.

Sendo S a força do jogador e sendo R a sua pontuação, esta é a fórmula para calcular a força a partir da pontuação:

private static double convertToStrength(double rating){
    return = Math.pow(9, ( rating / 600 )) * rating;
}

Presciso criar um método para saber a pontuação a partir da força:

private static double convertToRating(double strength){
    return ( ? )
}

Muito obrigado!

6 Respostas

rogelgarcia

Essa fórmula é cabulosa… :shock:

Tente procurar também em fóruns de matemática… porque essa tá complicado…

Polimorphism

Consegui a fórmula:

private static double convertToRating(double strength){ return ( 300 / Math.log(3) ) * lambertW( strength * Math.log(3) / 300 ); }

Mas agora eu presciso da Função Lambert`s W como um método java. Algu;ém pode me ajudar?

rogelgarcia

Cara, ques negócios cabulosos… com o que vc trabalha? ou estuda?

Parece que no próprio site do wikipedia… tem um algoritmo com essa fórmula… num serve nao?

Polimorphism

Me ofereci para criar um sistema de pontuação para um jogo online, Age of Conquest. ( Queria treinar minha lógica com alguma coisa que não prescisasse de muito conhecimento em java. Embora meio dificil, não se prescisa de conhecimentos avançados em java para se fazer. ) Primeiro criei uma variante do Sistema ELO ( Utilizado em Xadrez e em Go ), para que permita jogos com mais de duas pessoas, so que depois fiquei sabendo que a pontuação não poderia ser negativa. Daí saiu esses códigos estranhos q vc viu… :XD:

E sim, tem um código na wikipedia e nem tinha percebido. vlw :smiley: Vou testar se eu tiver algum problema eu posto

E

O código, convertido para Java:

class Lambert {
    public static double estimateLambertW (double x) {
        if (x == 0) return 0;
        if (x == Math.E) return 1;
        if (x <= 500.0) {
            double lx1 = Math.log1p (x);
            return 0.665 * (1 + 0.0195 * lx1) * lx1 + 0.04;
        } 
        double lnx = Math.log (x);
        return Math.log(x - 4.0) - (1.0 - 1.0/lnx) * Math.log(lnx);
    }
    public static double lambertW (double x, double prec, int maxiters) {
        double w = x >= 0 ? estimateLambertW (x) : 0;
        for (int i = 0; i < maxiters; ++i) {
            double expW = Math.exp (w);
            double we = w * expW;
            double w1e = we + expW;
            if (prec > Math.abs ((x - we) / w1e))
                return w;
            w -= (we - x) / (w1e - (w + 2.0) * (we - x) / (2 * w + 2));
        }
        throw new RuntimeException (String.format ("W doesn't converge fast enough for x = %f", x));
    }
    public static void main (String[] args) {
        // Expected: 0.5671432904097838729999686622
        // Prints:   0.5671432904097047
        System.out.println (lambertW (1.0, 1E-12, 100));
        // Expected: -1
        // Prints: -0.9999999942251854
        System.out.println (lambertW (-1.0 / Math.E, 1E-12, 100));
        // Expected: 0.8526055020137255
        // Prints:   0.8526055020136265
        System.out.println (lambertW (2.0, 1E-12, 100));
    }
}
Polimorphism
from math import exp
 
def lambertW(x, prec=1E-12, maxiters=100):
    w = 0    
 
    for i in range(maxiters):
        we = w * exp(w)
        w1e = (w + 1) * exp(w)
 
        if prec &gt; abs((x - we) / w1e):
            return w
 
        w -= (we - x) / (w1e - (w + 2) * (we - x) / (2*w + 2))
 
    raise ValueError("W doesn't converge fast enough for abs(z) = %f" % abs(x))

Presciso converter isso (Phyton) para java. A aproximação é facil de converter porém não é suficientemente acurada.

Edit: Muito obrigado! Vc já postou a conversão antes de eu pedir :slight_smile:

Criado 3 de março de 2010
Ultima resposta 4 de mar. de 2010
Respostas 6
Participantes 3