Symbolics 解符号方程

吐槽一下 Symbolics.jl 解符号方程的功能,目前还不是很完善。

  1. 官方文档solve_for 仅支持符号线性方程

  2. 此外处理的矩阵要求为非奇异方阵

    # 源码
    function _solve(A::AbstractMatrix, b::AbstractArray, do_simplify)
        A = Num.(SymbolicUtils.quick_cancel.(A))
        b = Num.(SymbolicUtils.quick_cancel.(b))
        sol = value.(sym_lu(A) \ b) # LU 分解
        do_simplify ? SymbolicUtils.simplify_fractions.(sol) : sol
    end
    

    比如 5 x 3 的符号线性方程,要先选三个求解,再验证其他方程(可能有其他方法?)

    using Symbolics
    @variables x1 x2 y1 y2 y3
    A = [2*x1 1 1 0;
         0 1 x1-x2+1 -1
         x1-x2 1 0 0
         0 x1+x2+1 1 -1
         x1+x2 0 1 0] .// 1 # to Rational
    eqs = [sum(row .* [1//1, y1, y2, y3]) for row in eachrow(A)]
    v1, v2, v3 = simplify.(Symbolics.solve_for(eqs[3:5], [y1, y2, y3]))
    all(iszero, expand.(substitute.(eqs, Ref(Dict(y1 => v1, y2 => v2, y3 => v3)))))
    

    这个例子还遇到了 issue#524 的情况,输入 Rational 数据,输出数据带 Float64


补充:刚用这个例子测 Benchmark,速度还行,但功能有待修缮 :joy: