Самый быстрый способ решить длинный полином с множеством различных степеней - PullRequest
5 голосов
/ 07 декабря 2011

Я ищу самое быстрое решение, х, для этого полиномиального уравнения:

Пусть m элемент из множества M.

сумма по всем m {a_m * x ^ (b_m) - c_m * x ^ (b_m - 1)} = 0, где a_m, b_m, c_m все разные для каждого m. Набор М имеет ~ 15-20 элементов.

Если решение> 4, оно вернется 4. Если решение <0, оно вернет 0. Какой самый быстрый способ сделать это? Делать это численно? </p>

Я бы предпочел решение на python и других языках, только если это очень выгодно для переключения.

Обратите внимание, что это производная от целевой функции. Я просто пытаюсь максимизировать целевую функцию, поэтому, если есть лучший способ сделать это, кроме решения этого полинома, это тоже сработает! Решение должно быть достаточно быстрым, поскольку я пытаюсь решить многие из этих целевых функций.

1 Ответ

2 голосов
/ 07 декабря 2011

Если вы ищете только один корень, а не все корни, вы можете использовать Метод Ньютона , который, как я ожидаю, будет достаточно быстрым для полиномов, которые вы описали.

let f (x) = сумма по всем m {a*x^(b) - c*x^(b-1)}

тогда f '(x), производная от f (x), является суммой по всем m {(a*b)*x^(b-1) - (c*(b-1))*x^(b-2)}.

def newton(f, fprime, firstguess, epsilon):
    x = firstguess
    while abs(f(x)) > epsilon:
        x = x - (f(x) / fprime(x))
    return x

Это вернет приблизительный корень к вашему полиному. Если он недостаточно точен, введите меньший эпсилон, пока он не станет достаточно точным.

Обратите внимание, что эта функция может расходиться и выполняться вечно, или может выдавать ошибку ZeroDivisionError. Обращаться с осторожностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...