鸢尾花书实践和知识记录[数学要素3-3几何]

书的作者

文章目录

  • 思维导图
  • 使用到的函数
  • 几何的介绍(略)
  • 点线面和定义
    • 欧几里得几何原本的公理
    • 正多边形
      • 代码:如何绘制正多边形
    • 三维的几何体
      • 柏拉图立体
      • 几何变换
  • 角度和弧度
    • 角度
    • 弧度
    • 正负角(相位)
    • 三个角
  • 勾股定理到三角函数
    • 勾股定理
    • 三角函数
    • 反三角函数
    • 余弦定理
    • 代码:
      • 三角函数
      • 反三角函数
      • 余弦定理求边
      • 余弦定理求角
  • 圆周率割圆术
    • 阿基米德的方法

思维导图

在这里插入图片描述

使用到的函数

在这里插入图片描述

几何的介绍(略)

在这里插入图片描述
在这里插入图片描述

点线面和定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
等高线比较重要,应用多
曲线的切线使用极限和微积分工具来解
在这里插入图片描述
在这里插入图片描述

欧几里得几何原本的公理

在这里插入图片描述在这里插入图片描述

正多边形

在这里插入图片描述

代码:如何绘制正多边形

import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon, Circle
import numpy as np

for num_vertices in [3,4,5,6,7,8]:
    
    #创建几个子图
    fig, ax = plt.subplots()
    
    ax.set_aspect('equal')
    #使x和y的长度相同
    #规则正多边形使用。RegularPolygon创建具有指定顶点数的正六边形,并将其添加到坐标轴中。设置半径、不透明度和边缘颜色。
    hexagon_inner = RegularPolygon((0,0), numVertices=num_vertices, 
                                   radius=1, alpha=0.2, edgecolor='k')
    
    # RegularPolygon,matplotlib中还有Rectangle,Circle,Arrow等各种补丁对象
    #将补丁对象输出到对应的轴
    ax.add_patch(hexagon_inner)
    
    plt.axis('off')
    
    plt.xlim(-1.5,1.5)
    plt.ylim(-1.5,1.5)
    plt.show()

三维的几何体

在这里插入图片描述

柏拉图立体

在这里插入图片描述
在这里插入图片描述

几何变换

在函数变换、线性变换、多元高斯分布等话题中用到几何变换。
在这里插入图片描述
投影
这个概念可以进行一定的泛化。
在这里插入图片描述

角度和弧度

角度

在这里插入图片描述

弧度

在这里插入图片描述

正负角(相位)

在这里插入图片描述

三个角

在这里插入图片描述

勾股定理到三角函数

勾股定理

在这里插入图片描述
在这里插入图片描述

三角函数

在这里插入图片描述
在这里插入图片描述

反三角函数

在这里插入图片描述

余弦定理

在这里插入图片描述

代码:

三角函数

import math

# 输入角度(单位:度)
angle_deg = 45
# 将角度转换为弧度
angle_rad = math.radians(angle_deg)

# 计算三角函数
sin_val = math.sin(angle_rad)  # 正弦
cos_val = math.cos(angle_rad)  # 余弦
tan_val = math.tan(angle_rad)  # 正切

print(f"Sin({angle_deg}°) = {sin_val}")
print(f"Cos({angle_deg}°) = {cos_val}")
print(f"Tan({angle_deg}°) = {tan_val}")

反三角函数

# 已知正弦值
sin_val = 0.707

# 计算反三角函数
angle_rad_asin = math.asin(sin_val)  # 反正弦
angle_deg_asin = math.degrees(angle_rad_asin)  # 弧度转换为角度

print(f"Asin({sin_val}) = {angle_deg_asin}°")

使用numpy

import numpy as np

# 假设我们有一个数组表示正弦、余弦、正切值
sin_values = np.array([0.5, 0.707, 1.0])
cos_values = np.array([0.866, 0.707, 0.0])
tan_values = np.array([0.577, 1.0, np.inf])  # np.inf 表示正切值无穷大(90度)

# 反正弦
asin_values = np.degrees(np.arcsin(sin_values))  # 结果是弧度,转换为角度
print("Arcsin values (in degrees):", asin_values)

# 反余弦
acos_values = np.degrees(np.arccos(cos_values))  # 结果是弧度,转换为角度
print("Arccos values (in degrees):", acos_values)

# 反正切
atan_values = np.degrees(np.arctan(tan_values))  # 结果是弧度,转换为角度
print("Arctan values (in degrees):", atan_values)

numpy 中,你可以使用 numpy 模块来计算反三角函数。numpy 提供了与 math 模块类似的函数,支持数组操作和批量计算,非常适合处理大量数据。

Arcsin values (in degrees): [30.      45.00001764 90.     ]
Arccos values (in degrees): [ 30.      45.00001764  90.     ]
Arctan values (in degrees): [30.00000083 45.         90.        ]
  • np.arcsin()np.arccos() 的输入值必须在 [-1, 1] 之间,因为这些是正弦和余弦的值域。
  • np.arctan() 没有这种限制,任何实数都可以作为输入。
  • 结果默认是以弧度表示的,如果需要角度,可以使用 np.degrees() 将弧度转换为角度。

这样,你就可以使用 numpy 批量计算反三角函数,非常适合大规模数据处理。

余弦定理求边

c 2 = a 2 + b 2 − 2 a b ⋅ cos ⁡ ( θ ) c^2=a^2+b^2-2ab\cdot\cos(\theta) c2=a2+b22abcos(θ)

def cosine_law(a, b, angle_deg):
    # 将角度转换为弧度
    angle_rad = math.radians(angle_deg)
    # 计算 c 的长度
    c = math.sqrt(a**2 + b**2 - 2 * a * b * math.cos(angle_rad))
    return c

# 示例:已知 a=5, b=7, 夹角为60度,求 c
a = 5
b = 7
angle_deg = 60
c = cosine_law(a, b, angle_deg)

print(f"Using the cosine law, c = {c}")

余弦定理求角

cos ⁡ ( θ ) = a 2 + b 2 − c 2 2 a b \cos(\theta)=\frac{a^2+b^2-c^2}{2ab} cos(θ)=2aba2+b2c2

def cosine_law_angle(a, b, c):
    # 计算夹角的余弦值
    cos_theta = (a**2 + b**2 - c**2) / (2 * a * b)
    # 计算角度(弧度)
    angle_rad = math.acos(cos_theta)
    # 将弧度转换为角度
    angle_deg = math.degrees(angle_rad)
    return angle_deg

# 示例:已知 a=5, b=7, c=8,求夹角
a = 5
b = 7
c = 8
theta_deg = cosine_law_angle(a, b, c)

print(f"Angle between a and b is {theta_deg}°")

圆周率割圆术

在这里插入图片描述
内接和外切正多边形的圆形逼近
在这里插入图片描述

import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon, Circle
import numpy as np

# 循环遍历num_vertices的值
for num_vertices in [6,8,10,12,14,16]:
    
    # 创建一个图形和坐标轴
    fig, ax = plt.subplots()
    ax.set_aspect('equal')
    
    # 创建一个内六边形,num_vertices为边数,radius为半径,alpha为透明度,edgecolor为边框颜色
    hexagon_inner = RegularPolygon((0,0), numVertices=num_vertices, 
                                   radius=1, alpha=0.2, edgecolor='k')
    #Patch是多边形对象
    ax.add_patch(hexagon_inner)
    
    # 创建一个外六边形,num_vertices为边数,radius为半径,alpha为透明度,edgecolor为边框颜色
    hexagon_outer = RegularPolygon((0,0), numVertices=num_vertices, 
                                   radius=1/np.cos(np.pi/num_vertices), 
                                   alpha=0.2, edgecolor='k')
    ax.add_patch(hexagon_outer)
    
    # 创建一个圆形,radius为半径,facecolor为填充颜色,edgecolor为边框颜色
    circle = Circle((0,0), radius=1, facecolor = 'none', edgecolor='k')
    ax.add_patch(circle)
    
    # 关闭坐标轴
    plt.axis('off')
    
    # 设置坐标轴范围
    plt.xlim(-1.5,1.5)
    plt.ylim(-1.5,1.5)
    
    # 显示图形
    plt.show()

在这里插入图片描述

关键代码:内切多边形和外切多边形的R怎么计算的
在这里插入图片描述
在这里插入图片描述
此处类似于三角函数的那个基础等价代换的推导和逼近。
不等式,在无穷处逼近
周长的逼近
在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
#生成x
n_start = 6
n_stop  = 50
n_array = np.linspace(n_start,n_stop,n_stop-n_start + 1)
#两个估计的边界,此处直接使用向量的乘法
pi_lower_b = np.sin(np.pi/n_array)*n_array
pi_upper_b = np.tan(np.pi/n_array)*n_array

fig, ax = plt.subplots()
#平行于x的线
plt.axhline(y=np.pi, color='r', linestyle='-')
#两个曲线
plt.plot(n_array,pi_lower_b, color = 'b')
plt.plot(n_array,pi_upper_b, color = 'g')
#填充
plt.fill_between(n_array, pi_lower_b, pi_upper_b, color = '#DEEAF6')
plt.tight_layout()
plt.xlabel('Number of sides, n')
plt.ylabel('Estimate of $\pi$')

阿基米德的方法

在这里插入图片描述
t a n ( α / 2 ) = s i n α / ( 1 + c o s α ) = ( 1 − c o s α ) / s i n α tan(\alpha/2)=sin\alpha/(1+cos\alpha)=(1-cos\alpha)/sin\alpha tan(α/2)=sinα/(1+cosα)=(1cosα)/sinα
可证明下式成立
在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

n_start = 6

B_6 = np.sin(np.pi/n_start)*n_start
A_6 = np.tan(np.pi/n_start)*n_start
#列表
B_array = []
A_array = []
n_array = [6,12,24,48,96]

B_i = B_6
A_i = A_6
n_i = n_start

for i in n_array:
    
    B_array.append(B_i)
    A_array.append(A_i)
    
    # updating
    A_i = 2*A_i*B_i/(A_i + B_i)
    B_i = np.sqrt(A_i*B_i)
#转换为np数组
B_array = np.array(B_array)
A_array = np.array(A_array)
n_array = np.array(n_array)

fig, ax = plt.subplots()

plt.axhline(y=np.pi, color='r', linestyle='-')
plt.plot(n_array,B_array, color = 'b', marker = 'x')
plt.plot(n_array,A_array, color = 'g', marker = 'x')
plt.fill_between(n_array, B_array, A_array, color = '#DEEAF6')
plt.tight_layout()
plt.xticks([6,12,24,48,96])
plt.xlim((6,96))
plt.xlabel('Number of sides, n')
plt.ylabel('Estimate of $\pi$')
plt.show()

在这里插入图片描述

上一篇:Python 绘图艺术:解锁数据故事的三把密钥


下一篇:CSS中字体图标的使用