python - 求解变量子集的多元方程

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

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

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 是根据 nb。我认为这意味着我可以自由选择 bn,但是我不想将 n 固定为我想要的特定值 n 仍然是一个变量。

代码:

import sympy

n = sympy.var("n", integer = True)
a = sympy.var("a")
b = sympy.var("b")
f = 2**n*(2-a) - b + 1

solutions = sympy.solve(f, [a,b], dict = True)
# this will return: "[{a: 2**(-n)*(2**(n + 1) - b + 1)}]". 
# A single solution where b and n are free variables.
# However this means I have to choose an n I don't want
# to that I want it to hold for any n.

我真的希望有人能帮助我。我已经在谷歌上搜索了几个小时......

最佳答案

好的,这就是我想出的。这似乎可以解决您正在寻找的方程式类型。我也提供了一些测试。当然,这段代码很粗糙,很容易导致失败,所以我更愿意把它作为一个起点,而不是一个完整的解决方案

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)))

关于python - 求解变量子集的多元方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003390/

相关文章:

python - python中用箭头增加日期不改变属性

python - 将 Pytorch model.state_dict() 保存到 s3

python - 同时显示文字和播放音频

创建彼此的类对象的 Python 类

python - 除了不使用查找错误python

python - pipenv ssh + git在不可编辑模式下不起作用

python - Tensorflow - 在尝试预测价格时得到不准确的预测、NaN 和无限值

python - 为什么 SymPy 的积分有时会产生非常长的反导数?

python - 在 sympy 中集成分段函数时出现错误结果

python - 对表达式中的自由符号进行分类