Python Trig函数返回复数?

2024-03-29 13:51:08 发布

您现在位置:Python中文网/ 问答频道 /正文

在 我在写代码,它接受马达转动的程度,并使用这些数据来计算车轮所行驶的距离(使用距离=旋转次数*每次旋转所覆盖的距离)。在

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

最后,利用三角法计算沿x轴和y轴移动的距离。在

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

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.curcord也有有效值。然而,事实并非如此。打印self.curcord的两个元素将输出复数(一些大浮点+另一个大浮点j)。在

除了三角函数必须返回复数之外,我想不出任何逻辑解释。但是,我认为python内置lib函数返回错误值的可能性非常小。在

有什么逻辑上的错误我可以忽略吗?在

编辑:我刚试着把最后两行改成:

^{pr2}$

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


Tags: 函数self距离compassdef错误thetadx
1条回答
网友
1楼 · 发布于 2024-03-29 13:51:08

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

d = 1.8120132*(d**0.8938054)

由于turnangle可以是负数,因此在执行这行之前d的值也可以是负数;通常情况下,增加到任意小数次幂的负值是复杂的。在

因此问题根本不在于trig函数。以上也让我相信当你说

Printing both d and self.theta shows that they contain correct values

。。。你只是在这句话之后才这么做的:

^{pr2}$

这就解释了为什么你错误地认为问题一定在别处。在


更新:

  1. 像你那样把变量设置为某个函数本身是一个很坏的习惯。试着使用一个不同的变量名来避免混淆-正如你在上面看到的,我不得不引用“this line”而不是他们的变量名。

  2. 假设马达的行为是相同的,不管turnangle的符号是什么,这样的方法也许会起作用?在

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

相关问题 更多 >