如何在线使用Z3 SMT-LIB解决运算放大器的问题

Jua*_*ina 6 z3 z3py

之前的文章中,使用Z3Py在线解决了涉及运算放大器的一些问题.但是现在Z3Py在线无法使用我试图在线使用Z3 SMT-LIB来解决这些问题.

例1:

在以下电路中找到R的值

在此输入图像描述

使用以下代码解决此问题:

(declare-const R Real)
(declare-const V1 Real)
(declare-const V2 Real)
(declare-const Vo Real)
(declare-const I1 Real)
(declare-const I2 Real)
(declare-const g Real)
(assert (= (/ V1 (+ R -50)) I1))
(assert (= (/ V2 (+ R  10)) I2))
(assert (= (* (* R (+ I1 I2)) -1) g))
(assert (= Vo g))
(assert (= Vo -2))
(assert (= V1 1))
(assert (= V2 0.5))
(assert (> R 0))
(assert (> R 50))
(check-sat)
(get-model)
Run Code Online (Sandbox Code Playgroud)

相应的输出是:

sat 
(model (define-fun R () Real (root-obj (+ (^ x 2) (* (- 130) x) (- 2000)) 2)) 
       (define-fun I1 () Real (root-obj (+ (* 6000 (^ x 2)) (* 30 x) (- 1)) 2)) 
       (define-fun I2 () Real (root-obj (+ (* 2400 (^ x 2)) (* 300 x) (- 1)) 2)) 
       (define-fun V2 () Real (/ 1.0 2.0)) 
       (define-fun V1 () Real 1.0) 
       (define-fun Vo () Real (- 2.0)) 
       (define-fun g () Real (- 2.0)) )
Run Code Online (Sandbox Code Playgroud)

在此处在线运行此示例

如您所见,Z3的输出是x上的二次方程.然后问题是:如何使用Z3解决这样的等式?

Leo*_*ura 8

输出包含三个代数数字.例如,R被赋予多项式的第二个根/零x^2 - 130 x - 2000.这是多项式零的无理数的精确表示.可能很难解释.因此,我们也可以要求Z3使用十进制表示法显示结果.

(set-option :pp-decimal true)
Run Code Online (Sandbox Code Playgroud)

Z3将附加一个?来表示输出被截断. 以下是此选项的相同问题.使用此选项,我们得到以下输出:

sat
(model 
  (define-fun R () Real
    143.8986691902?)
  (define-fun I1 () Real
    0.0106497781?)
  (define-fun I2 () Real
    0.0032488909?)
  (define-fun V2 () Real
    0.5)
  (define-fun V1 () Real
    1.0)
  (define-fun Vo () Real
    (- 2.0))
  (define-fun g () Real
    (- 2.0))
)
Run Code Online (Sandbox Code Playgroud)