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

Я пытаюсь решить уравнение в Python, используя SymPy.У меня есть сгенерированное уравнение (что-то вроде function = y(8.0-(y**3.0)), которое я использую с SymPy для создания нового уравнения, подобного этому: eq = sympy.Eq(function, 2), которое выводит y(8.0-(y**3.0)) == 2. Но sympy.solve(eq), похоже, не работает.

>>> from sympy import Eq, Symbol as sym, solve
>>> y = sym('y')
>>> eqa = Eq(y(8.0-(y**3.0)), 8)
>>> solve(eqa)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/sympy/solvers/solvers.py", line 332, in solve
    result = tsolve(f, *symbols)
  File "/usr/lib/pymodules/python2.6/sympy/solvers/solvers.py", line 716, in tsolve
    raise NotImplementedError("Unable to solve the equation.")
NotImplementedError: Unable to solve the equation.

спасибо за чтение.

Ответы [ 5 ]

9 голосов
/ 15 декабря 2010

У вас нелинейное уравнение ... Так что вы можете использовать optimize.fsolve для него.Для получения более подробной информации ищите функцию в этом уроке scipy

8 голосов
/ 26 февраля 2011

(Я не знаю, почему вы упоминаете scipy в своем вопросе, когда вы используете sympy в своем коде. Я предполагаю, что вы используете sympy.)

Sympy может решить это уравнение, если указать целое числопитание для y (то есть y**3.0 изменено на y**3).

Следующее работает для меня, используя Sympy 0.6.7.

from sympy import Eq, Symbol, solve

y = Symbol('y')
eqn = Eq(y*(8.0 - y**3), 8.0)

print solve(eqn)
3 голосов
/ 28 июня 2013

Если вы имеете в виду, что пытались использовать sympy, а не scipy, то вы можете получить Sympy (работает с v0.7.2 +), чтобы решить его, внеся небольшую корректировку в способ определения уравнения - вам просто нужнопоместите оператор умножения (*) между первыми 'y' и '('. Не имеет значения, указали ли вы мощность как число с плавающей запятой или нет (но, возможно, это потребовалось в 0.6.7).

from sympy import Eq, var, solve
var('y')    
eq = Eq(y*(8.0-(y**3.0)), 8)
solve(eq)
2 голосов
/ 06 октября 2011

Для нелинейных уравнений вы должны использовать sympy.solvers.nsolve для численного решения, за исключением некоторых особых случаев, когда может существовать более конкретный и подходящий решатель (например, tsolve).

Например, следующеескрипт должен вывести 1.2667664310254.

from sympy import Symbol
from sympy.solvers import nsolve
from sympy import sin, tan

theta = Symbol('theta')
print nsolve(tan(theta)/(1+1*sin(theta)) - 4.0**2/9.81, theta, (1.2,))
0 голосов
/ 15 декабря 2010

Это нелинейное уравнение. Вам нужно найти алгоритм поиска корней в SciPy.

...