当前位置: 首页 > news >正文

泰勒级数 (Taylor Series) 动画展示 包括源码

泰勒级数 (Taylor Series) 动画展示 包括源码

flyfish

泰勒级数(英语:Taylor series)用无限项连加式 - 级数来表示一个函数,这些相加的项由函数在某一点的导数求得。
定义了一个函数f(x)表示要近似的函数 sin ⁡ ( x ) \sin(x) sin(x),以及一个函数taylor_series(x, n)来计算泰勒级数的前n项。动画展示了泰勒级数如何逐步逼近 sin ⁡ ( x ) \sin(x) sin(x)函数。这个例子展示了泰勒级数的逼近效果,以及随着项数的增加,近似效果变得更好。
在这里插入图片描述

)

级数 (Series)

定义

级数是数列求和的过程。具体来说,给定一个数列 a 1 , a 2 , a 3 , … a_1, a_2, a_3, \ldots a1,a2,a3,,它的级数是所有项相加得到的总和: S = a 1 + a 2 + a 3 + ⋯ S = a_1 + a_2 + a_3 + \cdots S=a1+a2+a3+
通常我们会使用符号表示:
S = ∑ n = 1 ∞ a n S = \sum_{n=1}^{\infty} a_n S=n=1an

收敛与发散

一个级数可以是收敛的,也可以是发散的。如果级数的部分和 S n = ∑ n = 1 N a n S_n = \sum_{n=1}^{N} a_n Sn=n=1Nan N N N 趋向于无穷大时趋向于某个有限的值 L L L,则称该级数是收敛的,记作: ∑ n = 1 ∞ a n = L \sum_{n=1}^{\infty} a_n = L n=1an=L
否则称该级数是发散的。

泰勒级数 (Taylor Series)

定义

泰勒级数是一种特殊的级数,用于表示一个函数在某点附近的近似。对于一个在 x = a x = a x=a 点具有 n n n 阶可导数的函数 f ( x ) f(x) f(x),它的泰勒级数可以表示为: f ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + f ′ ′ ′ ( a ) 3 ! ( x − a ) 3 + ⋯ f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \frac{f'''(a)}{3!}(x-a)^3 + \cdots f(x)=f(a)+f(a)(xa)+2!f′′(a)(xa)2+3!f′′′(a)(xa)3+
一般地,泰勒级数的形式为:
f ( x ) = ∑ n = 0 ∞ f ( n ) ( a ) n ! ( x − a ) n f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x - a)^n f(x)=n=0n!f(n)(a)(xa)n其中, f ( n ) ( a ) f^{(n)}(a) f(n)(a) 表示函数 f ( x ) f(x) f(x) x = a x = a x=a 处的第 n n n 阶导数, n ! n! n! 表示 n n n 的阶乘。

麦克劳林级数

泰勒级数在 a = 0 a = 0 a=0 时的特殊形式称为麦克劳林级数(Maclaurin Series): f ( x ) = f ( 0 ) + f ′ ( 0 ) x + f ′ ′ ( 0 ) 2 ! x 2 + f ′ ′ ′ ( 0 ) 3 ! x 3 + ⋯ f(x) = f(0) + f'(0)x + \frac{f''(0)}{2!}x^2 + \frac{f'''(0)}{3!}x^3 + \cdots f(x)=f(0)+f(0)x+2!f′′(0)x2+3!f′′′(0)x3+
即:
f ( x ) = ∑ n = 0 ∞ f ( n ) ( 0 ) n ! x n f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(0)}{n!} x^n f(x)=n=0n!f(n)(0)xn

例子

用无限项连加式——级数来表示一个函数,这些相加的项由函数在某一点的导数求得。

1. 指数函数的泰勒级数

对于函数 e x e^x ex,它在 x = 0 x = 0 x=0 处的泰勒级数(也是麦克劳林级数)为: e x = 1 + x + x 2 2 ! + x 3 3 ! + ⋯ = ∑ n = 0 ∞ x n n ! e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots = \sum_{n=0}^{\infty} \frac{x^n}{n!} ex=1+x+2!x2+3!x3+=n=0n!xn

2. 正弦函数的泰勒级数

对于函数 sin ⁡ ( x ) \sin(x) sin(x),它在 x = 0 x = 0 x=0 处的泰勒级数(麦克劳林级数)为: sin ⁡ ( x ) = x − x 3 3 ! + x 5 5 ! − ⋯ = ∑ n = 0 ∞ ( − 1 ) n x 2 n + 1 ( 2 n + 1 ) ! \sin(x) = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdots = \sum_{n=0}^{\infty} \frac{(-1)^n x^{2n+1}}{(2n+1)!} sin(x)=x3!x3+5!x5=n=0(2n+1)!(1)nx2n+1

前几项展开式为:
sin ⁡ ( x ) ≈ x − x 3 3 ! + x 5 5 ! − x 7 7 ! + ⋯ \sin(x) \approx x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \cdots sin(x)x3!x3+5!x57!x7+
通过增加项数,可以使泰勒多项式对原函数的近似更加精确。

动画源码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation# 定义泰勒级数逼近的项数
N = 10# 定义函数和泰勒级数的函数
def f(x):return np.sin(x)def taylor_series(x, n):result = 0for i in range(n + 1):result += ((-1)**i * x**(2 * i + 1)) / np.math.factorial(2 * i + 1)return result# 创建图形和轴
fig, ax = plt.subplots()
x = np.linspace(-2 * np.pi, 2 * np.pi, 1000)
y = f(x)
line, = ax.plot(x, y, label='sin(x)')
line_taylor, = ax.plot([], [], label='Taylor Series')
ax.set_ylim(-2, 2)
ax.legend()# 初始化函数
def init():line_taylor.set_data([], [])return line_taylor,# 更新函数
def update(n):y_taylor = taylor_series(x, n)line_taylor.set_data(x, y_taylor)ax.set_title(f'Taylor Series Approximation with {n} terms')return line_taylor,# 创建动画
ani = animation.FuncAnimation(fig, update, frames=N, init_func=init, blit=True)# 保存动画为GIF
ani.save('taylor_series_approximation.gif', writer='imagemagick')plt.show()

应用

用泰勒级数在某一点上近似计算一个函数的值。
使用泰勒级数近似计算 e x e^x ex x = 0.1 x = 0.1 x=0.1 处的值, e x e^x ex 的泰勒级数(在 x = 0 x = 0 x=0 处展开)是: e x = 1 + x + x 2 2 ! + x 3 3 ! + x 4 4 ! + ⋯ e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots ex=1+x+2!x2+3!x3+4!x4+为了近似计算 e 0.1 e^{0.1} e0.1,我们可以只取前几项进行计算。

第一步:计算各项的值
  • x = 0.1 x = 0.1 x=0.1

  • e x ≈ 1 + x + x 2 2 ! + x 3 3 ! + x 4 4 ! e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} ex1+x+2!x2+3!x3+4!x4

第二步:逐项计算
  1. 第一项: 1 1 1

  2. 第二项: 0.1 0.1 0.1

  3. 第三项: ( 0.1 ) 2 2 ! = 0.01 2 = 0.005 \frac{(0.1)^2}{2!} = \frac{0.01}{2} = 0.005 2!(0.1)2=20.01=0.005

  4. 第四项: ( 0.1 ) 3 3 ! = 0.001 6 ≈ 0.000167 \frac{(0.1)^3}{3!} = \frac{0.001}{6} \approx 0.000167 3!(0.1)3=60.0010.000167

  5. 第五项: ( 0.1 ) 4 4 ! = 0.0001 24 ≈ 0.00000417 \frac{(0.1)^4}{4!} = \frac{0.0001}{24} \approx 0.00000417 4!(0.1)4=240.00010.00000417

第三步:求和

将这些项相加:
e 0.1 ≈ 1 + 0.1 + 0.005 + 0.000167 + 0.00000417 ≈ 1.10517117 e^{0.1} \approx 1 + 0.1 + 0.005 + 0.000167 + 0.00000417 \approx 1.10517117 e0.11+0.1+0.005+0.000167+0.000004171.10517117

第四步:与实际值比较

用计算器计算 e 0.1 e^{0.1} e0.1 的实际值: e 0.1 ≈ 1.105170918 e^{0.1} \approx 1.105170918 e0.11.105170918我们看到,使用泰勒级数前几项的近似值 1.10517117 1.10517117 1.10517117 与实际值 1.105170918 1.105170918 1.105170918 非常接近,误差在 1 0 − 6 10^{-6} 106 量级上。
这个例子展示了如何使用泰勒级数在某一点上近似计算一个函数的值。通过逐项计算并求和,我们可以得到一个非常接近实际值的近似结果。
绘制不同项数的泰勒级数曲线,比较近似值和实际值
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt# 定义 e^x 的泰勒级数近似函数
def taylor_series_exp(x, n_terms):taylor_sum = 0for n in range(n_terms):taylor_sum += (x**n) / np.math.factorial(n)return taylor_sum# 定义实际的 e^x 函数
def actual_exp(x):return np.exp(x)# x 的范围
x_values = np.linspace(-1, 1, 400)# 不同项数的泰勒级数近似
terms_list = [1, 2, 3, 5, 10]  # 泰勒级数的项数列表# 创建图形
plt.figure(figsize=(10, 6))# 绘制实际的 e^x 曲线
plt.plot(x_values, actual_exp(x_values), label='Actual $e^x$', color='blue')# 绘制不同项数的泰勒级数近似曲线
colors = ['red', 'orange', 'green', 'purple', 'brown']
for i, n_terms in enumerate(terms_list):taylor_values = [taylor_series_exp(x, n_terms) for x in x_values]plt.plot(x_values, taylor_values, label=f'Taylor Series (n={n_terms})', color=colors[i], linestyle='--')# 标注在 x=0.1 处的点
plt.scatter(0.1, taylor_series_exp(0.1, 5), color='green', zorder=5, label='Approximation at x=0.1')
plt.scatter(0.1, actual_exp(0.1), color='purple', zorder=5, label='Actual at x=0.1')# 标注和标签
plt.xlabel('x')
plt.ylabel('y')
plt.title('Taylor Series Approximation of $e^x$')
plt.legend()
plt.grid(True)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.show()# 打印在 x=0.1 处的近似值和实际值
approx_value = taylor_series_exp(0.1, 5)
actual_value = actual_exp(0.1)
print(f'Taylor Series Approximation at x=0.1 with n=5: {approx_value}')
print(f'Actual value at x=0.1: {actual_value}')

数学思想的演变

古希腊时期

芝诺悖论:古希腊哲学家芝诺提出了著名的芝诺悖论,探讨了如何利用无穷级数求和来得到有限结果的问题。芝诺的结论是无法完成的,这在当时引发了广泛的讨论和争论。

亚里士多德:亚里士多德对芝诺悖论进行了哲学上的反驳,但并没有解决数学上的问题。

德谟克利特和阿基米德:德谟克利特和后来著名的数学家阿基米德进一步研究了无穷级数问题。阿基米德利用穷竭法,逐步细分无穷级数,从而得到了有限的结果。这种方法为后来的数学发展奠定了基础。

中国古代

刘徽:几个世纪之后,中国数学家刘徽也独立提出了类似于穷竭法的方法,用于解决类似的问题。他的工作与阿基米德的穷竭法有很多相似之处。

中世纪

马德哈瓦:进入14世纪,印度数学家马德哈瓦是最早使用泰勒级数及相关方法的数学家之一。尽管他的数学著作没有流传下来,但后来印度数学家的著作表明他发现了一些特殊的泰勒级数,这些级数包括正弦、余弦、正切、和反正切三角函数等。喀拉拉学派在他的基础上进行了延伸和合理逼近,这些工作一直持续到16世纪。

17世纪

詹姆斯·格雷果里:在17世纪,詹姆斯·格雷果里继续这方面的研究,并发表了若干麦克劳林级数的相关工作。

18世纪

布鲁克·泰勒:直到1715年,布鲁克·泰勒提出了一个通用的方法来构建适用于所有函数的级数,这就是后来的泰勒级数。泰勒的方法能够用于构建各种函数的无穷级数表示,使得这一概念成为数学分析中的重要工具。

科林·麦克劳林:麦克劳林级数是泰勒级数的特例,是由爱丁堡大学的科林·麦克劳林教授在18世纪发表的,并以其名字命名。

泰勒级数展开

泰勒级数展开与直线方程的关系

泰勒级数是基于函数在某一点 x 0 x_0 x0 处的所有阶导数来展开的。公式为:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) 1 ! + f ′ ′ ( x 0 ) ( x − x 0 ) 2 2 ! + ⋯ + f ( n ) ( x 0 ) ( x − x 0 ) n n ! f(x) \approx f(x_0) + f'(x_0) \frac{(x - x_0)}{1!} + f''(x_0) \frac{(x - x_0)^2}{2!} + \cdots + f^{(n)}(x_0) \frac{(x - x_0)^n}{n!} f(x)f(x0)+f(x0)1!(xx0)+f′′(x0)2!(xx0)2++f(n)(x0)n!(xx0)n n n n 趋于无穷时,该级数可以等于函数本身:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + ⋯ f(x) = f(x_0) + f'(x_0) (x - x_0) + \frac{f''(x_0)}{2!} (x - x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!} (x - x_0)^n + \cdots f(x)=f(x0)+f(x0)(xx0)+2!f′′(x0)(xx0)2++n!f(n)(x0)(xx0)n+

一阶展开(线性近似)

如果只考虑泰勒级数的前两项,得到函数在 x 0 x_0 x0 处的线性近似,也叫做一阶泰勒展开:
f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) \approx f(x_0) + f'(x_0) (x - x_0) f(x)f(x0)+f(x0)(xx0)
这是因为所有高于一次项的项都被忽略了。

直线方程的推导

一阶泰勒展开的形式与直线方程形式一致。可以将 f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) \approx f(x_0) + f'(x_0) (x - x_0) f(x)f(x0)+f(x0)(xx0) 写成直线方程:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_0) + f'(x_0) (x - x_0) f(x)=f(x0)+f(x0)(xx0)如果令:
f ( x 0 ) = k 1 f(x_0) = k_1 f(x0)=k1
f ′ ( x 0 ) = k 2 f'(x_0) = k_2 f(x0)=k2那么上述方程变为:
f ( x ) = k 1 + k 2 ( x − x 0 ) f(x) = k_1 + k_2 (x - x_0) f(x)=k1+k2(xx0)这就是直线的方程形式,其中 k 1 k_1 k1 是直线在 x = x 0 x = x_0 x=x0 处的函数值(即截距), k 2 k_2 k2 是直线的斜率(即导数)。线性近似的应用: x \sqrt{x} x 的例子找到 f ( x ) = x f(x) = \sqrt{x} f(x)=x x = 9 x = 9 x=9 处的线性近似,并估算 9.1 \sqrt{9.1} 9.1

  1. 计算 f ( 9 ) f(9) f(9)
    f ( 9 ) = 9 = 3 f(9) = \sqrt{9} = 3 f(9)=9 =3

  2. 计算 f ′ ( x ) f'(x) f(x) 并在 x = 9 x = 9 x=9 处求导:
    f ′ ( x ) = 1 2 x f'(x) = \frac{1}{2\sqrt{x}} f(x)=2x 1
    f ′ ( 9 ) = 1 2 9 = 1 6 f'(9) = \frac{1}{2\sqrt{9}} = \frac{1}{6} f(9)=29 1=61

  3. 代入线性近似公式:
    L ( x ) = f ( 9 ) + f ′ ( 9 ) ( x − 9 ) L(x) = f(9) + f'(9)(x - 9) L(x)=f(9)+f(9)(x9)
    L ( x ) = 3 + 1 6 ( x − 9 ) L(x) = 3 + \frac{1}{6}(x - 9) L(x)=3+61(x9)

  4. 估算 9.1 \sqrt{9.1} 9.1
    L ( 9.1 ) = 3 + 1 6 ( 9.1 − 9 ) L(9.1) = 3 + \frac{1}{6}(9.1 - 9) L(9.1)=3+61(9.19)
    L ( 9.1 ) = 3 + 1 6 ( 0.1 ) L(9.1) = 3 + \frac{1}{6}(0.1) L(9.1)=3+61(0.1)
    L ( 9.1 ) = 3 + 0.0167 ≈ 3.0167 L(9.1) = 3 + 0.0167 \approx 3.0167 L(9.1)=3+0.01673.0167
    所以, 9.1 ≈ 3.0167 \sqrt{9.1} \approx 3.0167 9.1 3.0167
    通过泰勒级数的一阶展开,可以得到函数在某一点附近的线性近似。
    另一种描述方式
    y = m x + b y = mx + b y=mx+b其中 m m m 是斜率, b b b 是截距。对于一阶泰勒展开,可以将其写成类似直线方程的形式:
    y = f ( x ) y = f(x) y=f(x)
    m = f ′ ( x 0 ) m = f'(x_0) m=f(x0)
    b = f ( x 0 ) − f ′ ( x 0 ) x 0 b = f(x_0) - f'(x_0)x_0 b=f(x0)f(x0)x0实际上,一阶泰勒展开的形式 f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) \approx f(x_0) + f'(x_0)(x - x_0) f(x)f(x0)+f(x0)(xx0) 正是线性函数的形式,其中:
    f ( x 0 ) f(x_0) f(x0) 表示在 x = x 0 x = x_0 x=x0 处的函数值,是线性函数的截距;
    f ′ ( x 0 ) f'(x_0) f(x0) 表示在 x = x 0 x = x_0 x=x0 处的导数,是线性函数的斜率。

http://www.lryc.cn/news/399584.html

相关文章:

  • 蔚来汽车:拥抱TiDB,实现数据库性能与稳定性的飞跃
  • 【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块
  • 对比 UUIDv1 和 UUIDv6
  • 记一次饱经挫折的阿里云ROS部署经历
  • 代码运行故障排除:PyCharm中的问题解决指南
  • css实现渐进中嵌套渐进的方法
  • JavaWeb后端学习
  • VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解决方法
  • Linux下mysql数据库的导入与导出以及查看端口
  • Open3d入门 一文读懂三维点云
  • pyinstaller系列教程(一)-基础介绍
  • echarts图表:类目轴
  • SSM贫困生申请管理系统-计算机源码84308
  • [C++]——同步异步日志系统(5)
  • Qt项目:基于Qt实现的网络聊天室---TCP服务器和token验证
  • 深入理解C++构造函数
  • J025_斗地主游戏案例开发(简版)
  • 路径规划 | 飞蛾扑火算法求解二维栅格路径规划(Matlab)
  • 优化Cocos Creator 包体体积
  • TCPDump协议分析工具
  • 土壤分析仪:解密土壤之奥秘的科技先锋
  • 计算1的数量
  • Linux udp编程
  • 【开源项目】Rust开发复制文件夹目录结构工具
  • PostgreSQL的pg_dirtyread工具
  • 苹果梦碎:Vision Pro的辉煌与失落,苹果已决定暂停 Vision Pro 后续产品的研发工作
  • 推荐一款uniapp拖动验证码插件
  • 十年期国债收益率
  • 使用Go编写的持续下行测速脚本,快速消耗流量且不伤硬盘
  • 保护国外使用代理IP的安全方法