【问题标题】:Parse a string of a linear equation into a vector of the coefficients (Python)将一串线性方程解析为系数向量(Python)
【发布时间】:2017-06-18 19:44:33
【问题描述】:

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

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

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

那么我想得到一个向量化的表示

  • 第一个元素是x 系数
  • 其他元素是方程中的其他系数(未计算,但按原样计算),就好像它们出现在方程的另一边一样x
  • 零以完成 4 维向量

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

  • '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 中做到这一点吗?

谢谢! :)

【问题讨论】:

    标签: python string sympy


    【解决方案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]
    

    【讨论】:

    • 看起来不错,但我不明白S 是什么,还有x 应该是'x' 吗?谢谢!
    • S 是将字符串转换为 SymPy 对象的 sympify 函数的简写。我会尝试更新函数。
    • 好的,你可能想测试一下 'x' 是否真的出现了;我上面的内容适用于任何看起来像变量的东西,例如ythe_variable.
    • 必须进行一些语义更改才能使其正常工作,但这绝对符合我的要求。谢谢!
    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2014-01-06
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多