我正在使用sympy解决一些方程式,但遇到了问题。我有很多方程式存在这个问题,但我将举例说明。我有一个包含多个变量的方程式,我想用所有变量来求解该方程式,但排除一个变量。例如,方程0 = 2^n*(2-a) - b + 1
。这里有三个变量a
,b
和n
。我想获取a
和b
的值,而不是用n
来表示,所以a
和b
可能不包含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并指示它求解符号a
和b
时,sympy向我返回了一个单独的解决方案,其中a
是根据n
和{{1}定义的}。我认为这意味着我可以自由选择b
和b
,但是我不想将n
固定为一个我希望n
仍然是变量的特定值
代码:
n
我真的希望有人能帮助我。我已经在Google搜索了几个小时了……
答案 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)))