Python - решить полином для вас - PullRequest
4 голосов
/ 09 декабря 2010

Я беру в функцию (например, у = х ** 2) и нужно найти для х. Я знаю, что могу кропотливо решить эту проблему вручную, но вместо этого я пытаюсь найти метод для использования. Я просмотрел nupy, scipy и sympy, но не могу найти то, что я ищу. В настоящее время я делаю лямбда-функцию из функции, поэтому было бы хорошо, если бы я смог сохранить этот формат для метода, но не обязательно.

Спасибо!

Ответы [ 3 ]

10 голосов
/ 09 декабря 2010

Если вы ищете числовые решения (то есть просто интересуетесь числами, а не символическими решениями в замкнутой форме), то в модуле SciPy.optimize есть несколько вариантов.Для чего-то простого, newton - довольно хорошее начало для простых многочленов, но вы можете взять его оттуда.

Для символических решений (то есть получить y = x** 2 -> x = +/- sqrt (y)) SymPy решатель дает вам примерно то, что вам нужно.Весь пакет SymPy направлен на символьные манипуляции.

Вот пример использования интерпретатора Python для решения уравнения, которое упоминается в вопросе.Вам необходимо убедиться, что пакет SymPy установлен, а затем:

>>>> from sympy import * # we are importing everything for ease of use
>>>> x = Symbol("x")
>>>> y = Symbol("y")     # create the two variables
>>>> equation = Eq(x ** 2, y) # create the equation
>>>> solve(equation, x)
[y**(1/2), -y**(1/2)]

Как видите, основы достаточно работоспособны даже в виде интерактивной алгебраической системы.Не так хорошо, как Mathematica , но опять же, это бесплатно, и вы можете включить его в свои собственные программы.Обязательно прочитайте раздел Gotchas and Pitfalls документации SymPy о том, как кодировать соответствующие уравнения.

Если все это было для быстрого и грязного решенияк уравнениям то всегда есть Wolfram Alpha .

4 голосов
/ 09 декабря 2010

Используйте Ньютона-Рафсона через scipy.optimize.newton . Он находит корни уравнения, т. Е. Значения x , для которых f ( x ) = 0. В примере вы можете привести задачу к поиску корня функции f ( x ) = x & sup2; - y . Если вы предоставляете лямбду, которая вычисляет y , вы можете предоставить общее решение следующим образом:

def inverse(f, f_prime=None):
    def solve(y):
        return newton(lambda x: f(x) - y, 1, f_prime, (), 1E-10, 1E6)
    return solve

Использовать эту функцию довольно просто:

>>> sqrt = inverse(lambda x: x**2)
>>> sqrt(2)
1.4142135623730951
>>> import math
>>> math.sqrt(2)
1.4142135623730951

В зависимости от функции входа может потребоваться настроить параметры на newton(). Текущая версия использует начальное предположение 1, допуск 10 -10 и максимальное число итераций 10 6 .

Для дополнительного ускорения вы можете указать производную функции:

>>> sqrt = inverse(lambda x: x**2, lambda x: 2*x)

Фактически, без нее функция фактически использует секущий метод вместо Ньютона-Рафсона, который полагается на знание производной.

3 голосов
/ 09 декабря 2010

Ознакомьтесь с SymPy, а именно с решателем .

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