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)=x3!x3+5!x57!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)=12!x2+4!x46!x6+

每一项的形式为:

(−1)nx2n(2n)! \frac{(-1)^n x^{2n}}{(2n)!} (2n)!(1)nx2n

同样地,我们通过不断添加每一项来逼近 cos(x)cos(x)cos(x) 的值。

代码详解

  1. 阶乘计算函数:

    def factorial(n):
        result = 1
        for i in range(1, n + 1):
            result *= i
        return result
    

    这个函数通过一个循环计算 n!n!n! 的值。我们用它来计算泰勒展开式中的每一项的阶乘部分。

  2. 计算 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 是展开项的个数。通过增加项数,可以提高计算精度。

  3. 计算 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

  4. 生成 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\pi2π2π2\pi2π 的 400 个点,并计算每个点对应的 sin(x)sin(x)sin(x)cos(x)cos(x)cos(x) 的值。

  5. 绘制图形:

    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) 的曲线。通过泰勒展开的方式,随着展开项数的增加,函数值的近似精度也会逐渐提高。

在这里插入图片描述

posted @ 2025-07-27 01:33  晓律  阅读(41)  评论(0)    收藏  举报  来源