首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Z3 SMT-LIB在线解决运算放大器的问题

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

Stack Overflow用户
提问于 2013-10-11 12:02:31
回答 1查看 1.1K关注 0票数 6

在一个以前的职位中,使用Z3Py在线解决了一些涉及运算放大器的问题。但是现在Z3Py在线已经停止服务,我正在尝试使用Z3来解决这些问题。

示例1:

在下面的电路中找到R的值

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

代码语言:javascript
复制
(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)

相应的输出是:

代码语言:javascript
复制
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)) )

在线运行此示例这里

正如你所看到的,Z3的输出是x上的二次方程,那么问题是:如何用Z3来求解这个方程呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-12 19:09:09

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

代码语言:javascript
复制
(set-option :pp-decimal true)

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

代码语言:javascript
复制
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))
)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19317677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档