簡體   English   中英

轉換與 Python 中另一個工具箱兼容的符號變量的 type()

[英]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)

這里要注意三件事:

  • 我無法在我的 PC 上安裝 dReal,所以我無法測試此代碼
  • 如何導入包真的很重要。 函數sincos都包含在這兩個包中,但這並不能保證所有函數。 此外,一些 sympy 函數的打印結果可能與 dReal 預期的不同,但這可以通過諸如from dreal import my_func as myFunc類的方法from dreal import my_func as myFunc補救
  • 對變量名要非常小心

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM