Python 如何使sin(pi)和cos(pi/2)为零?
我知道在Python中,Python 如何使sin(pi)和cos(pi/2)为零?,python,matrix,sympy,Python,Matrix,Sympy,我知道在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(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))
<>和我将有很多<代码> .61232437.57 367E-17</代码>中间。 你总是可以做一个函数!差不多
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)
你总是可以做一个函数!差不多
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)
使用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]
使用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]
lmao,我想我的眼睛快死了xD也许可以试着解释矩阵想要完成什么,而不是复制粘贴这个怪物?呵呵,对不起,伙计们,我这么做是为了展示如果我得到的值是6.12323399573677e-17,它会变得多大…输入:
sin(pi)
。输出:0
。你确定你的角度是π的有理倍数吗?lmao,我想我的眼睛快死了xD,也许可以试着解释一下矩阵想要实现什么,而不是复制粘贴这个怪物?呵呵,对不起,伙计们,我这样做是为了显示如果我得到的值是6.12323399573677e-17,它会变得多大…输入:sin(π)
。输出:0
。你确定你的角度是π的有理倍数吗?这对舍入误差和类似误差来说是不可靠的。例如,你得到sin(11*math.pi)!=0
@Wrzlprmft啊,说得好!糟糕的是,我是用我的数学大脑思考的,而不是我的CS大脑。这对舍入错误和类似错误来说是不可靠的。例如,你得到sin(11*math.pi)!=0
@Wrzlprmft啊,说得好!糟糕的是,我是用我的数学大脑思考的,而不是用我的CS大脑