[英]Converting type() of a symbolic variable that is compatible with another toolbox in Python
對於我的作業,我使用了兩個 SMT 求解器,z3 和 dReal。 雖然我通過引入變量作為符號變量 (sympy) 在 z3 中進行計算,但是,dReal 需要它自己的自定義變量類型,稱為“dreal._dreal_py.Variable”。
from dreal import *
s=Variable('x')
type(s)
結果是
dreal._dreal_py.Variable
我有一個非常長的 SymPy 表達式,其中包含涉及多個變量的三角項,例如:
from sympy import *
x=symbols('x')
y=symbols('y')
z=symbols('z')
P=sin(x-y)+x**2+y**3+sin(y-z)
type(P)
輸出: sympy.core.add.Add
我必須將此作為條件添加到 dReal 求解器。
cond=And(x < 3, 4 < x, y < 3, 4 < y, 0 < z, 0 < P)
但是,由於 dReal 不接受符號變量類型,因此會出現以下錯誤:
unsupported operand type(s) for -: 'Add' and 'dreal._dreal_py.Expression'
我需要知道如何將一種任意符號數據類型轉換為任何其他類型,以便我可以直接使用長表達式作為求解器的輸入。 如果沒有,我的問題有什么可能的解決方法?
提前致謝
作為一種解決方法,嘗試將字符串作為代碼進行評估:
import sympy as sy #don't import any functions, that could cover up dreal's
from dreal import * #need to import everything from dreal
s_x=sy.symbols('x')
s_y=sy.symbols('y')
s_z=sy.symbols('z')
P=sy.sin(s_x-s_y)+s_x**2+s_y**3+sy.sin(s_y-s_z)
x = Variable('x')
y = Variable('y')
z = Variable('z')
#Here, the magic happens
reP = eval(str(P))
cond=And(x < 3, 4 < x, y < 3, 4 < y, 0 < z, 0 < reP)
這里要注意三件事:
sin
和cos
都包含在這兩個包中,但這並不能保證所有函數。 此外,一些 sympy 函數的打印結果可能與 dReal 預期的不同,但這可以通過諸如from dreal import my_func as myFunc
類的方法from dreal import my_func as myFunc
補救
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.