Как рассчитать выражение, используя sympy в Python - PullRequest
17 голосов
/ 10 августа 2011

Мне нужно вычислить выражение ниже, используя sympy в python?

exp = '(a+b)*40-(c-a)/0.5'

В a=6, b=5, c=2 в этом случае как вычислить выражение, используя sympy в python? Пожалуйста, помогите мне.

Ответы [ 5 ]

24 голосов
/ 10 августа 2011

Документация здесь: http://docs.sympy.org/. Вы действительно должны прочитать это!

Чтобы «вычислить» ваше выражение, напишите что-то вроде этого:

from sympy import Symbol
a = Symbol("a")
b = Symbol("b")
c = Symbol("c")
exp = (a+b)*40-(c-a)/0.5

И это все. Если вы имели в виду что-то еще под «вычислить», вы также можете решить exp = 0:

sympy.solve(exp)
> {a: [0.0476190476190476*c - 0.952380952380952*b],
>  b: [0.05*c - 1.05*a],
>  c: [20.0*b + 21.0*a]}

Для всего остального, вы действительно должны прочитать документы. Может быть, начать здесь: http://docs.sympy.org/0.7.1/tutorial.html#tutorial

ОБНОВЛЕНИЕ: поскольку вы добавили значения a, b, c к вопросу, вы можете добавить это к решению:

exp.evalf(subs={a:6, b:5, c:2})
13 голосов
/ 05 ноября 2012

Вы можете преобразовать вашу строку в выражение sympy, используя функцию parse_expr() в модуле sympy.parsing.sympy_parser.

>>> from sympy.abc import a, b, c
>>> from sympy.parsing.sympy_parser import parse_expr
>>> sympy_exp = parse_expr('(a+b)*40-(c-a)/0.5')
>>> sympy_exp.evalf(subs={a:6, b:5, c:2})
448.000000000000
7 голосов
/ 12 февраля 2013

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

# sympy.S is a shortcut to sympify
from sympy import S, Symbol

# load the string as an expression
expression = S('avar**2 + 3 * (anothervar / athirdvar)')

# get the symbols from the expression and convert to a list
# all_symbols = ['avar', 'anothervar', 'athirdvar']
all_symbols = [str(x) for x in expression.atoms(Symbol)]

# do something with the symbols to get them into a dictionary of values
# then we can find the result. e.g.
# symbol_vals = {'avar': 1, 'anothervar': 2, 'athirdvar': 99}
result = expression.subs(symbols_vals)
5 голосов
/ 10 августа 2011
>>> a, b, c = sympy.symbols('a b c')
>>> exp = (a + b) * 40 - (c - a) / 0.5
>>> exp.evalf(6, subs={a:6, b:5, c:2})
448.000
4 голосов
/ 10 августа 2011

Хорошо, я знаю, что eval - это зло , но если в вашей программе определены a, b и c, и вы можете быть уверены, что безопасно выполнить тестирование, не нужно сочувствовать.

>>> a=5
>>> b=5
>>> c=2
>>> exp = '(a+b)*40-(c-a)/0.5'
>>> eval(exp)
406.0
...