如何解决我如何评估 sympy 字典中的字符串
嗨,对于这段代码,有没有办法评估 sol 字典中的答案而不是一长串数学方程?当我尝试通过字典键 sol[i][x]
访问答案时。它只是给我 x 的关键错误。因此,我无法以这种方式对其进行评估。有没有其他方法可以解决这个问题?
这是我的确切代码:
@app.route('/simult',methods = ['GET',"POST"])
def simult():
sign1 = ""
sign2 = ""
if os.path.exists("data.json"):
with open("data.json") as datafile:
saveddata = json.load(datafile)
if request.method == "POST":
saveddata["x1"] = request.form["x1"]
saveddata["y1"] = request.form["y1"]
saveddata["x2"] = request.form["x2"]
saveddata["y2"] = request.form["y2"]
saveddata["px1"] = request.form["px1"]
saveddata["py1"] = request.form["py1"]
saveddata["px2"] = request.form["px2"]
saveddata["py2"] = request.form["py2"]
saveddata["sign1"] = request.form["sign1"]
saveddata["sign2"] = request.form["sign2"]
saveddata["ans1"] = request.form["ans1"]
saveddata["ans2"] = request.form["ans2"]
if saveddata["sign1"] == "":
sign1 = ""
if saveddata["sign1"] == "+":
sign1 = '+'
if saveddata["sign1"] == "-":
sign1 = '-'
if saveddata["sign1"] == "x":
sign1 = '*'
if saveddata["sign1"] == "^":
sign1 = "**"
if saveddata["sign1"] == "/":
sign1 = "/"
if saveddata["sign2"] == "":
sign2 = ""
if saveddata["sign2"] == "+":
sign2 = '+'
if saveddata["sign2"] == "-":
sign2 = '-'
if saveddata["sign2"] == "x":
sign2 = '*'
if saveddata["sign2"] == "^":
sign2 = "**"
if saveddata["sign2"] == "/":
sign2 = "/"
saveddata["sign1"] = sign1
saveddata["sign2"] = sign2
with open("data.json","w") as datafile:
json.dump(saveddata,datafile)
return render_template("Simaltaenous.html")
@app.route("/res",methods=['GET','POST'])
def res():
if os.path.exists("data.json"):
with open("data.json") as datafile:
saveddata = json.load(datafile)
final_lst = []
final1 = str(saveddata["x1"]) + "x**" + str(saveddata["px1"]) + " " + str(saveddata["sign1"]) + " " + str(saveddata["y1"]) + "y**" + str(saveddata["py1"]) + " = " + str(saveddata["ans1"])
final2 = str(saveddata["x2"]) + "x**" + str(saveddata["px2"]) + " " + str(saveddata["sign2"]) + " " + str(saveddata["y2"]) + "y**" + str(saveddata["py2"]) + " = " + str(saveddata["ans2"])
final_lst.append(final1)
final_lst.append(final2)
x,y = symbols('x,y')
transformations=(standard_transformations + (implicit_multiplication_application,))
eqs_sympy = [Eq(parse_expr(e.split('=')[0],transformations=transformations),parse_expr(e.split('=')[1],transformations=transformations)) for e in final_lst]
sol = solve(eqs_sympy,dict = True)
final_ans = []
final_dct = {}
for i in range(len(sol)):
ansx = eval(str(sol[i]['x']))
ansy = eval(str(sol[i]['y']))
final_dct["x"] = ansx
final_dct["y"] = ansy
final_ans.append(final_dct)
final_dct = {}
return render_template("res.html",sol = final_ans)
解决方法
使用您的原始代码:
In [45]: from sympy.parsing.sympy_parser import parse_expr,standard_transformations,implicit_multiplication_application
...:
In [46]: eqs = ['2w + x + 4y + 3z = 5',...: 'w - 2x + 3z = 3',...: '3w + 2x - y + z = -1',...: '4x - 5z = -3']
...: transformations=(standard_transformations + (implicit_multiplication_ap
...: plication,))
...: eqs_sympy = [Eq(parse_expr(e.split('=')[0],transformations=transformat
...: ions),...: parse_expr(e.split('=')[1],transformations=transformat
...: ions))
...: for e in eqs]
...: sol = solve(eqs_sympy)
In [47]: sol
Out[47]:
⎧ 94 74 -53 ⎫
⎨w: ──,x: -20/9,y: ──,z: ────⎬
⎩ 45 45 45 ⎭
Out[49]: dict_keys([w,x,y,z])
我在尝试使用 NameError
时没有得到 sol[w]
,因为我的 isympy
会话已经定义了 w
之类的变量,但我犯了关键错误。 keys
是符号,由 eqs
字符串创建。
我可以通过迭代键来获取值
In [52]: for i in sol.keys():
...: print(sol[i])
...:
94/45
-20/9
74/45
-53/45
甚至使用标准的 dict
方法:
In [53]: sol.values()
Out[53]: dict_values([94/45,-20/9,74/45,-53/45])
In [54]: list(sol.values())
Out[54]:
⎡94 74 -53 ⎤
⎢──,──,────⎥
⎣45 45 45 ⎦
In [55]: sol.items()
Out[55]: dict_items([(w,94/45),(x,-20/9),(y,74/45),(z,-53/45)])
我可以从 eqs_sympy
中提取这些符号:
In [71]: eqs_sympy
Out[71]:
[2⋅w + x + 4⋅y + 3⋅z = 5,w - 2⋅x + 3⋅z = 3,3⋅w + 2⋅x - y + z = -1,4⋅x - 5⋅z = -3]
In [72]: eqs_sympy[0]
Out[72]: 2⋅w + x + 4⋅y + 3⋅z = 5
In [73]: eqs_sympy[0].args[0].free_symbols
Out[73]: {w,z}
In [74]: tuple(eqs_sympy[0].args[0].free_symbols)
Out[74]: (x,z,w,y)
In [75]: x,y=tuple(eqs_sympy[0].args[0].free_symbols)
In [76]: sol[x]
Out[76]: -20/9
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。