Python Trig函数返回复数?

时间:2017-12-07 15:48:08

标签: python math trigonometry complex-numbers

我正在编写的代码接受电机转动的程度,并使用该数据计算车轮所覆盖的距离(使用距离=旋转数*每次旋转覆盖的距离)。

然后进行误差调整(考虑到摩擦等环境因素)。

最后,使用三角学,它计算沿x轴和y轴移动的距离。

以上所有操作均由类straight中包含的函数CoordinateManager完成。此函数由另一个类的实例调用。

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的两个元素输出复数(一些大浮点数+另一个大浮点数 j )。

除了三角函数必须返回复数之外,我认为没有合理的解释。但是,我认为python内置的lib函数返回错误值的可能性非常小。

我可能会忽略任何逻辑错误吗?

编辑:我刚刚尝试将最后两行更改为:

self.curcord[0] += dx
self.curcord[1] += dy

我在显示值时尝试使用.real。即使价值现在是真实的,它们仍然是错误的。我将进一步研究这是否是由某些计算错误引起的。

1 个答案:

答案 0 :(得分:3)

由于您在上面的评论中说turnangle可以是任何整数,因此问题可以直接追溯到这一行:

d = 1.8120132*(d**0.8938054)

由于turnangle可能为负数,因此执行此行之前d的值也可能为负值;提升为任意十进制幂的负值通常为 complex

因此问题根本不在于trig功能。以上也让我相信你说的时候

  

同时打印dself.theta表示它们包含正确的值

......你只能在这一行之后这样做:

d = turnangle*2*3.14*2/360

这可以解释为什么你错误地认为问题必须在其他地方。

更新:

  1. 将变量设置为自身的某些功能是一种非常糟糕的习惯。尝试使用不同的变量名称以避免混淆 - 如上所述,我必须参考"此行"而不是他们的变量名。

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

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