2016-11-24 2 views
8

documentation on nonlinsolve дает этот пример:Поскольку пример в документации не работает, как я могу решить нелинейную систему уравнений численно в SymPy?

from sympy.core.symbol import symbols 
from sympy.solvers.solveset import nonlinsolve 
x, y, z = symbols('x, y, z', real=True) 
nonlinsolve([x*y - 1, 4*x**2 + y**2 - 5], [x, y]) 
{(-1, -1), (-1/2, -2), (1/2, 2), (1, 1)} 

, но даже в живой оболочке на своем сайте, что выдает ошибку:

>>> from sympy.solvers.solveset import nonlinsolve 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ImportError: cannot import name nonlinsolve 

Как я могу использовать nonlinsolve решить систему уравнений численно? Я знаю, что могу использовать ufuncify для преобразования уравнений в систему, которую может решить scipy.optimize.fsolve, но я бы предпочел избежать этих двух строк шаблона и просто использовать SymPy напрямую.

В соответствии с SymPy documentation on solve использование solve не рекомендуется. Для нелинейных систем уравнений документация рекомендует sympy.solvers.solveset.nonlinsolve, что я и пытаюсь использовать здесь.

+0

использовать 'sympy.solve ([x * y - 1, 4 * x ** 2 + y ** 2 - 5], [x, y])' – Stelios

+1

@Stelios Согласно документации Sympy, [используя ' solve' не рекомендуется] (http://docs.sympy.org/dev/modules/solvers/solvers.html). Я добавлю это заявление к моему вопросу. –

+0

Документы, возможно, немного агрессивны в этом отношении.solveset действительно заменит решение, но все же есть случаи, когда это необходимо, например, нелинейные системы. – asmeurer

ответ

3

Похоже, что этот модуль не включен в разряд 1.0.0, но доступен только в текущих head. Во всяком случае, может быть хорошей идеей проверить текущее состояние репо sympy, поскольку их выпуски довольно редки.

Согласно docs, это так просто, как

git clone git://github.com/sympy/sympy.git 
cd sympy 
sudo python setupegg.py develop 

(я должен был использовать python3 вместо python, как у меня есть и Python 2 и Python 3 общесистемные установки. Кроме того, возможно, можно использовать virtualenv чтобы избежать sudo.)

После этого последняя версия github будет доступна с обычным import.

import sympy 
print(sympy.__version__) 
# 1.0.1.dev 

Теперь пример работы:

from sympy.core.symbol import symbols 
from sympy.solvers.solveset import nonlinsolve 
x, y, z = symbols('x, y, z', real=True) 
nonlinsolve([x*y - 1, 4*x**2 + y**2 - 5], [x, y]) 
# {(-1, -1), (-1/2, -2), (1/2, 2), (1, 1)} 

P.S. Если вас действительно интересует numeric решение вашего уравнения, кажется, что вам понравится ufuncify + fsolve. SymPy - система компьютерной алгебры, поэтому nonlinsolve сделает все возможное, чтобы решить нелинейную систему аналитически, а не численно. И, конечно, он может потерпеть неудачу (как и с любыми аналитическими решателей):

nonlinsolve([x**5 + x**2 + 1], [x]) 
# {(CRootOf(x**5 + x**2 + 1, 0),), (CRootOf(x**5 + x**2 + 1, 1),), (CRootOf(x**5 + x**2 + 1, 2),), (CRootOf(x**5 + x**2 + 1, 3),), (CRootOf(x**5 + x**2 + 1, 4),)} 
+0

Для пользователей Windows перейдите на страницу https://github.com/sympy/sympy, загрузите zip, разверните его в удобной новой папке, CD внутри папки, содержащей setup.py, а затем выполните 'python setup.py install' , Приготовьтесь к длительному ожиданию, пока этот процесс ударит и перемалывает свой путь к выводу. Затем проверьте, что вы можете «импортировать sympy» и что 'sympy .__ version__' - это то, что вы ожидали. –

6

Если вы хотите, чтобы решить систему численно, использовать nsolve. Это требует первоначального предположения для решения (есть также много вариантов, которые вы можете передать, чтобы использовать разные решатели, см. http://docs.sympy.org/latest/modules/solvers/solvers.html#sympy.solvers.solvers.nsolve и http://mpmath.org/doc/current/calculus/optimization.html).

In [1]: nsolve([x*y - 1, 4*x**2 + y**2 - 5], [x, y], [1, 1]) 
Out[1]: 
matrix(
[['1.0'], 
['1.0']]) 

Для символьных решений, я бы рекомендовал использовать старую solve, пока nonlinsolve не созревает.

Смежные вопросы