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

同时打印 dself.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

这可以解释为什么您错误地认为问题一定出在其他地方。


更新:

  1. 像您一样将变量设置为自身的某些函数是一个非常糟糕的习惯。尝试使用不同的变量名称以避免混淆 - 正如您在上面看到的,我不得不引用 "this line" 而不是它们的变量名称。

  2. 假设不管 turnangle 的符号如何,电机的行为都是相同的,也许这样的事情会起作用?

    d = sign(d) * 1.8120132 * (abs(d) ** 0.8938054)