Python 三角函数 Return 复数?
Python Trig Functions Return Complex Numbers?
我正在编写代码,接受电机转动的度数,并使用该数据计算车轮覆盖的距离(使用距离 = 旋转次数 * 每次旋转覆盖的距离)。
然后进行误差调整(考虑摩擦等环境因素)。
最后,使用三角函数计算沿 x 轴和 y 轴移动的距离。
以上都是由classCoordinateManager
中的函数straight
完成的。此函数由另一个 class.
的实例调用
class CoordinateManager:
goalcord = [20, 0]
def __init__(self):
self.curcord = [0, 0]
self.theta = 0
def get_compass_angle(self):
compass = Sensor(address='in2')
return compass.value(0)
def turn(self, iangle, fangle):
self.theta = self.theta + (fangle-iangle)
def straight(self, turnangle):
d = turnangle*2*3.14*2/360
d = 1.8120132*(d**0.8938054)
thetarad = radians(self.theta)
dx = d*sin(thetarad)
dy = d*cos(thetarad)
self.curcord[0] += dx
self.curcord[1] += dy
同时打印 d
和 self.theta
表明它们包含正确的值。
这一定意味着数组 self.curcord
也有有效值。然而,情况并非如此。打印 self.curcord
的两个元素输出复数(一些大 float + 另一个大 floatj)。
除了三角函数必须返回复数外,我想不出任何合乎逻辑的解释。但是,我认为 python 内置库函数 returns 错误值的可能性非常小。
有没有我可能忽略的逻辑错误?
编辑:我刚刚尝试将最后两行更改为:
self.curcord[0] += dx
self.curcord[1] += dy
我刚刚尝试在显示值时使用 .real
。即使这些价值观现在是真实的,但它们仍然是错误的。我会进一步研究这是否是由某些计算错误引起的。
既然你在上面的评论中说turnangle
可以是任意整数,那么问题可以直接追溯到这一行:
d = 1.8120132*(d**0.8938054)
由于turnangle
可以为负数,所以执行该行之前d
的值也可以为负数;提升到任意十进制幂的负值通常是 complex.
因此问题根本不在于三角函数。以上也让我相信当你说
Printing both d
and self.theta
shows that they contain correct values
...你只在这一行之后这样做:
d = turnangle*2*3.14*2/360
这可以解释为什么您错误地认为问题一定出在其他地方。
更新:
像您一样将变量设置为自身的某些函数是一个非常糟糕的习惯。尝试使用不同的变量名称以避免混淆 - 正如您在上面看到的,我不得不引用 "this line" 而不是它们的变量名称。
假设不管 turnangle
的符号如何,电机的行为都是相同的,也许这样的事情会起作用?
d = sign(d) * 1.8120132 * (abs(d) ** 0.8938054)
我正在编写代码,接受电机转动的度数,并使用该数据计算车轮覆盖的距离(使用距离 = 旋转次数 * 每次旋转覆盖的距离)。
然后进行误差调整(考虑摩擦等环境因素)。
最后,使用三角函数计算沿 x 轴和 y 轴移动的距离。
以上都是由classCoordinateManager
中的函数straight
完成的。此函数由另一个 class.
class CoordinateManager:
goalcord = [20, 0]
def __init__(self):
self.curcord = [0, 0]
self.theta = 0
def get_compass_angle(self):
compass = Sensor(address='in2')
return compass.value(0)
def turn(self, iangle, fangle):
self.theta = self.theta + (fangle-iangle)
def straight(self, turnangle):
d = turnangle*2*3.14*2/360
d = 1.8120132*(d**0.8938054)
thetarad = radians(self.theta)
dx = d*sin(thetarad)
dy = d*cos(thetarad)
self.curcord[0] += dx
self.curcord[1] += dy
同时打印 d
和 self.theta
表明它们包含正确的值。
这一定意味着数组 self.curcord
也有有效值。然而,情况并非如此。打印 self.curcord
的两个元素输出复数(一些大 float + 另一个大 floatj)。
除了三角函数必须返回复数外,我想不出任何合乎逻辑的解释。但是,我认为 python 内置库函数 returns 错误值的可能性非常小。
有没有我可能忽略的逻辑错误?
编辑:我刚刚尝试将最后两行更改为:
self.curcord[0] += dx
self.curcord[1] += dy
我刚刚尝试在显示值时使用 .real
。即使这些价值观现在是真实的,但它们仍然是错误的。我会进一步研究这是否是由某些计算错误引起的。
既然你在上面的评论中说turnangle
可以是任意整数,那么问题可以直接追溯到这一行:
d = 1.8120132*(d**0.8938054)
由于turnangle
可以为负数,所以执行该行之前d
的值也可以为负数;提升到任意十进制幂的负值通常是 complex.
因此问题根本不在于三角函数。以上也让我相信当你说
Printing both
d
andself.theta
shows that they contain correct values
...你只在这一行之后这样做:
d = turnangle*2*3.14*2/360
这可以解释为什么您错误地认为问题一定出在其他地方。
更新:
像您一样将变量设置为自身的某些函数是一个非常糟糕的习惯。尝试使用不同的变量名称以避免混淆 - 正如您在上面看到的,我不得不引用 "this line" 而不是它们的变量名称。
假设不管
turnangle
的符号如何,电机的行为都是相同的,也许这样的事情会起作用?d = sign(d) * 1.8120132 * (abs(d) ** 0.8938054)