我有符号函数(例如
x^2
、x+1
等)并尝试找到等于零的线性组合。
我用
Symbolic.jl
写了一个 Julia 程序。在文档中,它说大多数 Julia 方法都使用表达式,但是,我的程序:
using Symbolics, LinearAlgebra
@variables n
p1 = :(n + 1)
p2 = :(n + 3)
p3 = :(n + 2)
A = [p1 p2 p3]
nullspace_A = nullspace(A)
println(nullspace_A)
抛出错误:
ERROR: LoadError: MethodError: no method matching one(::Type{Expr})
我猜
nullspace
中的LinearAlgebra
不支持符号表达式。有方法吗?是否有更合适的模块或编程语言?效率是关键,真实示例将包含更复杂的函数,如阶乘/伽玛函数。
我确实找到了一些解决问题的方法......
Python 具有
sympy
模块,允许求解多个变量的符号方程。我设法找到了 {(x - 1)!, x * (x - 2)!, (x - 2)!}
甚至 {gamma(x - 1), gamma(x - 2), x * gamma(x - 2)}
的零空间。代码很简单:
>>>from sympy import solve, factorial
>>>from sympy.abc import a, b, c, x
>>>eq = a * factorial(x - 1) + b * x * factorial(x - 2) + c * factorial(x - 2)
>>>print(solve(eq, a, b, c, set=True))
([a, b, c], {((-b*x + b - c)/x, b, c)})
>>>eq = -b * x + b - c - a * x
>>>print(solve(eq, a, b, c, set=True))
([a, b], {(-c, c)})
然而,一旦事情变得更加复杂,
sympy
就失败了。例如
{upper_gamma(x, -1), upper_gamma(x - 1, -1), x * upper_gamma(x - 1, -1), (-1) ^ x}
或{(x - 1) * upper_gamma(x - 1, -1) + (-1) ^ (x - 1), upper_gamma(x - 1, -1), x * upper_gamma(x - 1, -1), (-1) ^ x}
甚至{(x - 1) * y, z, y, x * y, -z}
(虽然,我没有 100% 排除用户错误)
Mathematica 是 wolfram-alpha 使用的语言。它可能是最强大的 CAS 之一,但是它不是免费使用的
还有一些其他选项,比如
Matlab
。如果我发现更多,我会更新这个答案。