检查一个特定变量集的方程是否是线性的

时间:2016-03-29 11:54:43

标签: python math sympy

我有一个自动生成方程式的脚本。

使用交感符号构造方程式。

我想知道这些是否是一种检查方程式在某些变量方面是否是线性的方法。

例如

a, b, c, d = sympy.symbols('a, b, c, d')

eq1 = c*b*a + b*a + a + c*d

检查以下内容:eq1a是否为d线性?

True

3 个答案:

答案 0 :(得分:3)

如果所有二阶导数都相同为零(包括混合的),则函数在给定的一组变量中是(联合)线性的。可以按如下方式检查:

def is_linear(expr, vars):
    for x in vars:
        for y in vars:
            try: 
                if not sympy.Eq(sympy.diff(expr, x, y), 0):
                    return False
            except TypeError:
                return False
    return True

在循环中,采用每个导数并检查相等为零。如果sympy无法确定它是否为零(引发TypeError),则它不会相同为零。

输出:

>>> is_linear(eq1, [a,d])
True
>>> is_linear(eq1, [a,c])
False

要检查单独的线性(例如,分别在a中和b中单独划分),删除混合偏导数:

def is_separately_linear(expr, vars):
    for x in vars:
        try: 
            if not sympy.Eq(sympy.diff(expr, x, x), 0):
                return False
        except TypeError:
            return False
    return True

输出:

>>> is_separately_linear(eq1, [a,d])
True
>>> is_separately_linear(eq1, [a,c])
True

答案 1 :(得分:3)

更简单的方法是将表达式的程度检查为每个变量中的多项式。

In [17]: eq1 = c*b*a + b*a + a + c*d

In [18]: degree(eq1, a)
Out[18]: 1

In [19]: degree(eq1, d)
Out[19]: 1

并且如果多项式次数<= 1,则表达式是线性的。

如果您知道变量中的表达式是多项式,您还可以检查包含变量的幂。

In [21]: [i for i in eq1.atoms(Pow) if i.base == a]
Out[21]: []

In [22]: eq2 = b*a**2 + d + c

In [23]: [i for i in eq2.atoms(Pow) if i.base == a]
Out[23]:
⎡ 2⎤
⎣a ⎦

答案 2 :(得分:2)

要扩展404的答案,如果f xy = 0,则f yx = 0。因此,对于混合导数解,可以将计算时间减半。

from itertools import combinations_with_replacement

def is_linear(expr, variables):
    combs = combinations_with_replacement(variables, 2)
    try:
        return all(sympy.Eq(sympy.diff(expr, *t), 0) for t in combs)
    except TypeError:
        return False