使用Python和SymPy推导斯特林公式
引言
斯特林公式(Stirling’s Approximation)是一种用来近似计算阶乘的数学公式。它是数学分析中非常重要的近似公式之一,尤其在概率论、统计学、物理学等领域中广泛应用。本文将使用 Python 中的数学符号计算库 SymPy 推导斯特林公式,帮助大家更好地理解它的推导过程。
1.阶乘的定义
阶乘是一个常见的数学概念,表示一个正整数的连乘积。通常用感叹号表示,如下所示:
\]
例如,5! 就是 \(5 \times 4 \times 3 \times 2 \times 1 = 120\)
然而,当 n 很大时,计算阶乘变得非常困难。因此,我们需要一个近似方法来简化计算,这就是斯特林公式的作用所在。
2.斯特林公式
斯特林公式给出了 n! 的一个近似表达式。公式如下:$$n! \approx \sqrt{2 \pi n} \left(\frac{n}{e}\right)^n$$
其中:
- n 是阶乘的数值。
- e 是自然对数的底数(大约等于 2.71828)。
- \(\pi\) 是圆周率。
使用 SymPy 推导斯特林公式
SymPy 是一个强大的 Python 库,可以进行符号计算(即精确计算),它可以帮助我们推导数学公式。我们通过它来推导斯特林公式,并理解每一步的过程。
# coding=utf-8
import sympy as sp
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import math
# 定义变量
n = sp.symbols('n')
# 定义阶乘的符号表示
factorial_n = sp.factorial(n)
# 定义斯特林公式的近似表达式
stirling_approximation = sp.sqrt(2 * sp.pi * n) * (n / sp.exp(1)) ** n
# 打印斯特林公式的推导
print(stirling_approximation)
# 比较阶乘和打印斯特林公式
error = sp.limit(factorial_n / stirling_approximation, n, sp.oo)
print(error)
n_values = np.arange(1, 50)
factorial_values = [math.factorial(n) for n in n_values] # 使用 math.factorial 计算阶乘
stirling_values = [np.sqrt(2 * np.pi * n) * (n / np.exp(1)) ** n for n in n_values]
errors = np.abs(np.array(factorial_values) - np.array(stirling_values))
# 绘图
plt.plot(n_values, errors)
plt.xlabel('n')
plt.ylabel('Error')
plt.title('Error Between Factorial and Stirling\'s Approximation')
plt.savefig('stirling_error_plot.png')
输出结果
sqrt(2)*sqrt(pi)*sqrt(n)*(n*exp(-1))**n
1

总结
斯特林公式为我们提供了一个有效的计算阶乘的近似方法,尤其在 n 很大的情况下,计算阶乘变得更加高效。通过 Python 和 SymPy,我们能够轻松推导和验证斯特林公式,并能够通过图形展示其精度。
希望这篇文章能够帮助你更好地理解斯特林公式的推导过程及其应用。如果你对数学公式的推导或 Python 编程感兴趣,可以继续深入学习更多内容!
使用Python和SymPy推导斯特林公式的更多相关文章
- python基础——列表推导式
python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...
- Python生成器、推导式之前襟后裾
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
- python的各种推导式
python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- Python基础-列表推导式
python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...
- python 3列表推导式的的一点理解!
python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...
- Python 入门之 推导式
Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...
- 『无为则无心』Python序列 — 24、Python序列的推导式
目录 1.列表推导式 (1)快速体验 (2)带if的列表推导式 (3)多个for循环实现列表推导式 2.字典推导式 (1)创建一个字典 (2)将两个列表合并为一个字典 (3)提取字典中目标数据 3.集 ...
- Python的列表推导式
1.列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 2.举例说明: #!/usr/bin/python # -*- codi ...
- python的各种推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
随机推荐
- AI编程:如何编写提示词
这是小卷对AI编程工具学习的第2篇文章,今天讲讲如何编写AI编程的提示词,并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是:目标清晰明确,具有针对性,能引导模型理解问题 下面是 ...
- 从倒水问题到盛最多水的容器:一道经典的双指针应用题|LeetCode 11 盛最多水的容器
LeetCode 11 盛最多水的容器 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有遇到过这样的场景:家里要举办派对,需要准备一个大 ...
- 并发编程 - 线程同步(四)之原子操作Interlocked详解一
上一章我们了解了原子操作Interlocked类的设计原理及简单介绍,今天我们将对Interlocked的使用进行详细讲解. 在此之前我们先学习一个概念--原子操作. 01.Read方法 该方法用于原 ...
- lxl 讲课的记录
D1 lxl:LCT 没有前途.所以平衡树一般只需要 fhq-treap. 线段树.平衡树简单例题 P3215 注意到抵消掉合法括号串之后一定是这样的情况:))))((((即前缀最小值 \(a\).后 ...
- Presto常用命令
一.基本资料 1.官方文档 https://prestodb.github.io/docs/current/sql/select.html 二.常用命令 1.kill任务,登录presto客户端 CA ...
- 管理虚拟机(libvirt)
给我的理解就是与用户交互的"显示器" [root@kvm1 ~]# systemctl status libvirtd [root@kvm1 ~]# virsh virsh # l ...
- GridControl 给选中的行添加边框显示
实现方式,通过自定义 RowControl 的样式实现. 参考:https://supportcenter.devexpress.com/ticket/list?searchString=RowCel ...
- Linux MiniMal版本常规所需环境安装
Docker 环境安装 前置工作 之 基础环境安装 当前环境 centos7.9 64位 minimal版本 当前环境为 root用户 若当前存在Docker环境 需卸载 yum remove doc ...
- Ansible - [08] 模块应用
firewalld 模块 使用firewalld模块可以配置防火墙策略 [root@control ~]# cat ~/ansible/firewall.yml --- - hosts: agent ...
- 一个nginx + vue下二级路径版本化方案
PS: 尽量不要做版本化!尽量不要做版本化!尽量不要做版本化! 过程说明: 1.arg_appver表示读取url上appver参数 2.对appver参数做变量映射得到alias_party1_te ...