Python中的三角函数:sin和cos
困难2用Python玩转三角函数:sin和cos的奥秘
想象你站在一个巨大的摩天轮上。当摩天轮转动时,你的位置会有两个有趣的数据:你离地面的高度(就像 sin 函数),以及你离中心点的水平距离(就像 cos 函数)。在Python中,我们可以用 math.sin 和 math.cos 来计算这些值,它们能帮你解决很多和角度、位置有关的问题,比如做游戏、画动画、甚至模拟过山车的轨道。
1. 正弦和余弦到底是什么?
还是用摩天轮来说:
- 假设摩天轮的半径是1(这样数字简单),你坐在一个座位上。
- 当座位从最右端(3点钟方向)开始逆时针旋转,sin(角度) 就是你的 高度(从地面到座位中心的垂直距离),向上为正,向下为负。
- cos(角度) 就是你的 水平距离(从摩天轮中心到你的水平偏移),向右为正,向左为负。
比如:
- 0°时,你在最右边:高度 = 0(sin0=0),水平距离 = 1(cos0=1)。
- 90°时,你在最顶部:高度 = 1(sin90=1),水平距离 = 0(cos90=0)。
- 180°时,你在最左边:高度 = 0(sin180=0),水平距离 = -1(cos180=-1)。
- 360°时,你回到起点,一切又回到0°的值。
这些值永远在-1到1之间,就像你永远不能离开摩天轮的边缘一样。
2. 为什么Python要用“弧度”而不是“度”?
你可能习惯用“度”(比如30°、90°),但Python的三角函数 math.sin() 和 math.cos() 只接受 弧度 作为参数。
弧度是另一种测量角度的方法:一个完整的圆周是 2π 弧度(约6.283),而180°对应 π 弧度。类比温度:摄氏度和华氏度都能表示温度,但需要转换。同样,我们需要把“度”转换成“弧度”。
转换公式:
- 弧度 = 度 × π / 180
- 或者直接用 Python 提供的
math.radians(度数)函数。
例如:
- 30° = π/6 ≈ 0.5236 弧度
- 45° = π/4 ≈ 0.7854 弧度
- 60° = π/3 ≈ 1.0472 弧度
- 90° = π/2 ≈ 1.5708 弧度
3. 如何用Python计算sin和cos?
先导入 math 库,然后用 math.radians() 转换角度,再调用 math.sin() 或 math.cos()。下面是一个完整的例子,包含多个常用角度:
import math
# 定义一个带中文注释的列表,存放要测试的角度(度)
test_degrees = [0, 30, 45, 60, 90, 120, 180, 270, 360]
print("角度(度) | 弧度(近似) | 正弦(sin) | 余弦(cos)")
print("----------------------------------------------")
for deg in test_degrees:
# 将度转换为弧度
rad = math.radians(deg)
# 计算正弦和余弦值,保留4位小数
sin_val = math.sin(rad)
cos_val = math.cos(rad)
print(f"{deg:>6}° | {rad:>8.4f} | {sin_val:>8.4f} | {cos_val:>8.4f}")
运行结果会像这样(实际浮点数可能略有差异):
角度(度) | 弧度(近似) | 正弦(sin) | 余弦(cos)
----------------------------------------------
0° | 0.0000 | 0.0000 | 1.0000
30° | 0.5236 | 0.5000 | 0.8660
45° | 0.7854 | 0.7071 | 0.7071
60° | 1.0472 | 0.8660 | 0.5000
90° | 1.5708 | 1.0000 | 0.0000
120° | 2.0944 | 0.8660 | -0.5000
180° | 3.1416 | 0.0000 | -1.0000
270° | 4.7124 | -1.0000 | -0.0000
360° | 6.2832 | -0.0000 | 1.0000
注意:90°时 sin=1,cos=0;180°时 sin=0,cos=-1。这些规律可以帮你检查自己的计算是否正确。
4. 生活中的有趣应用
- 游戏编程:如果你想在屏幕上画一个角色围绕中心旋转,可以用
x = center_x + radius * cos(角度),y = center_y + radius * sin(角度)来获取角色位置。 - 制作动画:利用sin值在-1到1之间来回变化,可以让小兔子上下跳动(高度 = sin(时间))。
- 秋千与滑梯:sin代表你离地的高度(秋千荡到最高点时高度最大),cos代表你左右摆动的距离(从中心到两侧)。
- 计算影子长度:如果太阳高度角是θ,一根1米高的杆子的影子长度是 1 / tan(θ),但tan可以由sin/cos得到。
5. 新手最容易犯的错误
- 忘记导入 math 库:直接写
math.sin(30)会报错NameError,必须先写import math。 - 直接用度数调用 sin 和 cos:比如
math.sin(30)会把30当作弧度(也就是约1718.87°),结果很奇怪。一定要先用math.radians()转换。 - 混淆角度和弧度:如果从别的代码里拿到一个弧度值,就不要再转换了;如果拿到度数,必须转换。
- 浮点数精度问题:有时
math.sin(math.pi)不会精确等于0,而是接近0的一个极小数字(如1.224e-16)。这是计算机浮点数运算的正常现象,可以用round(值, 6)来保留6位小数忽略误差。 - 忘记返回值范围:sin和cos的结果永远在-1到1之间。如果程序里出现超过1的值,肯定是参数错了(比如忘了转换单位)。
6. 完整示例:模拟摩天轮上座舱的位置
下面的程序让用户输入一个角度(度),然后输出该角度对应的摩天轮上座舱的高度和水平距离(假设摩天轮半径=100米,中心离地面50米)。
import math
# 用户输入角度(度),例如45
angle_deg = float(input("请输入摩天轮转过的角度(度):"))
# 将角度转换为弧度
angle_rad = math.radians(angle_deg)
# 摩天轮半径100米,中心距地面50米
radius = 100 # 半径
center_height = 50 # 中心离地面高度
# 计算座舱的相对位置(以半径为1时的值)
relative_height = math.sin(angle_rad) # 相对高度(-1 ~ 1)
relative_horiz = math.cos(angle_rad) # 相对水平距离(-1 ~ 1)
# 乘以半径得到实际偏移量
actual_height_offset = radius * relative_height # 相对于中心的垂直偏移
actual_horiz_offset = radius * relative_horiz # 相对于中心的水平偏移
# 座舱实际离地高度 = 中心高度 + 垂直偏移
cabin_height = center_height + actual_height_offset
# 座舱实际水平位置 = 中心水平位置(设为0) + 水平偏移
cabin_horiz = 0 + actual_horiz_offset
# 输出结果,保留2位小数
print(f"角度 {angle_deg:.2f}° 时:")
print(f" 座舱高度 {cabin_height:.2f} 米")
print(f" 座舱水平偏移 {cabin_horiz:.2f} 米")
如果输入30,输出:
角度 30.00° 时:
座舱高度 100.00 米
座舱水平偏移 86.60 米
(因为30°时,sin=0.5,cos≈0.866,半径100,所以高度=50+1000.5=100,水平偏移=1000.866=86.6)
7. 还想了解更多?
- math.tan():计算正切,即 sin/cos。
- math.asin, math.acos:反正弦、反余弦,从数值反推角度(返回值是弧度)。
- math.degrees():把弧度转换成度,和
math.radians()相反。 - math.pi:圆周率π的精确值,方便直接使用。
- 画圆与螺旋:结合
turtle库或pygame,用 sin/cos 绘制各种图形。
现在,你可以试着用 sin/cos 来做一个简单的“弹簧小人”动画,或者计算一个斜坡的高度和宽度。数学函数就像工具箱里的扳手,用熟了就能解决很多有趣的问题!
例题精讲
在Python的math库中,math.sin()和math.cos()函数的参数单位是什么?
执行以下代码,输出结果最接近哪个值?import math; print(math.cos(math.radians(60)))
在Python中,math.sin(math.pi / 2) 的结果等于0。
以下代码计算30度的正弦值和60度的余弦值,请补充完整。import math
deg1 = 30
deg2 = 60
rad1 = ___(deg1)
rad2 = ___(deg2)
sin_val = math.sin(rad1)
cos_val = math.cos(rad2)
print(sin_val, cos_val)执行如下Python代码,输出结果是什么?import math; print(math.cos(math.pi))