【问题标题】:The arctangent of tangent x is not calculated precisely正切 x 的反正切没有精确计算
【发布时间】:2019-07-10 06:32:46
【问题描述】:

我的 Python 程序需要正切、反正切函数。我尝试了 np.arctan 和 np.tan 但观察到一个奇怪的行为。原则上,某个数字的正切的反正切就是数字本身,但下面的代码并没有给出精确的值。

import numpy as np
x = 10
print(np.arctan(np.tan(x)))

当我将 x 更改为 2*x 或 3*x 时,结果会更加不准确。 我尝试了 math.tan、math.atan,但结果是一样的。

谁能解释一下为什么会发生(这两个函数中的哪一个是错误的),在什么情况下应该小心使用反正切函数和正切函数?

【问题讨论】:

    标签: python python-3.x numpy math trigonometry


    【解决方案1】:

    注意三点:

    1. 在 python 中(就像我见过的所有编程语言一样)三角函数使用 radians 中的角度,即范围 [0, 2*pi) 代表“完整的圆”
    2. tan 是周期性的:tan(x) = tan(pi + x)(再次注意这是弧度;在 python 中 tan(x) = tan(180 + x) 不是真的!)。
    3. arctan 返回 [-pi/2, pi/2) 中的值。

    在您的示例中,您依赖 正确 结果为[-pi/2, pi/2)

    import numpy as np
    
    x = 10
    print(np.arctan(np.tan(x)))  # 0.575222039231
    print(10 % (np.pi / 2))      # 0.5752220392306207
    

    您的函数np.arctan(np.tan(x)) 相当于(计算成本较低)

    def arctan_tan(x):
        ret = x % np.pi
        if ret > np.pi / 2:
            ret -= np.pi
        return ret
    

    【讨论】:

    • math.remainder(x, math.pi)arctan_tan 函数的一种很好的拼写方式,但它仅在 Python >= 3.7 中可用,并且还没有 NumPy 等效项(但请参阅 github.com/numpy/numpy/pull/9963)。
    • @MarkDickinson 那么math.remainder(x, pi)x % pi 有什么区别呢? (np.remainder 将广播,我假设)。
    • 假设y 为正,math.remainder(x, y) 减少到区间[-y/2, y/2],而不是[0, y]。这是 IEEE 754(和 C 标准)中指定的余数运算。它具有 IEEE 754 算术的优良特性,结果总是精确计算,没有舍入误差。 (当x 为正时,最后一部分也适用于x % y,但不一定适用于负x。)
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多