Python手动实现 sin(x) 和 cos(x) 函数,不用库函数
手动实现 sin(x)sin(x)sin(x) 和 cos(x)cos(x)cos(x) 函数
我们将使用泰勒展开式来近似计算 sin(x)sin(x)sin(x) 和 cos(x)cos(x)cos(x),不使用 Python 内置的 sin()sin()sin() 和 cos()cos()cos() 函数。通过多项式展开,我们可以计算这些三角函数的近似值。
sin(x)sin(x)sin(x) 的泰勒展开式
sin(x)sin(x)sin(x) 的泰勒展开式为:
sin(x)=x−x33!+x55!−x77!+⋯ \sin(x) = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \cdots sin(x)=x−3!x3+5!x5−7!x7+⋯
其中,第 nnn 项的形式为:
(−1)nx2n+1(2n+1)! \frac{(-1)^n x^{2n+1}}{(2n+1)!} (2n+1)!(−1)nx2n+1
我们可以通过不断加上每一项,直到达到足够的精度。
cos(x)cos(x)cos(x) 的泰勒展开式
cos(x)cos(x)cos(x) 的泰勒展开式为:
cos(x)=1−x22!+x44!−x66!+⋯ \cos(x) = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \cdots cos(x)=1−2!x2+4!x4−6!x6+⋯
每一项的形式为:
(−1)nx2n(2n)! \frac{(-1)^n x^{2n}}{(2n)!} (2n)!(−1)nx2n
同样地,我们通过不断添加每一项来逼近 cos(x)cos(x)cos(x) 的值。
代码详解
-
阶乘计算函数:
def factorial(n): result = 1 for i in range(1, n + 1): result *= i return result这个函数通过一个循环计算 n!n!n! 的值。我们用它来计算泰勒展开式中的每一项的阶乘部分。
-
计算 sin(x)sin(x)sin(x) 的函数:
def my_sin(x, n_terms=10): result = 0 for n in range(n_terms): term = ((-1)**n) * (x**(2*n + 1)) / factorial(2*n + 1) result += term return result该函数通过 nnn 项泰勒展开式来计算 sin(x)sin(x)sin(x)。每一项的计算公式为:
(−1)nx2n+1(2n+1)! \frac{(-1)^n x^{2n+1}}{(2n+1)!} (2n+1)!(−1)nx2n+1
n_terms是展开项的个数。通过增加项数,可以提高计算精度。 -
计算 cos(x)cos(x)cos(x) 的函数:
def my_cos(x, n_terms=10): result = 0 for n in range(n_terms): term = ((-1)**n) * (x**(2*n)) / factorial(2*n) result += term return result与 sin(x)sin(x)sin(x) 类似,cos(x)cos(x)cos(x) 也是通过泰勒展开计算的,每一项的公式为:
(−1)nx2n(2n)! \frac{(-1)^n x^{2n}}{(2n)!} (2n)!(−1)nx2n
-
生成 xxx 值并绘制图形:
x_values = np.linspace(-2*np.pi, 2*np.pi, 400) sin_values = [my_sin(x) for x in x_values] cos_values = [my_cos(x) for x in x_values]这里使用
np.linspace函数生成从 −2π-2\pi−2π 到 2π2\pi2π 的 400 个点,并计算每个点对应的 sin(x)sin(x)sin(x) 和 cos(x)cos(x)cos(x) 的值。 -
绘制图形:
plt.figure(figsize=(10, 6)) plt.plot(x_values, sin_values, label=r'$\sin(x)$', color='b') plt.plot(x_values, cos_values, label=r'$\cos(x)$', color='r') plt.title(r'$\sin(x)$ 和 $\cos(x)$ 图像') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.grid(True) plt.show()这里使用
matplotlib来绘制 sin(x)sin(x)sin(x) 和 cos(x)cos(x)cos(x) 的曲线,并为图形添加了标题、坐标轴标签、图例以及网格。
完整版代码实现
import numpy as np
import matplotlib.pyplot as plt
# 计算阶乘的辅助函数
def factorial(n):
"""计算n的阶乘"""
result = 1
for i in range(1, n + 1):
result *= i # 计算n!
return result
# 手动实现sin(x)函数
def my_sin(x, n_terms=10):
"""使用泰勒展开计算sin(x)"""
result = 0 # 初始化sin(x)的结果
for n in range(n_terms):
# 计算每一项的值
term = ((-1)**n) * (x**(2*n + 1)) / factorial(2*n + 1)
result += term # 累加每一项的值
return result
# 手动实现cos(x)函数
def my_cos(x, n_terms=10):
"""使用泰勒展开计算cos(x)"""
result = 0 # 初始化cos(x)的结果
for n in range(n_terms):
# 计算每一项的值
term = ((-1)**n) * (x**(2*n)) / factorial(2*n)
result += term # 累加每一项的值
return result
# 生成x值,从-2π到2π,共400个点
x_values = np.linspace(-2*np.pi, 2*np.pi, 400)
# 计算每个x值对应的sin(x)和cos(x)的值
sin_values = [my_sin(x) for x in x_values]
cos_values = [my_cos(x) for x in x_values]
# 绘制图形
plt.figure(figsize=(10, 6)) # 设置图形的大小
plt.plot(x_values, sin_values, label=r'$\sin(x)$', color='b') # 绘制sin(x)曲线
plt.plot(x_values, cos_values, label=r'$\cos(x)$', color='r') # 绘制cos(x)曲线
plt.title(r'$\sin(x)$ 和 $\cos(x)$ 图像') # 设置图像标题
plt.xlabel('x') # 设置x轴标签
plt.ylabel('y') # 设置y轴标签
plt.legend() # 显示图例
plt.grid(True) # 显示网格
plt.show() # 显示图形
结果
运行代码后,将得到一个图形,如下图所示,展示了 sin(x)sin(x)sin(x) 和 cos(x)cos(x)cos(x) 的曲线。通过泰勒展开的方式,随着展开项数的增加,函数值的近似精度也会逐渐提高。


浙公网安备 33010602011771号