【问题标题】:How to make sin(pi) and cos(pi/2) zero?如何使 sin(pi) 和 cos(pi/2) 为零?
【发布时间】:2018-07-19 14:50:54
【问题描述】:

我知道在 Python 中 sin(pi)cos(pi/2) 不会产生 0,但我正在使用矩阵进行计算,我需要使用这些值。

我正在使用 SymPy,起初 sin(pi)cos(pi/2) 的值有点烦人。在一些乘法之后,它们开始妨碍。有没有办法让整个模块中的这些值等于0? 如何在表达式中间更改它?

我将以这个矩阵为例:

A = Matrix([
[(-sin(theta1)*sin(theta2)*cos(alpha2) + cos(theta1)*cos(theta2))*cos(theta3) + (-sin(theta1)*cos(alpha2)*cos(theta2) - sin(theta2)*cos(theta1))*sin(theta3)*cos(alpha3) + sin(alpha2)*sin(alpha3)*sin(theta1)*sin(theta3), -(-sin(theta1)*sin(theta2)*cos(alpha2) + cos(theta1)*cos(theta2))*sin(theta3) + (-sin(theta1)*cos(alpha2)*cos(theta2) - sin(theta2)*cos(theta1))*cos(alpha3)*cos(theta3) + sin(alpha2)*sin(alpha3)*sin(theta1)*cos(theta3), -(-sin(theta1)*cos(alpha2)*cos(theta2) - sin(theta2)*cos(theta1))*sin(alpha3) + sin(alpha2)*sin(theta1)*cos(alpha3), a3*(-sin(theta1)*sin(theta2)*cos(alpha2) + cos(theta1)*cos(theta2)) + d2*sin(alpha2)*sin(theta1) - d3*(-sin(theta1)*cos(alpha2)*cos(theta2) - sin(theta2)*cos(theta1))*sin(alpha3) + d3*sin(alpha2)*sin(theta1)*cos(alpha3)],
[(-sin(theta1)*sin(theta2) + cos(alpha2)*cos(theta1)*cos(theta2))*sin(theta3)*cos(alpha3) + (sin(theta1)*cos(theta2) + sin(theta2)*cos(alpha2)*cos(theta1))*cos(theta3) - sin(alpha2)*sin(alpha3)*sin(theta3)*cos(theta1),   (-sin(theta1)*sin(theta2) + cos(alpha2)*cos(theta1)*cos(theta2))*cos(alpha3)*cos(theta3) - (sin(theta1)*cos(theta2) + sin(theta2)*cos(alpha2)*cos(theta1))*sin(theta3) - sin(alpha2)*sin(alpha3)*cos(theta1)*cos(theta3), -(-sin(theta1)*sin(theta2) + cos(alpha2)*cos(theta1)*cos(theta2))*sin(alpha3) - sin(alpha2)*cos(alpha3)*cos(theta1),  a3*(sin(theta1)*cos(theta2) + sin(theta2)*cos(alpha2)*cos(theta1)) - d2*sin(alpha2)*cos(theta1) - d3*(-sin(theta1)*sin(theta2) + cos(alpha2)*cos(theta1)*cos(theta2))*sin(alpha3) - d3*sin(alpha2)*cos(alpha3)*cos(theta1)],
[sin(alpha2)*sin(theta2)*cos(theta3) + sin(alpha2)*sin(theta3)*cos(alpha3)*cos(theta2) + sin(alpha3)*sin(theta3)*cos(alpha2), -sin(alpha2)*sin(theta2)*sin(theta3) + sin(alpha2)*cos(alpha3)*cos(theta2)*cos(theta3) + sin(alpha3)*cos(alpha2)*cos(theta3), -sin(alpha2)*sin(alpha3)*cos(theta2) + cos(alpha2)*cos(alpha3),a3*sin(alpha2)*sin(theta2) + d2*cos(alpha2) - d3*sin(alpha2)*sin(alpha3)*cos(theta2) + d3*cos(alpha2)*cos(alpha3)],
[0,0,0,1]])

使用 SymPy 我将替换该值

substitution = A.subs(alpha2, (-pi/2))

我中间会有很多6.12323399573677e-17

【问题讨论】:

  • lmao,我觉得我的眼睛快死了 xD 也许试着解释一下矩阵试图完成什么而不是复制粘贴这个怪物?
  • 嘿嘿嘿对不起大家,我这样做是为了展示如果我得到的值为 6.12323399573677e-17 会有多大...
  • 输入:sin(pi)。输出:0。你确定你的角度是pi有理倍数吗?

标签: python matrix sympy


【解决方案1】:

使用 SymPy 中的符号 pi,而不是数学或 NumPy 模块中的数字 pi。这就是你可能正在做的事情:

from sympy import sin, cos
from math import pi
print([sin(pi), cos(pi/2)])   # [1.22464679914735e-16, 6.12323399573677e-17]

而你应该这样做:

from sympy import sin, cos, pi
print([sin(pi), cos(pi/2)])  #  [0, 0]

【讨论】:

    【解决方案2】:

    你总是可以做一个函数!像

    from math import sin as oldsin
    
    def sin(x):
        if x % pi == 0: 
            #if x is an integer mult of pi, like pi, 2pi, -7pi, etc.
            return 0
        else:
            return oldsin(x)
    

    【讨论】:

    • 这对于舍入错误和类似情况并不可靠。例如,你得到sin(11*math.pi) != 0
    • @Wrzlprmft 啊,好点子!我的错,我用我的数学大脑而不是我的 CS 大脑思考
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多