Com base no que você disse: presumo que você precise otimizar para 50 variáveis; Suponho também que você esteja enfrentando uma situação em que é muito caro encontrar derivadas analíticas (muito menos obter números) e que sua otimização é irrestrita.
Deixe-me enfatizar, você é um pouco infeliz porque causa entre 25-30 e 100 variáveis; é um pouco de zona crepuscular quando se trata de escolher entre rotinas de otimização de grande ou pequena escala. Dito isto, porém, nada está perdido.
Dado que mesmo os derivativos de primeira ordem são caros para obter esse tipo, mata a idéia do método de Newton. Você pode ter alguma sorte com o Quasi-Newton (BFGS), mas se o seu Hessian é um pouco diagonal, gostaria de começar. O CG geralmente é um pouco mais lento que o BFGS; portanto, isso provavelmente não melhorará muito as coisas; use-o se a memória também for um problema (ou apenas escolha o L-BFGS nesse caso). Além disso, considerando o quão lento é avaliar sua função, um simples algoritmo de busca por descida / linha mais íngreme seria tortuosamente lento; o mesmo acontece com o Simulated Annealing e outras variantes de pesquisa aleatória (presumo que você não tenha acesso ao HMC e a todo esse jazz).
Portanto, quando você precisar do melhor retorno possível quando se trata de uma única avaliação de função: siga o método de Powell e também teste o COBYLA; apesar de ser um algoritmo de otimização restrito, porque ele aproximará linearmente o gradiente de sua função internamente para acelerar as coisas, ele poderá tirar proveito da linearidade de sua função. Também definitivamente tentar NLopt para Python . Eles têm muitos otimizadores sem gradiente; tente UOBYQA; é a ideia de Powell também (Otimização sem restrições por aproximações quadráticas).
Muito brevemente: Os algoritmos N-CG dependem da computação do Hessian, e seu Hessian parece muito caro para calcular. O NLCG e o BFGS não o exigem, embora possam tentar calculá-lo uma vez em sua primeira etapa.
Eu deixei de fora o algoritmo simplex de propósito porque é um animal totalmente diferente; nada a ver com gradientes como tal. Experimente, mas não posso realmente comentar sobre isso; é realmente dependente da natureza do seu problema.
Para uma primeira boa referência sobre otimização numérica, o livro Métodos Iterativos para Otimização do CTKelly o levará muito longe, muito bem.