将一串线性方程解析为系数向量(Python)

时间:2017-06-18 19:44:33

标签: python string sympy

我正在寻找一个 Python 解决方案,它采用一串线性方程并输出系数的向量。

为了简单起见,假设我有一组方程式:

  • 以字符串形式提供
  • 每个不超过4个元素
  • 都是线性的
  • 所有这些x只出现一次

然后我想得到一个矢量化表示

  • 第一个元素是x系数
  • 其他元素是等式中的其他系数(未评估,但按原样),好像它们出现在等式的另一侧x
  • 零以完成4-d向量

我在这里给出几个输入输出方程,以了解一些挑战:

  • '2*x+3=2+5' => [2, -3, 2, 5]
  • '88/8=x' => [8, 88, 0, 0]
  • '74=(35+18)+3*x' => [3, 74, -35, -18]
  • '((4+4)*6)=x'] => [1/6, 4, 4, 0]
  • '-X=(91.0+88.0)' => [-1, 91, 88, 0]
  • 'X=(30.0/10.0)' => [10, 30, 0, 0]
  • '0.16 + 0.41 = 2*x - 0.08' => [2, 0.16, 0.41, 0.08]
  • '(0.25 + 0.37)*2 = x' => [1/2, 0.25, 0.37, 0]
  

我开始编写一个非常严谨和乏味的“蛮力”解决方案,在此过程中偶然发现了几次,并认为必须有一个更好,更聪明的方法来做到这一点......

     
      
  • 我正在使用sympy包,这使事情变得更容易一些。使用sympifyformula.split这样我就可以提取x系数和等式的结果(虽然我真的不关心结果,但只有矢量表示
  •   
  • 我看到thisthis,但他们都是不同的语言,而不是我想要的。
  •   
     

Sooo,任何人都知道如何用Python做到这一点?

     

谢谢! :)

1 个答案:

答案 0 :(得分:1)

这可能会让你朝着正确的方向前进:

>>> def peq(s):
...     from sympy import S
...     l, r = t = S(s, evaluate=False)
...     free = t.free_symbols
...     assert len(free) == 1
...     x = free.pop()
...     if r.has(x):
...         l, r = r, l
...     assert not r.has(x)
...     assert l.has(x)
...     assert not l.diff(x).free_symbols
...     v = []
...     v.append(l.coeff(x))
...     v.append(-(l.subs(x, 0)))
...     if not r.is_Add:
...         v.extend([r, S.Zero])
...     else:
...         assert r.is_Add and len(r.args) == 2
...         v.extend(r.args)
...     return v
>>> peq('2*x+3,-2+5/3')
[2,−3,−2,5/3]
>>> peq('2*x+3,-2')
[2,−3,−2,0]
>>> peq('x,-2')
[1,0,−2,0]