我正在寻找一种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
包,这使事情变得更容易一些。有了sympify
和formula.split
等,我能够提取x
系数和方程的结果(虽然我真的不在乎结果,而只关心向量表示)- 看到了这个和这个,但它们都是不同的语言,并不是我想要的。
那么,有人知道如何在 Python 中做到这一点吗?
谢谢! :)
这可能会让你朝着正确的方向前进:
>>> 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]