我正在尝试使用sympy模块在python中构建约束优化计算器。这个想法是,用户可以输入两个函数“ f”和“ g”,然后将它们放在一起以形成等式“ L”。
我希望SymPy给我“ L”中x,y和lambda的偏导数,但是我的代码似乎不起作用。尝试获取其偏导数时,我得到以下结果:
0
0
-x-4 * y + 500
我使用x + 100 * y-y ** 2作为函数1和x + 4 * y-500和函数2。
到目前为止,这里的代码:
import sympy as sp
from sympy.parsing import sympy_parser
x, y = sp.symbols("x y", real=True)
lam = sp.symbols('lambda', real=True)
insert = input("Insert function 1:") #function 1
f = sympy_parser.parse_expr(insert) #transforming the function into a sympy expression
print(f)
insert2 = input("Insert function 2:") #function2
g = sympy_parser.parse_expr(insert2) #transforming function 2
L = f - lam*g #getting the equation "L"
xx = sp.diff(L, x) #partial derivative L'x
yy = sp.diff(L, y) #partial derivative L'y
ll = sp.diff(L, lam) #partial derivative L'lam
print(xx)
print(yy)
print(ll)
我已经尝试了“ parse_expr”和“ simpify”命令来将用户输入的函数从字符串转换为sympy表达式。我可能会想念其他东西。
答案 0 :(得分:0)
您的本地x
和y
是真实的,但是解析器返回的是原始的,没有假设。由于符号按名称和假设匹配,因此您的输入函数没有x
和y
:
>>> f.has(x)
False
所以不要使您的本地符号真实
>>> var('x')
x
>>> f = sympy_parser.parse_expr(insert)
>>> f.has(x)
True
或将您的本地符号传递给解析器,以便它可以使用它们来构建函数:
>>> f = sympy_parser.parse_expr(insert, dict(x=x,y=y))
>>> f.has(x)
True
一旦您使用相同的符号,其余的问题应移至新的水平:-)