求解变量子集的多元方程

时间:2019-01-02 08:41:32

标签: python python-3.x sympy equation-solving

我正在使用sympy解决一些方程式,但遇到了问题。我有很多方程式存在这个问题,但我将举例说明。我有一个包含多个变量的方程式,我想用所有变量来求解该方程式,但排除一个变量。例如,方程0 = 2^n*(2-a) - b + 1。这里有三个变量abn。我想获取ab的值,而不是用n来表示,所以ab可能不包含n。 / p>

2^n*(2-a) - b + 1 = 0

# Since we don't want to solve in terms of n we know that (2 - a)
# has to be zero and -b + 1 has to be zero.

2 - a = 0
a = 2

-b + 1 = 0
b = 1

我希望sympy做到这一点。也许我只是在看不正确的文档,但是我找不到任何方法。当我使用Solve并指示它求解符号ab时,sympy向我返回了一个单独的解决方案,其中a是根据n和{{1}定义的}。我认为这意味着我可以自由选择bb,但是我不想将n固定为一个我希望n仍然是变量的特定值

代码:

n

我真的希望有人能帮助我。我已经在Google搜索了几个小时了……

1 个答案:

答案 0 :(得分:0)

好的,这就是我的想法。这似乎可以解决您要寻找的方程式。我也提供了一些测试。当然,此代码很粗糙,很容易导致失败,因此我将其更多地作为起点而非完整的解决方案

import sympy
n = sympy.Symbol('n')
a = sympy.Symbol('a')
b = sympy.Symbol('b')
c = sympy.Symbol('c')
d = sympy.Symbol('d')
e = sympy.Symbol('e')
f = sympy.sympify(2**n*(2-a) - b + 1)
g = sympy.sympify(2**n*(2-a) -2**(n-1)*(c+5) - b + 1)
h = sympy.sympify(2**n*(2-a) -2**(n-1)*(e-1) +(c-3)*9**n - b + 1)
i = sympy.sympify(2**n*(2-a) -2**(n-1)*(e+4) +(c-3)*9**n - b + 1 + (d+2)*9**(n+2))

def rewrite(expr):
        if expr.is_Add:
            return sympy.Add(*[rewrite(f) for f in expr.args])
        if expr.is_Mul:
            return sympy.Mul(*[rewrite(f) for f in expr.args])
        if expr.is_Pow:
            if expr.args[0].is_Number:
                if expr.args[1].is_Symbol:
                    return expr
                elif expr.args[1].is_Add: 
                    base = expr.args[0]
                    power = sympy.solve(expr.args[1])
                    sym = expr.args[1].free_symbols.pop()
                    return sympy.Mul(sympy.Pow(base,-power[0]), sympy.Pow(base,sym))
                else:
                    return expr

            else:
                return expr
        else:
            return expr




def my_solve(expr):

    if not expr.is_Add:
        return None

    consts_list = []
    equations_list = []
    for arg in expr.args:
        if not sympy.Symbol('n') in arg.free_symbols:
            consts_list.append(arg)
        elif arg.is_Mul:
            coeff_list = []
            for nested_arg in arg.args:
                if not sympy.Symbol('n') in nested_arg.free_symbols:
                    coeff_list.append(nested_arg)
            equations_list.append(sympy.Mul(*coeff_list))

    equations_list.append(sympy.Add(*consts_list))
    results = {}
    for eq in equations_list:
        var_name = eq.free_symbols.pop()
        val = sympy.solve(eq)[0]
        results[var_name] = val



    return results




print(my_solve(rewrite(f)))
print(my_solve(rewrite(g)))
print(my_solve(rewrite(h)))
print(my_solve(rewrite(i)))