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

EDW*_*yte 6 python math sympy

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

使用交感符号构造方程.

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

例如.

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

eq1 = c*b*a + b*a + a + c*d
Run Code Online (Sandbox Code Playgroud)

检查以下内容:就eq1线性而言a,是d

True
Run Code Online (Sandbox Code Playgroud)

小智 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
Run Code Online (Sandbox Code Playgroud)

在循环中,计算每个导数并检查是否等于零。如果 sympy 无法确定它是否为零(引发 TypeError),那么它不完全为零。

输出:

>>> is_linear(eq1, [a,d])
True
>>> is_linear(eq1, [a,c])
False
Run Code Online (Sandbox Code Playgroud)

要检查单独的线性(例如,分别在 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
Run Code Online (Sandbox Code Playgroud)

输出:

>>> is_separately_linear(eq1, [a,d])
True
>>> is_separately_linear(eq1, [a,c])
True
Run Code Online (Sandbox Code Playgroud)