【问题标题】:Substitute sympy symbols in vectors using string arguments instead of symbols使用字符串参数而不是符号替换向量中的 sympy 符号
【发布时间】:2017-07-24 19:19:29
【问题描述】:

有没有其他方法可以做到这一点:

expr = x**3 + 4*x*y - z
expr.subs([(x, 2), (y, 4), (z, 0)])
40

例如,通过 ('x', 2) 而不是一个 sympy 符号 x?

我正在尝试将与此类似的内容应用于 sympy 向量。

编辑:

所以我尝试在 subs 参数中使用 dict,它适用于这种类型的表达式,但当符号是动态符号时(来自力学模块)则不行。

我有一些向量

v = x*inertial_frame.x + y*inertial_frame.y

我尝试使用 dict 方法,但没有任何替代。

我也试过替换成

v.to_matrix(some_inertial_frame)
Matrix([
[x(t)],
[y(t)],
[   0]])

使用

{'x(t)': 1, {'y(t)': 2}

但同样,没有任何东西可以替代。

【问题讨论】:

  • 我真的不明白你为什么要这样做。现在您必须编写两个额外的代码字符。此外,两个变量可能具有相同的名称,但范围不同。例如一个有两个积分的表达式,每个都有自己的x 代表dx
  • 如果我要将这个表达式交给一些不同的范围,那么我也必须传递符号变量,对吧?在这种情况下,使用字符串制作 sub 不是更容易吗?
  • 是的,但是两个同名的变量本质上不是相同的变量。

标签: python sympy


【解决方案1】:

有一个自定义的mechanics.msubs function 专门用于将值替换为由sympy.physics.mechanics.dynamicsymbols 构建的表达式。

Basic.subs method 不同,mechanics.msubs 不会尝试将字符串转换为dynamicsymbols。不过你可以自己拨打mechanics.dynamicsymbols

In [126]: mechanics.dynamicsymbols('x')
Out[128]: x(t)

例如,

import sympy as sym
import sympy.physics.mechanics as mechanics

x, y, z = mechanics.dynamicsymbols('x,y,z')
expr = x**3 + 4*x*y - z
substitutions = [(mechanics.dynamicsymbols(name), val) 
                 for name, val in [('x', 2), ('y', 4), ('z', 0)]]
print(mechanics.msubs(expr, substitutions))
# 40

【讨论】:

  • 这行得通!我打算使用 {i.__str__() for i in symbols} 之类的东西,但我认为这是一种更加不透明的方法。谢谢。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多