(Python)求解未知数的方程式,并用方程式找到该数字

时间:2018-08-13 23:10:10

标签: python

我编写了一个代码(用于娱乐和练习),以平衡化学方程式。我想尝试平衡N + A,使其= Z

N = 2
A = 2
Z = 6
if N + A != Z:
print('X')
balancer = ???

平衡器应为3,这样,如果我建立一个方程式,例如(平衡器x N)+ A = Z,则它为真。在没有直接输入的情况下如何使平衡器成为三台。

谢谢:)

2 个答案:

答案 0 :(得分:1)

您可以手工完成基本代数:

(balancer * N) + A = Z
(balancer * N) = Z - A # subtract A from both sides
balancer = (Z - A) / N # divide both sides by N

…然后将其转换为代码很简单-最后一行实际上是有效的Python代码,没有任何更改。


或者,如果您希望Python为您做到这一点,只需将(balancer * N) + A = Z指定为方程式即可…Python并没有内置任何功能,但是有SymPy之类的代数库要做。

您将真的要完成整个教程,但要简短……

首先,您必须首先告诉您变量是变量:

>>> from sympy import symbols, solve, Eq
>>> A, N, Z, balancer = symbols('A N Z balancer')

然后,建立一个方程式。左侧可以只是(balancer * N) + aZ,但不能仅在它们之间放置===;您必须使用Eq

>>> equation = Eq((balancer * N) + A, Z)    

现在您可以用变量的值代替:

>>> equation.subs(dict(N=2, A=2, Z=6))
Eq(2*balancer + 2, 6)

最后,找到有效的解决方案:

>>> solve(equation.subs(dict(N=2, A=2, Z=6))
[2]

或者,如果您希望用代数方法求解,然后替换,而不是相反:

>>> solve(equation, 'balancer')
[(-A + Z)/N]
>>> [s.subs(dict(N=2, A=2, Z=6)) for s in solve(equation, 'balancer')]
[2]

答案 1 :(得分:0)

您需要一个条件来测试左侧N + A是否大于或小于右侧Z。您可以使用(N + A) - Z,得到-2,这表明您缺少两个原子。从那里开始,您将需要编写一些逻辑以确定丢失的原子是什么。

使用指向整数的简单变量,无法直观地预测需要添加的原子。不过,大概是您正在根据方程式进行工作,因此,我建议您考虑使用正则表达式解决方案来解析该问题。像这样:

>>> import re
>>> m = re.findall('(\d*)((?:[A-Z][a-z]?\d*)+)', '2CH4 + O2')
>>> for n, molecule in m:
...     print(n or 1, molecule)
... 
2 CH4
1 O2

然后从那里类似地解析原子。