别再死记硬背了!用Python画个图,5分钟搞懂三角函数和差公式的几何原理
用Python动态可视化三角函数和差公式的几何原理
三角函数和差公式是数学中的基础内容,但传统的死记硬背方式往往让学习者感到枯燥和难以理解。本文将带你用Python的matplotlib库,通过动态可视化的方式,直观地理解这些公式背后的几何原理。我们将从零开始编写代码,一步步构建图形,让你不仅能"看到"公式的成立,还能通过交互式操作加深理解。
1. 准备工作与环境搭建
在开始之前,我们需要确保你的Python环境已经安装了必要的库。如果你使用的是Anaconda发行版,这些库通常已经预装。如果没有,可以通过以下命令安装:
pip install matplotlib numpy
我们将主要使用matplotlib的pyplot模块进行绘图,以及numpy进行数学运算。这两个库是Python科学计算生态系统的核心组件,学会它们对你的编程之旅大有裨益。
为什么选择可视化学习? 研究表明,人类大脑处理视觉信息的速度比文字快6万倍。当我们把抽象的数学公式转化为直观的图形时,理解起来会容易得多。特别是对于三角函数这种与几何密切相关的概念,可视化方法尤为有效。
2. 绘制基础三角形结构
让我们从绘制一个单位圆和基本三角形开始。这是理解和差公式的基础几何结构。
import matplotlib.pyplot as plt
import numpy as np
def plot_basic_triangle(alpha=30, beta=15):
# 将角度转换为弧度
alpha_rad = np.radians(alpha)
beta_rad = np.radians(beta)
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.grid(True)
# 绘制单位圆
circle = plt.Circle((0, 0), 1, fill=False, color='blue', linestyle='--')
ax.add_patch(circle)
# 绘制初始角度α
x_alpha = np.cos(alpha_rad)
y_alpha = np.sin(alpha_rad)
ax.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
# 绘制角度β
x_beta = np.cos(alpha_rad + beta_rad)
y_beta = np.sin(alpha_rad + beta_rad)
ax.plot([x_alpha, x_beta], [y_alpha, y_beta], 'g-', label=f'β={beta}°')
# 连接原点
ax.plot([0, x_beta], [0, y_beta], 'b-', label=f'α+β={alpha+beta}°')
ax.legend()
plt.title('基本三角形结构')
plt.show()
plot_basic_triangle()
这段代码会绘制一个包含三个边的图形:
- 红色线段表示角度α
- 绿色线段表示从α末端开始的角度β
- 蓝色线段表示组合角度α+β
关键观察点 :
- 注意三条线段如何构成一个三角形
- 改变α和β的值(修改函数参数),观察图形如何变化
- 思考每条边的长度与三角函数值的关系
3. 可视化正弦和差公式
现在我们来重点观察正弦函数的和公式:sin(α+β) = sinαcosβ + cosαsinβ。我们将通过图形分解来展示这个等式的几何意义。
def visualize_sin_addition(alpha=30, beta=15):
alpha_rad = np.radians(alpha)
beta_rad = np.radians(beta)
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.grid(True)
# 单位圆和基本三角形
circle = plt.Circle((0, 0), 1, fill=False, color='blue', linestyle='--')
ax.add_patch(circle)
# 绘制角度α
x_alpha = np.cos(alpha_rad)
y_alpha = np.sin(alpha_rad)
ax.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
# 绘制角度α+β
x_alpha_beta = np.cos(alpha_rad + beta_rad)
y_alpha_beta = np.sin(alpha_rad + beta_rad)
ax.plot([0, x_alpha_beta], [0, y_alpha_beta], 'b-', label=f'α+β={alpha+beta}°')
# 分解sin(α+β)的组成部分
# 第一部分:sinαcosβ
part1_x = x_alpha
part1_y = y_alpha * np.cos(beta_rad)
ax.plot([0, part1_x], [0, part1_y], 'g--', label='sinαcosβ')
# 第二部分:cosαsinβ
part2_x = 0
part2_y = x_alpha * np.sin(beta_rad)
ax.plot([part1_x, part1_x], [part1_y, part1_y + part2_y], 'm--', label='cosαsinβ')
# 总和
ax.plot([0, part1_x], [0, part1_y + part2_y], 'k:', linewidth=2,
label=f'sin(α+β)={y_alpha_beta:.2f}')
ax.legend()
plt.title('正弦和公式的可视化分解')
plt.show()
visualize_sin_addition()
这段代码展示了如何将sin(α+β)分解为两部分:
- sinαcosβ(绿色虚线)
- cosαsinβ(品红色虚线)
交互实验建议 :
- 尝试不同的α和β值,观察分解部分如何变化
- 验证黑色虚线的总长度是否确实等于蓝色实线的y坐标(即sin(α+β))
- 特别注意当α或β为0时会发生什么
4. 可视化余弦和差公式
接下来我们来看余弦函数的和公式:cos(α+β) = cosαcosβ - sinαsinβ。同样,我们将通过图形来理解这个等式。
def visualize_cos_addition(alpha=30, beta=15):
alpha_rad = np.radians(alpha)
beta_rad = np.radians(beta)
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.grid(True)
# 单位圆和基本三角形
circle = plt.Circle((0, 0), 1, fill=False, color='blue', linestyle='--')
ax.add_patch(circle)
# 绘制角度α
x_alpha = np.cos(alpha_rad)
y_alpha = np.sin(alpha_rad)
ax.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
# 绘制角度α+β
x_alpha_beta = np.cos(alpha_rad + beta_rad)
y_alpha_beta = np.sin(alpha_rad + beta_rad)
ax.plot([0, x_alpha_beta], [0, y_alpha_beta], 'b-', label=f'α+β={alpha+beta}°')
# 分解cos(α+β)的组成部分
# 第一部分:cosαcosβ
part1_x = x_alpha * np.cos(beta_rad)
part1_y = 0
ax.plot([0, part1_x], [0, part1_y], 'g--', label='cosαcosβ')
# 第二部分:-sinαsinβ
part2_x = -y_alpha * np.sin(beta_rad)
part2_y = 0
ax.plot([part1_x, part1_x + part2_x], [part1_y, part1_y + part2_y], 'm--',
label='-sinαsinβ')
# 总和
ax.plot([0, part1_x + part2_x], [0, part1_y + part2_y], 'k:', linewidth=2,
label=f'cos(α+β)={x_alpha_beta:.2f}')
ax.legend()
plt.title('余弦和公式的可视化分解')
plt.show()
visualize_cos_addition()
这段代码展示了cos(α+β)的分解:
- cosαcosβ(绿色虚线)
- -sinαsinβ(品红色虚线)
关键观察点 :
- 注意第二部分是负值,这解释了公式中的减号
- 比较黑色虚线的x坐标与蓝色实线的x坐标(即cos(α+β))
- 思考当β=0时,公式简化为cosα = cosα·1 - sinα·0,这与图形显示一致吗?
5. 创建交互式可视化工具
为了让学习体验更加直观,我们可以创建一个交互式可视化工具,允许你实时调整角度并观察公式的变化。
from ipywidgets import interact, FloatSlider
def interactive_visualization(alpha=30, beta=15):
alpha_rad = np.radians(alpha)
beta_rad = np.radians(beta)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 8))
for ax in [ax1, ax2]:
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.grid(True)
circle = plt.Circle((0, 0), 1, fill=False, color='blue', linestyle='--')
ax.add_patch(circle)
# 正弦公式可视化
x_alpha = np.cos(alpha_rad)
y_alpha = np.sin(alpha_rad)
x_alpha_beta = np.cos(alpha_rad + beta_rad)
y_alpha_beta = np.sin(alpha_rad + beta_rad)
# 正弦分解
part1_y = y_alpha * np.cos(beta_rad)
part2_y = x_alpha * np.sin(beta_rad)
ax1.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
ax1.plot([0, x_alpha_beta], [0, y_alpha_beta], 'b-', label=f'α+β={alpha+beta}°')
ax1.plot([0, x_alpha], [0, part1_y], 'g--', label='sinαcosβ')
ax1.plot([x_alpha, x_alpha], [part1_y, part1_y + part2_y], 'm--', label='cosαsinβ')
ax1.plot([0, x_alpha], [0, part1_y + part2_y], 'k:', linewidth=2,
label=f'sin(α+β)={y_alpha_beta:.2f}')
ax1.set_title('正弦和公式的可视化')
ax1.legend()
# 余弦分解
part1_x = x_alpha * np.cos(beta_rad)
part2_x = -y_alpha * np.sin(beta_rad)
ax2.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
ax2.plot([0, x_alpha_beta], [0, y_alpha_beta], 'b-', label=f'α+β={alpha+beta}°')
ax2.plot([0, part1_x], [0, 0], 'g--', label='cosαcosβ')
ax2.plot([part1_x, part1_x + part2_x], [0, 0], 'm--', label='-sinαsinβ')
ax2.plot([0, part1_x + part2_x], [0, 0], 'k:', linewidth=2,
label=f'cos(α+β)={x_alpha_beta:.2f}')
ax2.set_title('余弦和公式的可视化')
ax2.legend()
plt.show()
interact(interactive_visualization,
alpha=FloatSlider(min=0, max=90, step=1, value=30),
beta=FloatSlider(min=0, max=90, step=1, value=15))
这个交互式工具允许你:
- 通过滑块调整α和β的角度
- 实时观察正弦和余弦公式的图形变化
- 验证公式在不同角度下的正确性
探索建议 :
- 尝试α=45°, β=30°,这是经典的测试案例
- 观察当α=β时,公式的特殊形式
- 尝试极端情况,如α或β接近0°或90°
6. 扩展到差公式和实际应用
理解了和公式后,差公式就变得简单了。我们只需要将β替换为-β,利用cos(-β)=cosβ和sin(-β)=-sinβ的性质:
def visualize_difference_formulas(alpha=45, beta=30):
alpha_rad = np.radians(alpha)
beta_rad = np.radians(beta)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 8))
for ax in [ax1, ax2]:
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.grid(True)
circle = plt.Circle((0, 0), 1, fill=False, color='blue', linestyle='--')
ax.add_patch(circle)
# 正弦差公式
x_alpha_beta = np.cos(alpha_rad - beta_rad)
y_alpha_beta = np.sin(alpha_rad - beta_rad)
part1_y = y_alpha * np.cos(beta_rad)
part2_y = -x_alpha * np.sin(beta_rad) # 注意负号
ax1.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
ax1.plot([0, x_alpha_beta], [0, y_alpha_beta], 'b-', label=f'α-β={alpha-beta}°')
ax1.plot([0, x_alpha], [0, part1_y], 'g--', label='sinαcosβ')
ax1.plot([x_alpha, x_alpha], [part1_y, part1_y + part2_y], 'm--',
label='-cosαsinβ')
ax1.plot([0, x_alpha], [0, part1_y + part2_y], 'k:', linewidth=2,
label=f'sin(α-β)={y_alpha_beta:.2f}')
ax1.set_title('正弦差公式: sin(α-β) = sinαcosβ - cosαsinβ')
ax1.legend()
# 余弦差公式
part1_x = x_alpha * np.cos(beta_rad)
part2_x = y_alpha * np.sin(beta_rad) # 注意正号
ax2.plot([0, x_alpha], [0, y_alpha], 'r-', label=f'α={alpha}°')
ax2.plot([0, x_alpha_beta], [0, y_alpha_beta], 'b-', label=f'α-β={alpha-beta}°')
ax2.plot([0, part1_x], [0, 0], 'g--', label='cosαcosβ')
ax2.plot([part1_x, part1_x + part2_x], [0, 0], 'm--', label='sinαsinβ')
ax2.plot([0, part1_x + part2_x], [0, 0], 'k:', linewidth=2,
label=f'cos(α-β)={x_alpha_beta:.2f}')
ax2.set_title('余弦差公式: cos(α-β) = cosαcosβ + sinαsinβ')
ax2.legend()
plt.show()
visualize_difference_formulas()
实际应用场景 :
- 物理学中的波叠加分析
- 工程学中的振动研究
- 计算机图形学中的旋转计算
- 信号处理中的相位分析
通过这种可视化方法,你不仅记住了公式,更重要的是理解了它们背后的几何意义。这种理解远比死记硬背更加深刻和持久。
更多推荐

所有评论(0)