【问题标题】:How to do dot/cross multiplication of Vectors with Sympy如何使用 Sympy 对向量进行点乘/交叉乘法
【发布时间】:2014-03-02 09:56:17
【问题描述】:

我想知道怎么做

  • 点乘法
  • 交叉乘法
  • 添加/子

带有 sympy 库的向量。我曾尝试查看官方文档,但我没有运气,或者它太复杂了。谁能帮我解决这个问题?

我试图做这个简单的操作

a · b = |a| × |b| × cos(θ)

【问题讨论】:

  • 我认为强调 NumPy 和 SymPy 之间的区别很重要:NumPy 进行数值计算,而 SymPy 用于符号数学。因此,如果您只想计算给定值集的解,NumPy 是正确的选择,当您想开发方程或证明某些关系时,SymPy 是正确的选择。它们不像答案所暗示的那样相互替代。

标签: python math sympy


【解决方案1】:

您可以按照此处所述进行操作:https://docs.sympy.org/latest/modules/matrices/matrices.html?highlight=cross#sympy.matrices.matrices.MatrixBase.cross

例如:

>>> from sympy import Matrix
>>> M = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> v = Matrix([1, 1, 1])
>>> M.row(0).dot(v)
6
>>> M.col(0).dot(v)
12
>>> v = [3, 2, 1]
>>> M.row(0).dot(v)
10

【讨论】:

    【解决方案2】:

    http://docs.sympy.org/0.7.2/modules/physics/mechanics/api/functions.html

    该文档中有示例,此处有一些代码。你到底有什么不明白的?也许,尝试更具体。

    在文档中使用该示例解释了您编写时的点乘法:

    from sympy.physics.mechanics import ReferenceFrame, Vector, dot
    from sympy import symbols
    q1 = symbols('q1')
    N = ReferenceFrame('N') # so, ||x|| = ||y|| = ||z|| = 1
    dot(N.x, N.x)
    1 # it is ||N.x||*||N.y||*cos(Nx,Ny)
    dot(N.x, N.y)
    0 # it is ||N.x||*||N.y||*cos(Nx,Ny)
    A = N.orientnew('A', 'Axis', [q1, N.x])
    dot(N.y, A.y)
    cos(q1)
    

    另外,你可以考虑用 numpy 来做...

    【讨论】:

    • 我不理解所有额外的代码,如 ReferenceFrame、orientnew 等。我希望它像点(v1,v2)一样简单
    • 这就是我们建议使用 numpy 的原因。对于那些基本的东西,这要容易得多:)
    • 我想你现在可以结束这个问题了 :)
    【解决方案3】:

    numpy 就是为此而设计的,因为它是用 C 语言实现的,所以它是一种干净而快速的数值计算方法。

    In [36]: x = [1, 2, 3]
        ...: y = [4, 5, 6]
    
    In [37]: import numpy as np
        ...: print np.dot(x, y)
        ...: print np.cross(x, y)
        ...: print np.add(x, y) #np.subtract, etc.
    32
    [-3  6 -3]
    [5 7 9]
    

    在 google 群组中有一个discussion on numpy and sympy

    【讨论】:

    • 我实际上是在使用 numpy 来做这件事。谢谢你提到它。忽略那些反对你的狂热分子。
    • 我怀疑他们是 SymPy 开发者。如果您只是在数字上做事,我们大多数人都会将您从 SymPy 转为 NumPy。如果你想要准确的、象征性的答案,应该使用 SymPy。
    【解决方案4】:

    要与sympy 进行向量点/叉积乘法,您必须导入基向量对象CoordSys3D。下面是一个工作代码示例:

    from sympy.vector import CoordSys3D
    N = CoordSys3D('N')
    v1 = 2*N.i+3*N.j-N.k
    v2 = N.i-4*N.j+N.k
    v1.dot(v2)
    v1.cross(v2)
    #Alternately, can also do
    v1 & v2 
    v1 ^ v2
    

    请注意,sympy 文档不推荐最后两行。最好明确地使用这些方法。不过,我个人认为这是一个偏好问题。

    【讨论】:

      【解决方案5】:

      如果你有符号向量,需要使用sympy其实很简单,只要使用cross函数就可以了,示例如下:

      import sympy as s
      a,b,c,x,y,z = s.symbols("a,b,c,x,y,z")
      v1 = s.Matrix([a,b,c])
      v2 = s.Matrix([x,y,z])
      cross_result = v1.cross(v2)
      print(cross_result)
      

      有输出:

      Matrix([
      [ b*z - c*y],
      [-a*z + c*x],
      [ a*y - b*x]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 2013-04-04
        • 1970-01-01
        • 2018-01-23
        • 2020-10-26
        • 1970-01-01
        相关资源
        最近更新 更多