我正在使用 sympy 来求解一些方程式,但我遇到了一个问题。我有很多方程式的这个问题,但我会用一个例子来说明。我有一个包含多个变量的方程式,我想根据所有变量来求解这个方程式,但排除了一个变量。例如等式 0 = 2^n*(2-a) - b + 1
。这里有三个变量a
、b
和n
。我想获取 a
和 b
的值,而不是 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 并指示它求解符号 a
和 b
时,sympy 返回给我一个单一的解决方案,其中 a
是根据 n
和 b
。我认为这意味着我可以自由选择 b
和 n
,但是我不想将 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/