Python花式解方程

发布时间:2019-10-10 09:17:31编辑:auto阅读(3003)

    numpy

    numpy 用来解方程的话有点复杂,需要用到矩阵的思维!我矩阵没学好再加上 numpy 不能解非线性方程组,所以...我也不会这玩意儿!

    sympy

    逊色于 sage 和 z3,但解方程也是非常不错的!

    from sympy import *
    x = symbols('x')
    y = symbols('y')
    res = solve([x+y-3,x-y-1],[x,y])[0]
    print(res)

    sage

    sage 既能解线性方程组,又能解非线性方程组,堪称解方程界的神器,但是表达式不支持位运算,比如:与或非,取余以及异或。出现位运算的方程就只能用 z3 创建约束求解!sage 的优点也很明显:表达式简单易写,运算速度快!
    在线sage求解

    var('x y')
    solve([x**3+y**2+666==142335262,x**2-y==269086,x+y==1834],[x,y])

    z3

    z3 也叫约束求解器,用来解任何方程都没有问题!但是 windows 不太好装,所以我基本上是在linux上跑,python2 和 python3 都支持!使用的思路非常简单:

    • 先创建你所需类型的符号变量
    • 再初始化一个约束器,
    • 添加约束
    • 最后判断约束是否有解以及求解变量

    下面列举常用的函数,顺便给个 z3-solver文档

    # 符号变量类型
    Int('x')
    Real('x')
    Bool('x')
    BitVec('x',N) # N bit的符号变量,用于位操作
    BitVecVal(num,N) # N bit的数据 num
    # 初始化约束器
    solver = Solver()
    # 添加约束
    solver.add(x+y==10,x-y==0)
    # 求解约束
    solver.check()
    ans = solver.mode()
    
    # 初始化多个符号变量
    x = [Int('x%d' % i) for i in range(n)]
    # 取结果中某个变量的值
    value = ans[x].as_long()

    END

关键字