這個問題可能與:
Python Sympy 解決回傳串列與字典
或者
參考的字典鍵是絕對必須的嗎?
我有這個 Sympy 代碼,這是我對 SymPy 庫的第一次嘗試:
import sympy as sym
from sympy.parsing.sympy_parser import parse_expr
from sympy import symbols, Eq, solve
class FunZ:
def __init__(self, f):
self.x, self.y = sym.symbols('x y')
self.f = parse_expr(f)
# print('f : ', self.f)
def evalu(self, xx, yy):
return float(self.f.subs({self.x: xx, self.y: yy}).evalf())
def derX(self, xx, yy):
self.dx = sym.diff(self.f, self.x)
# print('dx : ', self.dx)
return float(self.dx.subs({self.x: xx, self.y: yy}).evalf())
def derY(self, xx, yy):
self.dy = sym.diff(self.f, self.y)
# print('dy :', self.dy)
return float(self.dy.subs({self.x: xx, self.y: yy}).evalf())
def derXY(self, xx, yy):
return [float(self.derX(xx, yy)), float(self.derY(xx, yy))]
def minim(self):
self.dx = sym.diff(self.f, self.x)
self.dy = sym.diff(self.f, self.y)
print('dx : ', self.dx)
print('dy : ', self.dy)
eq1 = Eq(self.dx ,0)
eq2 = Eq(self.dy ,0)
solu = solve((eq1,eq2), (self.x, self.y), dict = False) #### HERE dict = False
print(solu, type(solu))
return solu
funz = FunZ('x**2 y**2 2*y 2')
dict_min = funz.minim()
print(dict_min, type(dict_min))
for keys in dict_min:
print('key : ', keys, 'value : ', dict_min[keys])
print('values :' , dict_min.values())
# print(dict_min[x]) ###### ---> NameError: name 'x' is not defined
print(dict_min['x']) ####### -----> KeyError: 'x'
我的輸出看起來像:
dx : 2*x
dy : 2*y 2
{x: 0, y: -1} <class 'dict'>
{x: 0, y: -1} <class 'dict'>
key : x value : 0
key : y value : -1
values : dict_values([0, -1])
Traceback (most recent call last):
File .....", line 88, in <module>
print(dict_min['x']) ####### -----> KeyError: 'x'
KeyError: 'x'
或者
print(dict_min[x]) ###### ---> NameError: name 'x' is not defined
NameError: name 'x' is not defined
我可以用print('values :' , list(dict_min.values()))--->得到 x, yvalues : [0, -1]
如果我將標志 dict 設定為 True in solu = solve((eq1,eq2), (self.x, self.y), dict = True),我會得到[{x: 0, y: -1}] <class 'list'>結果
知道發生了什么嗎?它與我如何定義 Funz 課程有關嗎?結果對我來說似乎是合理的,但是這個 dict 東西讓我發瘋。
uj5u.com熱心網友回復:
您無法訪問 viadict_min[x]或dict_min["x"]因為x型別為sympy.core.symbol.Symbol。此 dict 的鍵型別為sympy.core.symbol.Symbol。
dict_min[x]不起作用,因為x您的代碼中沒有定義變數。
dict_min["x"]不起作用,因為您在這里定義x為 a string,但命名為xin的鍵dict_min的型別為sympy.core.symbol.Symbol。
你的課沒有問題。
但是,您可以這樣做:
dict_min[funz.x]
或者:
x = funz.x
dict_min[x]
所以,sympydict_min并不是一個奇怪的dict型別,它是一個經典的 Python dict,它的鍵型別是sympy.core.symbol.Symbol。鍵是方程的符號。也許這很令人困惑,因為您的符號x和y是在您的類和通過sym.symbols('x y').
如果你想總是得到一個list:
在 中minim,您應該設定dict=True而不是False。通過這樣做,您將“始終獲得解決方案映射串列”(https://docs.sympy.org/latest/modules/solvers/solvers.html)。是的,目標dict=True是確保回傳的變數是 型別list 。我同意這看起來有點奇怪。
來自solve()源代碼的關于這個標志的一些資訊:https : //github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py#L406
這是標志的效果is_dict:https : //github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py#L1249
至于同情1.9。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373905.html
