吐槽一下 Symbolics.jl 解符号方程的功能,目前还不是很完善。
-
官方文档的
solve_for
仅支持符号线性方程
-
此外处理的矩阵要求为非奇异方阵
# 源码 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
,速度还行,但功能有待修缮