📐 数学基础教程
系统学习建模竞赛所需的三大数学基础,从基本原理到实际应用
📘 第零篇:大学先修课程
建模的语言基础——常见初等函数的图像与性质,以及数列的分析方法,是理解微积分与数学建模的起点
0.1 初等函数与建模应用
数学建模的核心之一是为现实规律选择合适的函数描述。不同函数各有其"擅长刻画的现象"——掌握每类函数的图像形状、关键性质和典型应用场景,是建模选模的基础直觉。
k>0 单调递增,k<0 单调递减
b=0 时过原点(正比例函数)
对称轴:$x = -\frac{b}{2a}$
顶点:$\left(-\frac{b}{2a},\,\frac{4ac-b^2}{4a}\right)$
n 为负整数:双曲线型,x≠0
n=1/2:$\sqrt{x}$,定义域 [0,+∞)
a>1 递增,0<a<1 递减
过点 (0,1),以 x 轴为渐近线
a>1 递增,0<a<1 递减
过点 (1,0),以 y 轴为渐近线
tan 值域 $\mathbb{R}$,周期 π
$\sin^2 x+\cos^2 x = 1$(恒等)
$x>0$ 时最小值 $2\sqrt{a}$($x=\sqrt{a}$ 时)
均值不等式:$x+\frac{a}{x}\geq 2\sqrt{a}$
arccos:定义域 $[-1,1]$,值域 $[0,\pi]$
arctan:定义域 $\mathbb{R}$,值域 $(-\frac{\pi}{2},\frac{\pi}{2})$
拐点在 $x=x_0$,增速最大
应用:种群增长、逻辑回归
A. 一次函数 $f(x)=kx+b$
性质 斜率·截距·线性关系
斜率 $k = \dfrac{\Delta y}{\Delta x}$ 代表单位自变量变化引起的因变量变化。$k>0$ 递增,$k<0$ 递减,$k=0$ 常值。
两条不平行直线 $y_1=k_1x+b_1,\;y_2=k_2x+b_2$ 的交点满足 $k_1x+b_1=k_2x+b_2$,解得均衡点。
建模应用 一次函数的五类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 线性回归 | $\hat{y}=\beta_0+\beta_1 x$ | 最小二乘估计斜率截距;$R^2$ 检验拟合优度;残差图检验线性假设 |
| 供需均衡 | $Q_d=a-bp$,$Q_s=c+dp$ | 均衡价格 $p^*=(a-c)/(b+d)$;价格弹性 $E=-b\cdot p/Q$ |
| 成本收益 | $C=c_0+c_1 q$,$R=pq$ | 盈亏平衡 $q^*=c_0/(p-c_1)$;固定成本 $c_0$,边际成本 $c_1$ |
| 线性规划约束 | $a_1x_1+a_2x_2\leq b$ | 每个约束是半平面;目标函数等值线族平行直线;最优解在顶点 |
| 泰勒一阶近似 | $f(x)\approx f(x_0)+f'(x_0)(x-x_0)$ | 将复杂非线性函数在工作点附近线性化,简化分析 |
B. 二次函数 $f(x)=ax^2+bx+c$
性质 顶点·对称轴·判别式
配方得顶点式:$f(x)=a\!\left(x+\dfrac{b}{2a}\right)^{\!2}+\dfrac{4ac-b^2}{4a}$
$\Delta=b^2-4ac>0$:两实根(曲线与 $x$ 轴两交点);$\Delta=0$:重根(切点);$\Delta<0$:无实根。
建模应用 二次函数的五类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 最优定价 | $\pi(p)=(p-c)(a-bp)$ | 展开为 $-bp^2+(a+bc)p-ac$,顶点处利润最大:$p^*=(a+bc)/(2b)$ |
| 抛体轨迹 | $y=x\tan\theta-\dfrac{g}{2v_0^2\cos^2\theta}x^2$ | 水平射程 $R=v_0^2\sin 2\theta/g$,$\theta=45°$ 时最大 |
| 面积最优化 | $A=x(L-2x)$ | 用固定周长围最大面积:$x^*=L/4$,$A_{\max}=L^2/8$ |
| 二次规划(QP) | $\min\;\mathbf{x}^\mathsf{T}Q\mathbf{x}+\mathbf{c}^\mathsf{T}\mathbf{x}$ | 凸二次目标+线性约束;SVM核心优化形式;组合投资方差最小化 |
| 多项式拟合 | $\hat{y}=\beta_0+\beta_1x+\beta_2x^2$ | 比线性回归多捕捉"先升后降"或"先降后升"的非线性趋势 |
C. 幂函数 $f(x)=x^\alpha$
性质 按指数 $\alpha$ 分类
| 指数类型 | 典型例子 | 图像特征 |
|---|---|---|
| 正整数 $\alpha=n$ | $x^2,x^3$ | 偶次:抛物线型,偶函数;奇次:过原点,奇函数 |
| 负整数 $\alpha=-n$ | $1/x,1/x^2$ | 双曲线型,$x=0$ 为渐近线;$1/x$ 是奇函数 |
| 正分数 $\alpha=1/n$ | $\sqrt{x},x^{1/3}$ | $\sqrt{x}$:定义域 $[0,+\infty)$;$x^{1/3}$:全体实数,奇函数 |
| 任意实数 $\alpha$ | $x^{0.8},x^{1.5}$ | 定义域通常为 $(0,+\infty)$;$\alpha>1$ 凸,$0<\alpha<1$ 凹 |
所有幂函数均过点 $(1,1)$;$\alpha>0$ 时在 $(0,+\infty)$ 单调递增;$\alpha<0$ 时单调递减。
建模应用 幂函数的五类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 幂律分布 | $P(X>x)=\left(\dfrac{x_0}{x}\right)^{\!\alpha}$ | 收入/财富分配(帕累托定律)、城市规模(Zipf定律)、网页引用次数;双对数坐标下为直线,斜率 $=-\alpha$ |
| 面积/体积缩放 | $A\propto L^2$,$V\propto L^3$ | 几何相似律;生物代谢率 $\propto M^{3/4}$(Kleiber定律);航空器机翼面积缩放 |
| 平方反比律 | $F=\dfrac{Gm_1m_2}{r^2}$,$I=\dfrac{P}{4\pi r^2}$ | 万有引力、电磁力、光照强度均遵循 $r^{-2}$;描述"扩散稀释"现象 |
| 幂律回归 | $y=ax^b$,两边取对数:$\ln y=\ln a+b\ln x$ | 双对数线性化后用线性回归估计 $b$;弹性系数 $b=d\ln y/d\ln x$(弹性=斜率) |
| 规模效益 | $C(q)=cq^\alpha$ | $\alpha<1$:规模收益递增(生产越多单位成本越低);$\alpha>1$:规模收益递减 |
D. 指数函数 $f(x)=a^x$($a>0,a\neq1$)
性质 运算法则与特殊值
自然底 $e^x$:$e\approx2.71828$,$(e^x)'=e^x$(唯一导数等于自身的函数)。半衰期/倍增时间:$T=\dfrac{\ln 2}{|r|}$,其中 $r$ 为增长率。
建模应用 指数函数的六类场景
| 场景 | 模型形式 | 参数含义 |
|---|---|---|
| 种群/细菌增长 | $N(t)=N_0 e^{rt}$ | $r$:内禀增长率(出生率$-$死亡率);$r>0$ 增长,$r<0$ 衰减;Malthus模型 |
| 放射性衰变 | $N(t)=N_0 e^{-\lambda t}$,$T_{1/2}=\dfrac{\ln2}{\lambda}$ | $\lambda$:衰变常数;半衰期 $T_{1/2}$ 不依赖初始量;碳-14定年法核心 |
| 复利/贴现 | $A=Pe^{rt}$(连续);$A=P(1+r)^n$(离散) | 未来价值 $A$,现值 $P=Ae^{-rt}$;NPV分析用指数贴现 |
| 牛顿冷却定律 | $T(t)=T_{\rm env}+(T_0-T_{\rm env})e^{-kt}$ | 物体与环境温差按指数衰减;$k$ 取决于热传导系数;法医鉴定死亡时间 |
| 疫情初期增长 | $I(t)=I_0 e^{(\beta-\gamma)t}$ | $\beta-\gamma>0$ 时指数爆发;$R_0=\beta/\gamma>1$ 是爆发条件 |
| 信号衰减 | $I=I_0 e^{-\mu x}$(Beer-Lambert) | 光/声/辐射穿过介质时强度指数衰减;$\mu$:吸收系数;医学CT原理 |
E. 对数函数 $f(x)=\log_a x$($a>0,a\neq1$)
性质 运算法则
换底公式:$\log_a b = \dfrac{\ln b}{\ln a}$。建模时统一换成自然对数 $\ln$,便于求导:$(\ln x)'=1/x$。
重要极限:$\lim_{x\to0^+}x\ln x=0$;$\ln(1+x)\approx x$($x$ 很小时)。
建模应用 对数函数的六类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 里氏震级 | $M=\log_{10}\dfrac{A}{A_0}$ | 震级差1级,能量差 $10^{1.5}\approx32$ 倍;对数刻度压缩了极大范围的量 |
| 分贝/声压级 | $L=20\log_{10}\dfrac{p}{p_0}$(dB) | 对数感知:人耳感受到的响度约正比于声压的对数(韦伯-费希纳定律) |
| 信息熵 | $H=-\sum_{i}p_i\log_2 p_i$(bits) | 衡量系统不确定性;均匀分布时最大熵;机器学习中交叉熵损失函数的基础 |
| 对数效用/边际递减 | $U(w)=\ln w$,$\;U'(w)=1/w$ | 财富增加同样数额,富人感受到的效用增量更小;风险规避行为解释 |
| 对数增长模型 | $y=a+b\ln t$ | 技术学习曲线(第 $n$ 件产品成本)、广告效果(边际收益递减)、对数拟合 |
| 数量级分析 | $y=a\cdot x^b\;\Rightarrow\;\ln y=\ln a+b\ln x$ | 双对数坐标线性化幂律;斜率 $b$ 即弹性系数($b=\partial\ln y/\partial\ln x$) |
F. 三角函数 sin, cos, tan
公式 基本关系与变换
辅助角公式(合成):$a\sin x+b\cos x=\sqrt{a^2+b^2}\,\sin\!\left(x+\arctan\dfrac{b}{a}\right)$
积化和差:$\sin\alpha\cos\beta=\tfrac{1}{2}[\sin(\alpha+\beta)+\sin(\alpha-\beta)]$(傅里叶分析中频率混合)
建模应用 三角函数的六类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 简谐振动 | $x(t)=A\sin(\omega t+\varphi)$ | 弹簧-质块、单摆(小角近似)、交流电;$A$=振幅,$\omega=2\pi f$=角频率,$\varphi$=初相 |
| 傅里叶分析 | $f(t)=\sum_{n}(a_n\cos n\omega t+b_n\sin n\omega t)$ | 任意周期信号分解为正弦波叠加;滤波、信号压缩、偏微分方程求解的基础 |
| 季节时间序列 | $y_t=\text{趋势}+A\sin\!\left(\dfrac{2\pi t}{T}+\varphi\right)+\varepsilon$ | 气温/用电量/销售额的年周期或周周期;SARIMA/Prophet中的季节项 |
| 三角测量/测距 | $\dfrac{a}{\sin A}=\dfrac{b}{\sin B}$(正弦定理) | 已知两角一边求三角形;GPS三角定位;雷达测距 |
| 力/速度分解 | $F_x=F\cos\theta,\;F_y=F\sin\theta$ | 斜面问题、风向分解、水流/风速建模;向量分量计算 |
| 波动叠加/干涉 | $y=y_1+y_2=2A\cos\dfrac{\Delta\phi}{2}\sin(\omega t+\bar\phi)$ | 同频两波叠加;合振幅取决于相位差;声学干涉、光学干涉条纹 |
G. 反三角函数 arcsin, arccos, arctan
定义 三个反三角函数
将三角函数限制定义域使其可逆,得到反三角函数:
| 函数 | 定义 | 定义域 | 值域 | 单调性 |
|---|---|---|---|---|
| $\arcsin x$ | $\arcsin x=y \Leftrightarrow \sin y=x$ | $[-1,\,1]$ | $\left[-\dfrac{\pi}{2},\dfrac{\pi}{2}\right]$ | 单调递增 |
| $\arccos x$ | $\arccos x=y \Leftrightarrow \cos y=x$ | $[-1,\,1]$ | $[0,\,\pi]$ | 单调递减 |
| $\arctan x$ | $\arctan x=y \Leftrightarrow \tan y=x$ | $\mathbb{R}$ | $\left(-\dfrac{\pi}{2},\dfrac{\pi}{2}\right)$ | 单调递增 |
恒等关系与导数
特殊值:$\arcsin(0)=0$;$\arcsin(1)=\pi/2$;$\arccos(0)=\pi/2$;$\arctan(1)=\pi/4$;$\arctan(\pm\infty)=\pm\pi/2$
四象限反正切 atan2:$\text{atan2}(y,x)$ 返回向量 $(x,y)$ 与正 $x$ 轴夹角,取值范围 $(-\pi,\pi]$,是 $\arctan(y/x)$ 的扩展版,正确处理各象限。
建模应用 反三角函数的六类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 方向角/方位角 | $\theta=\text{atan2}(y,x)$ | 由速度分量或坐标差求运动方向;机器人导航、无人机姿态、GPS航向角;避免 $\arctan(y/x)$ 的象限模糊问题 |
| 仰角/俯角测量 | $\alpha=\arctan\!\dfrac{h}{d}$ | 已知水平距离 $d$ 和高度差 $h$ 求仰角;测高建模(楼高、山峰);雷达探测角 |
| 地球大圆距离 | $\Delta\sigma=\arccos(\sin\varphi_1\sin\varphi_2+\cos\varphi_1\cos\varphi_2\cos\Delta\lambda)$ | 球面三角学;航空最短航线计算;GPS中Haversine公式(避免小角度数值问题) |
| 相位恢复 | $\phi=\arctan\!\dfrac{Q}{I}$ | 复数信号的相角(IQ解调);信号处理中由实/虚部还原相位;图像傅里叶变换相位 |
| 柯西/Logistic分布CDF | $F(x)=\dfrac{1}{2}+\dfrac{1}{\pi}\arctan\!\dfrac{x-\mu}{\gamma}$ | 柯西分布(重尾)的累积分布函数;Logistic分布CDF用 $\arctan$ 近似;用于金融肥尾建模 |
| 反正切积分 | $\displaystyle\int_0^\infty\frac{dt}{1+t^2}=\frac{\pi}{2}$,$\;\int_0^1\frac{4}{1+t^2}dt=\pi$ | 数值积分估算 $\pi$(莱布尼茨公式);概率密度归一化验证;Monte Carlo $\pi$ 估算原理 |
np.arcsin(x)、np.arccos(x)、np.arctan(x)(返回弧度)、np.arctan2(y, x)(四象限版)、np.degrees(theta)(弧度→度)。
H. 对勾函数 $f(x)=x+\dfrac{a}{x}$($a>0$)
性质 均值不等式与极值
在 $x>0$ 时,由均值不等式 $\dfrac{x+a/x}{2}\geq\sqrt{x\cdot(a/x)}=\sqrt{a}$,得:
图像形如"✓":在 $(0,\sqrt{a})$ 上递减,在 $(\sqrt{a},+\infty)$ 上递增,极小值 $2\sqrt{a}$。在 $x<0$ 侧对称地存在极大值 $-2\sqrt{a}$。
建模应用 对勾函数——"两项和最优"结构
凡是总费用 = $\dfrac{A}{x}+Bx$(一项随 $x$ 减少、另一项随 $x$ 增加),最优解都在两项相等时取得,本质是对勾函数极值。
| 场景 | 模型形式 | 最优解 |
|---|---|---|
| 经济订货量(EOQ) | $TC=\dfrac{D}{Q}\cdot S+\dfrac{Q}{2}\cdot H$ | $Q^*=\sqrt{\dfrac{2DS}{H}}$,订货成本=持有成本 |
| 最优批次生产 | $TC=\dfrac{\lambda}{q}\cdot c_s+\dfrac{q}{2}\cdot c_h$ | 年需求 $\lambda$,每批生产 $q$;$q^*=\sqrt{2\lambda c_s/c_h}$ |
| 运输+仓储权衡 | $TC=\dfrac{V}{x}\cdot f+x\cdot k$ | 运输次数越多运费越高,但仓储越少;最优频率 $x^*=\sqrt{Vf/k}$ |
| 广告投入权衡 | $\pi = R(x)-C_{\rm fixed}-x$($R$ 凹函数) | 边际收益=1(广告边际成本),对勾型成本结构中极值点给出最优广告量 |
I. Logistic 函数(S 型增长曲线)
性质 参数与图像特征
$L$=上限;$k$=增长率($k>0$);$x_0$=拐点。拐点处 $f(x_0)=L/2$,增速最大为 $kL/4$。
Sigmoid 导数:$\sigma'(x)=\sigma(x)(1-\sigma(x))$(简洁,神经网络反向传播中常用)。
建模应用 Logistic 函数的六类场景
| 场景 | 模型形式 | 建模要点 |
|---|---|---|
| 种群 Logistic 增长 | $\dfrac{dN}{dt}=rN\!\left(1-\dfrac{N}{K}\right)$,解为 $N(t)=\dfrac{K}{1+Ce^{-rt}}$ | $K$=环境容纳量;前期指数增长,后期趋于 $K$;拐点在 $K/2$(捕捞最优点) |
| 逻辑回归(分类) | $P(Y=1|x)=\sigma(\mathbf{w}^\mathsf{T}\mathbf{x}+b)$ | 将线性分数映射到 $(0,1)$ 概率;最大似然估计参数;二分类建模基础 |
| 疫情累计病例 | $C(t)\approx\dfrac{C_{\max}}{1+e^{-r(t-t_0)}}$ | 指数增长期→线性期→饱和期;拐点对应日新增峰值;SIR模型累计感染解近似S型 |
| 新产品市场渗透 | $M(t)=\dfrac{p}{1+qe^{-(p+q)t}}$(Bass扩散模型) | $p$=创新系数,$q$=模仿系数;预测新技术/产品市场份额随时间的增长曲线 |
| 神经网络激活 | $a=\sigma(z)$,$\sigma'=a(1-a)$ | 将神经元输出映射到 $(0,1)$;梯度消失问题($z$ 很大/小时 $\sigma'\approx0$)是ReLU兴起的原因 |
| 剂量-效应关系 | $E=\dfrac{E_{\max}\cdot C^n}{EC_{50}^n+C^n}$(Hill方程) | 药物浓度 $C$ 与效应 $E$;$EC_{50}$=半数有效浓度;$n$=Hill系数(S曲线陡峭程度) |
📊 初等函数图像可视化(含反三角函数)
点击按钮切换函数,观察图像形态、特征点与渐近线
0.2 函数的性质
定义 五大基本性质
| 性质 | 定义 | 判断/应用 |
|---|---|---|
| 定义域 | 使函数有意义的 $x$ 的集合 | 分母≠0;对数真数>0;偶次根式≥0;三角函数无限制 |
| 单调性 | $x_1<x_2\Rightarrow f(x_1)<f(x_2)$(递增) | 导数 $f'(x)>0$ 递增;$f'(x)<0$ 递减;导数为0是极值候选 |
| 奇偶性 | 奇函数:$f(-x)=-f(x)$;偶函数:$f(-x)=f(x)$ | 奇函数图像关于原点对称;偶函数关于 $y$ 轴对称 |
| 周期性 | 存在 $T>0$ 使 $f(x+T)=f(x)$ 对所有 $x$ 成立 | $\sin x,\cos x$ 周期 $2\pi$;$\tan x$ 周期 $\pi$;$A\sin(\omega x+\phi)$ 周期 $2\pi/|\omega|$ |
| 有界性 | 存在 $M$ 使 $|f(x)|\leq M$ 对定义域内所有 $x$ 成立 | $\sin x,\cos x$ 有界 $[-1,1]$;多项式、指数函数无界 |
单调性的证明(定义法)
方法 用定义证明 $f(x)=x^2$ 在 $[0,+\infty)$ 上单调递增
步骤:设 $0\leq x_1<x_2$,则:
因为 $x_2-x_1>0$ 且 $x_2+x_1>0$,所以 $f(x_2)-f(x_1)>0$,即 $f(x_2)>f(x_1)$,故 $f(x)=x^2$ 在 $[0,+\infty)$ 上单调递增。$\square$
复合函数与反函数
性质 复合函数单调性
同增异减:$y=f(g(x))$,若 $f$ 和 $g$ 同向单调,则复合函数单调递增;若异向,则单调递减。
例:$y=\ln(x^2+1)$,$x^2+1$ 在 $[0,+\infty)$ 上递增,$\ln$ 递增,故复合函数在 $[0,+\infty)$ 上递增。
反函数:若 $f$ 严格单调,则存在反函数 $f^{-1}$,两者图像关于 $y=x$ 对称。$e^x$ 与 $\ln x$ 互为反函数,$\sin x$(限制定义域)与 $\arcsin x$ 互为反函数。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize_scalar
# 绘制函数及其导数,直观看单调区间
x = np.linspace(-3, 3, 400)
fig, axes = plt.subplots(1, 3, figsize=(14, 4))
# 一次函数
axes[0].plot(x, 2*x - 1, color='#b85c2a', linewidth=2, label='f(x)=2x-1')
axes[0].axhline(0, color='#3d352a', linewidth=0.8)
axes[0].axvline(0, color='#3d352a', linewidth=0.8)
axes[0].set_title('一次函数 (单调)'); axes[0].legend()
# 二次函数:顶点、对称轴
y_quad = x**2 - 2*x - 1
axes[1].plot(x, y_quad, color='#2c5282', linewidth=2, label='f(x)=x²-2x-1')
axes[1].axvline(1, color='gray', linestyle='--', linewidth=1, label='对称轴 x=1')
axes[1].scatter([1], [-2], color='red', zorder=5, label=f'顶点(1,-2)')
axes[1].set_title('二次函数 (先减后增)'); axes[1].legend(fontsize=8)
# Logistic 函数
def logistic(x, L=1, k=1, x0=0):
return L / (1 + np.exp(-k*(x - x0)))
y_lg = logistic(x)
axes[2].plot(x, y_lg, color='#553c9a', linewidth=2, label='σ(x)=1/(1+e⁻ˣ)')
axes[2].axhline(0.5, color='gray', linestyle='--', linewidth=1, label='y=0.5 (拐点)')
axes[2].axvline(0, color='gray', linestyle=':', linewidth=1)
axes[2].set_title('Logistic 函数 (S型)'); axes[2].legend(fontsize=8)
plt.tight_layout()
plt.savefig('elementary_functions.png', dpi=120)
plt.show()0.3 数列基础
定义 数列的基本概念
按照一定顺序排列的一列数 $a_1,a_2,a_3,\ldots,a_n,\ldots$ 称为数列,记作 $\{a_n\}$。
- 通项公式:$a_n=f(n)$,直接由项数计算各项
- 递推公式:由前若干项推导下一项,如 $a_{n+1}=g(a_n)$
- 前 $n$ 项和:$S_n=\sum_{k=1}^n a_k$,注意 $a_n=S_n-S_{n-1}$($n\geq2$)
等差数列(Arithmetic Sequence)
公式 等差数列 $a_n=a_1+(n-1)d$
相邻项之差为常数 $d$(公差),即 $a_{n+1}-a_n=d$。
中项:$a_m=\dfrac{a_{m-k}+a_{m+k}}{2}$(等差中项关系)。
例:$1,4,7,10,\ldots$,$a_1=1,d=3$,$a_n=3n-2$,$S_{10}=\dfrac{10(1+28)}{2}=145$。
等比数列(Geometric Sequence)
公式 等比数列 $a_n=a_1\cdot q^{n-1}$
相邻项之比为常数 $q$(公比),即 $a_{n+1}/a_n=q$($a_n\neq0$)。
无穷等比级数($|q|<1$):$S_\infty=\dfrac{a_1}{1-q}$,如 $1+\dfrac{1}{2}+\dfrac{1}{4}+\cdots=2$。
例:细菌每小时翻倍,初始100个,第 $n$ 小时有 $100\times 2^{n-1}$ 个。
递推数列
类型 常见递推关系及解法
| 递推形式 | 变换方法 | 通项结果 |
|---|---|---|
| $a_{n+1}=qa_n$ | 直接是等比数列 | $a_n=a_1\cdot q^{n-1}$ |
| $a_{n+1}=a_n+d$ | 直接是等差数列 | $a_n=a_1+(n-1)d$ |
| $a_{n+1}=pa_n+q$($p\neq1$) | 令 $b_n=a_n+\frac{q}{p-1}$,则 $b_{n+1}=pb_n$(等比) | $a_n=\left(a_1+\frac{q}{p-1}\right)p^{n-1}-\frac{q}{p-1}$ |
| $a_{n+1}=a_n+f(n)$ | 累加法:$a_n=a_1+\sum_{k=1}^{n-1}f(k)$ | 取决于 $\sum f(k)$ 的形式 |
| $a_{n+1}=a_n\cdot g(n)$ | 累乘法:$a_n=a_1\cdot\prod_{k=1}^{n-1}g(k)$ | 取决于 $\prod g(k)$ 的形式 |
| $a_{n+2}=a_{n+1}+a_n$(Fibonacci) | 特征方程 $x^2=x+1$,通解为两特征根的线性组合 | $a_n=\frac{1}{\sqrt{5}}\!\left[\!\left(\frac{1+\sqrt5}{2}\right)^{\!n}\!-\!\left(\frac{1-\sqrt5}{2}\right)^{\!n}\right]$ |
常用数列与求和公式
公式 必记求和公式
最后一个公式(等差×等比混合型)用错位相减法推导,竞赛中常用。
📊 数列项可视化
点击按钮切换数列,查看各项大小与增长趋势
0.4 数列求和方法
① 公式法
等差/等比数列直接套求和公式。适用于标准等差、等比型,要先判断类型。
② 错位相减法
适合"等差 × 等比"混合型,如 $\sum k\cdot r^k$。令 $S_n=\sum a_n b_n$,写 $qS_n$,两式相减消去 $a_n b_n$ 项。
③ 累加法(望远镜法)
若 $a_n = f(n)-f(n-1)$,则 $S_n=f(n)-f(0)$(大部分中间项抵消)。
④ 累乘法
若递推形式为 $a_{n+1}/a_n=g(n)$,则将各比式相乘:$a_n=a_1\prod g(k)$。
⑤ 裂项法
将通项拆为两项之差(分式数列常用):$\frac{1}{k(k+1)}=\frac{1}{k}-\frac{1}{k+1}$,累加后首尾相消。
⑥ 分组求和法
数列可拆分成多个基本类型,分别求和再相加。如 $a_n=2n+3^n$,分为等差和等比两部分。
例题 错位相减法求 $S_n=\sum_{k=1}^n k\cdot 2^k$
令 $2S_n = 1\cdot2^2+2\cdot2^3+3\cdot2^4+\cdots+n\cdot2^{n+1}$,则:
例题 裂项法求 $\displaystyle S_n=\sum_{k=1}^n\frac{1}{k(k+2)}$
累加后绝大部分项相消:
数列的建模应用
应用 递推建模——离散动力系统
许多实际问题可用差分方程(递推数列)建模:
| 场景 | 递推关系 | 含义 |
|---|---|---|
| 复利增长 | $A_{n+1}=(1+r)A_n$ | $r$:利率;解 $A_n=A_0(1+r)^n$ |
| 种群 Malthus | $N_{n+1}=\lambda N_n$ | $\lambda=e^r$:增殖率;指数增长 |
| 种群 Logistic | $N_{n+1}=\lambda N_n\left(1-\frac{N_n}{K}\right)$ | $K$:环境容纳量;S型增长 |
| 药物浓度 | $C_{n+1}=(1-k)C_n+D$ | $k$:消除率;$D$:每次给药量 |
| 贷款还款 | $P_{n+1}=rP_n - M$ | $r$:月利率因子;$M$:月供 |
import numpy as np
import matplotlib.pyplot as plt
n = 20 # 项数
# ① 等差数列 a_n = 2 + 3(n-1)
a1, d = 2, 3
arith = [a1 + (k-1)*d for k in range(1, n+1)]
S_arith = [k*a1 + k*(k-1)//2*d for k in range(1, n+1)]
# ② 等比数列 a_n = 1 * 1.5^(n-1)
b1, q = 1, 1.5
geo = [b1 * q**(k-1) for k in range(1, n+1)]
# ③ Fibonacci 数列
fib = [1, 1]
for k in range(2, n):
fib.append(fib[-1] + fib[-2])
# ④ 递推 Logistic(种群模型):N_{n+1} = 2.8 * N_n * (1 - N_n)
N = [0.1]
for _ in range(n-1):
N.append(2.8 * N[-1] * (1 - N[-1]))
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
ns = list(range(1, n+1))
axes[0,0].stem(ns, arith, basefmt=" ", linefmt='#b85c2a', markerfmt='o')
axes[0,0].set_title(f'等差数列 (d={d}) S₂₀={S_arith[-1]}')
axes[0,1].stem(ns, geo, basefmt=" ", linefmt='#2c5282', markerfmt='o')
axes[0,1].set_title(f'等比数列 (q={q})')
axes[1,0].stem(ns, fib, basefmt=" ", linefmt='#1a6e6a', markerfmt='o')
axes[1,0].set_title('Fibonacci 数列')
axes[1,1].plot(ns, N, 'o-', color='#553c9a', linewidth=1.5, markersize=5)
axes[1,1].axhline(1 - 1/2.8, color='gray', linestyle='--', label=f'稳定点 K={(1-1/2.8):.3f}')
axes[1,1].set_title('Logistic 递推种群模型 (λ=2.8)'); axes[1,1].legend()
plt.tight_layout()
plt.savefig('sequences.png', dpi=120)
plt.show()
# 数列通项与求和(符号计算)
from sympy import symbols, summation, simplify, oo, factorial, Sum
n_sym, k = symbols('n k', positive=True, integer=True)
# 等差求和:Σk = n(n+1)/2
print(summation(k, (k, 1, n_sym))) # n*(n+1)/2
# 等比求和:Σ2^k
print(summation(2**k, (k, 0, n_sym-1))) # 2**n - 1
# 错位相减结果验证:Σk*2^k
print(simplify(summation(k*2**k, (k, 1, n_sym)))) # (n-1)*2^(n+1)+2🔢 第一篇:线性代数
研究向量、矩阵和线性变换,是评价模型、主成分分析、数据降维的数学基础
1.1 向量与向量空间
定义 向量
向量是既有大小又有方向的量,可以用有序数组表示:
其中 $\mathbb{R}^n$ 表示 $n$ 维实数向量空间。
向量的基本运算
运算 向量加法与数乘
加法:对应分量相加
数乘:每个分量乘以标量
运算 点积(内积)
两个向量的点积是一个标量:
几何意义:
其中 $\theta$ 是两个向量的夹角。当点积为0时,两向量正交(垂直)。
📊 交互式向量运算
拖动向量端点改变向量 · 观察加法、点积、投影的几何意义
1.2 矩阵与线性变换
定义 矩阵
矩阵是一个按照长方阵列排列的数的集合:
矩阵 $A$ 有 $m$ 行 $n$ 列,称为 $m \times n$ 矩阵。
矩阵乘法
运算 矩阵-向量乘法
矩阵 $A$ 乘以向量 $\vec{x}$ 得到新向量 $\vec{b}$:
几何意义:矩阵乘法表示对向量进行线性变换(旋转、缩放、剪切、投影等)。
运算 矩阵-矩阵乘法
矩阵 $A$($m \times p$)乘以矩阵 $B$($p \times n$):
特殊矩阵
定义 常用特殊矩阵
- 单位矩阵 $I$:对角线为1,其余为0,满足 $AI = IA = A$
- 对角矩阵:只有对角线有非零元素,记作 $\text{diag}(d_1, d_2, \ldots, d_n)$
- 对称矩阵:满足 $A = A^T$,即 $a_{ij} = a_{ji}$
- 正交矩阵:满足 $Q^TQ = QQ^T = I$,即 $Q^{-1} = Q^T$
- 正定矩阵:对任意非零向量 $\vec{x}$,都有 $\vec{x}^T A \vec{x} > 0$
行列式
定义 行列式
方阵 $A$ 的行列式 $\det(A)$ 是一个标量,反映矩阵的"体积缩放因子"。
2×2 矩阵:
3×3 矩阵(按第一行展开):
📊 矩阵变换可视化 - 网格变换
📊 向量变换交互演示
[2, 1]
1.3 特征值与特征向量
定义 特征值与特征向量
设 $A$ 是 $n \times n$ 方阵,如果存在非零向量 $\vec{v}$ 和标量 $\lambda$,使得:
则称 $\lambda$ 为矩阵 $A$ 的特征值,$\vec{v}$ 为对应于 $\lambda$ 的特征向量。
求解方法
方法 特征值的计算
步骤1:解特征方程
步骤2:对每个特征值 $\lambda_i$,解线性方程组
得到对应的特征向量 $\vec{v}_i$。
例子 2×2矩阵的特征值
考虑矩阵:
解:
- 特征方程:$\det(A-\lambda I) = \begin{vmatrix} 4-\lambda & 1 \\ 2 & 3-\lambda \end{vmatrix} = 0$
- 展开:$(4-\lambda)(3-\lambda) - 2 = 0$
- 化简:$\lambda^2 - 7\lambda + 10 = 0$
- 解得:$\lambda_1 = 5, \quad \lambda_2 = 2$
特征值的性质
定理 特征值的重要性质
- 特征值之和等于矩阵的迹:$\sum \lambda_i = \text{tr}(A) = \sum a_{ii}$
- 特征值之积等于行列式:$\prod \lambda_i = \det(A)$
- 对称矩阵的特征值都是实数
- 正定矩阵的所有特征值都大于0
- 不同特征值对应的特征向量线性无关
特征值分解
定理 特征值分解(对角化)
如果 $n \times n$ 矩阵 $A$ 有 $n$ 个线性无关的特征向量,则可以分解为:
其中:
- $V = (\vec{v}_1, \vec{v}_2, \ldots, \vec{v}_n)$ 是特征向量组成的矩阵
- $\Lambda = \text{diag}(\lambda_1, \lambda_2, \ldots, \lambda_n)$ 是特征值对角矩阵
1. 计算数据的协方差矩阵 $\Sigma$
2. 对 $\Sigma$ 进行特征值分解
3. 最大特征值对应的特征向量就是第一主成分(数据方差最大的方向)
4. 保留前 $k$ 个主成分,实现降维
📊 特征向量与特征值可视化
import numpy as np
# 创建矩阵
A = np.array([[4, 1],
[2, 3]])
# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(A)
print("矩阵 A:")
print(A)
print("\n特征值:")
print(eigenvalues) # [5. 2.]
print("\n特征向量(每列是一个特征向量):")
print(eigenvectors)
# 验证: Av = λv
v1 = eigenvectors[:, 0]
print("\n验证 Av = λv:")
print("Av₁ =", A @ v1)
print("λ₁v₁ =", eigenvalues[0] * v1)
# 特征值分解
V = eigenvectors
Lambda = np.diag(eigenvalues)
A_reconstructed = V @ Lambda @ np.linalg.inv(V)
print("\n重构矩阵(应该等于A):")
print(A_reconstructed)
print("误差:", np.linalg.norm(A - A_reconstructed))1.4 奇异值分解(SVD)
定理 SVD分解
任意 $m \times n$ 矩阵 $A$ 都可以分解为:
其中:
- $U$ 是 $m \times m$ 正交矩阵(列向量称为左奇异向量)
- $\Sigma$ 是 $m \times n$ 对角矩阵,对角线元素 $\sigma_1 \geq \sigma_2 \geq \cdots \geq 0$ 称为奇异值
- $V$ 是 $n \times n$ 正交矩阵(列向量称为右奇异向量)
SVD的几何解释
任何矩阵变换 $A\vec{x}$ 都可以分解为三步:
- 旋转/反射:$V^T\vec{x}$(在输入空间中旋转)
- 伸缩:$\Sigma(V^T\vec{x})$(沿坐标轴方向缩放)
- 旋转/反射:$U(\Sigma V^T\vec{x})$(在输出空间中旋转)
低秩近似
定理 Eckart-Young定理
保留前 $k$ 个奇异值,得到矩阵的最优秩 $k$ 近似:
这是所有秩 $k$ 矩阵中,与 $A$ 最接近的(Frobenius范数意义下)。
• 数据降维:保留前 $k$ 个主成分,减少变量个数
• 图像压缩:用少量奇异值近似图像矩阵
• 推荐系统:用户-物品矩阵的SVD用于预测缺失评分
• 自然语言处理:LSA潜在语义分析用SVD提取词义
import numpy as np
# 创建示例矩阵
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# SVD分解
U, S, Vt = np.linalg.svd(A, full_matrices=False)
print("原始矩阵 A:")
print(A)
print("\n奇异值:")
print(S) # 奇异值从大到小排列
# 低秩近似
def low_rank_approx(A, k):
U, S, Vt = np.linalg.svd(A, full_matrices=False)
return U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
print("\n秩1近似:")
print(low_rank_approx(A, 1))
print("\n秩2近似:")
print(low_rank_approx(A, 2))
# 压缩率
original_params = A.shape[0] * A.shape[1]
compressed_params = k * (A.shape[0] + A.shape[1] + 1)
print(f"\n原始参数: {original_params}")
print(f"秩2近似参数: {compressed_params}")
print(f"压缩率: {compressed_params/original_params*100:.1f}%")∫ 第二篇:微积分
研究变化率与累积过程,以及函数的级数展开,是优化模型、动力学模型、信号处理的数学基础
2.1 极限与连续
定义 函数极限
设函数 $f(x)$ 在点 $a$ 的某个去心邻域内有定义。如果存在常数 $L$,对于任意给定的正数 $\varepsilon$,总存在正数 $\delta$,使得当 $0 < |x-a| < \delta$ 时,有:
则称 $L$ 为 $f(x)$ 当 $x \to a$ 时的极限,记作:
重要极限
公式 两个重要极限
极限一(三角函数):
极限二(自然对数底):
或等价形式:
连续性
定义 函数连续
函数 $f(x)$ 在点 $a$ 处连续,如果满足:
- $f(a)$ 有定义
- $\lim_{x \to a} f(x)$ 存在
- $\lim_{x \to a} f(x) = f(a)$
定理 闭区间上连续函数的性质
如果 $f(x)$ 在闭区间 $[a,b]$ 上连续,则:
- 有界性:$f(x)$ 在 $[a,b]$ 上有界
- 最值定理:$f(x)$ 在 $[a,b]$ 上必能取到最大值和最小值
- 介值定理:对任意介于 $f(a)$ 和 $f(b)$ 之间的值 $c$,存在 $\xi \in (a,b)$ 使得 $f(\xi) = c$
📊 极限可视化
2.2 导数与微分
定义 导数
函数 $f(x)$ 在点 $x$ 处的导数定义为:
如果该极限存在。导数也称为变化率或斜率。
基本求导公式
公式 常用导数公式
| 函数 | 导数 |
| $f(x) = c$(常数) | $f'(x) = 0$ |
| $f(x) = x^n$ | $f'(x) = nx^{n-1}$ |
| $f(x) = \sin x$ | $f'(x) = \cos x$ |
| $f(x) = \cos x$ | $f'(x) = -\sin x$ |
| $f(x) = e^x$ | $f'(x) = e^x$ |
| $f(x) = \ln x$ | $f'(x) = \frac{1}{x}$ |
求导法则
法则 四则运算与链式法则
四则运算:
链式法则(复合函数求导):
多元函数偏导数
定义 偏导数
对于多元函数 $f(x_1, x_2, \ldots, x_n)$,对 $x_i$ 的偏导数是将其余变量视为常数时的导数:
定义 梯度向量
多元函数 $f(x_1, x_2, \ldots, x_n)$ 的梯度是所有偏导数组成的向量:
性质:
- 梯度指向函数增长最快的方向
- 梯度的模 $\|\nabla f\|$ 表示增长的速率
- 梯度垂直于等值面(等高线)
📊 交互式导数与切线
拖动红色切点观察切线变化 · 拖动蓝色割线点理解极限过程
极值与优化
定理 极值的必要条件与充分条件
必要条件(Fermat定理):
如果 $f(x)$ 在 $x_0$ 处可导且取得极值,则 $f'(x_0) = 0$。
充分条件(二阶导数判别法):
- 如果 $f'(x_0) = 0$ 且 $f''(x_0) > 0$,则 $x_0$ 是极小值点
- 如果 $f'(x_0) = 0$ 且 $f''(x_0) < 0$,则 $x_0$ 是极大值点
- 如果 $f'(x_0) = 0$ 且 $f''(x_0) = 0$,无法判断,需进一步分析
import numpy as np
# 目标函数:f(x,y) = x² + 2y²
def f(x, y):
return x**2 + 2*y**2
# 梯度
def gradient(x, y):
return np.array([2*x, 4*y])
# 梯度下降算法
def gradient_descent(start, lr=0.1, epochs=100):
x = np.array(start, dtype=float)
path = [x.copy()]
for i in range(epochs):
grad = gradient(x[0], x[1])
x = x - lr * grad
path.append(x.copy())
if np.linalg.norm(grad) < 1e-6:
print(f"第{i+1}次迭代收敛")
break
return x, path
# 运行
start = [3.0, 3.0]
opt, path = gradient_descent(start, 0.1, 50)
print(f"起始点: {start}")
print(f"最优点: ({opt[0]:.4f}, {opt[1]:.4f})")
print(f"最小值: f = {f(opt[0], opt[1]):.6f}")
print(f"迭代次数: {len(path)-1}")2.3 积分
定义 不定积分(原函数)
如果 $F'(x) = f(x)$,则称 $F(x)$ 是 $f(x)$ 的一个原函数,记作:
其中 $C$ 是任意常数。
基本积分公式
公式 常用积分公式
| 积分 | 结果 |
| $\int x^n\,dx$ ($n \neq -1$) | $\frac{x^{n+1}}{n+1} + C$ |
| $\int \cos x\,dx$ | $\sin x + C$ |
| $\int \sin x\,dx$ | $-\cos x + C$ |
| $\int e^x\,dx$ | $e^x + C$ |
| $\int \frac{1}{x}\,dx$ | $\ln|x| + C$ |
定义 定积分
函数 $f(x)$ 在区间 $[a,b]$ 上的定积分定义为:
其中 $\Delta x = \frac{b-a}{n}$,$\xi_i \in [x_{i-1}, x_i]$。
几何意义:定积分表示曲线 $y=f(x)$ 与 $x$ 轴在区间 $[a,b]$ 上所围成的面积($x$ 轴上方为正,下方为负)。
定理 微积分基本定理(Newton-Leibniz公式)
如果 $F(x)$ 是 $f(x)$ 在 $[a,b]$ 上的一个原函数,则:
意义:这个定理建立了微分与积分之间的联系,把求定积分转化为求原函数。
积分方法
方法 换元积分法
令 $x = g(t)$,则:
例子:
令 $u = x^2$,则 $du = 2x\,dx$,代入得:
方法 分部积分法
由乘积求导法则 $(uv)' = u'v + uv'$ 可得:
例子:
取 $u = x$,$dv = e^x dx$,则 $du = dx$,$v = e^x$:
积分的应用
应用 积分在建模中的应用
- 累积量计算:总量 = $\int_a^b$ 速率$\,dt$
- 面积与体积:旋转体体积 $V = \pi\int_a^b [f(x)]^2\,dx$
- 概率计算:$P(a \leq X \leq b) = \int_a^b f(x)\,dx$
- 期望值:$E[X] = \int_{-\infty}^{\infty} x \cdot f(x)\,dx$
- 物理量:功 $W = \int \vec{F} \cdot d\vec{r}$,质心,转动惯量等
📊 交互式积分 - 拖动边界看面积变化
拖动绿色/蓝色边界点改变积分区间 · 观察黎曼和如何逼近真实面积
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
# 定义被积函数
def f(x):
return x**2 * np.sin(x)
# 方法1:SciPy数值积分
result, error = integrate.quad(f, 0, np.pi)
print(f"∫₀^π x²sin(x)dx = {result:.6f}")
print(f"误差估计: {error:.2e}")
# 方法2:梯形法则
x = np.linspace(0, np.pi, 1000)
y = f(x)
trap_result = np.trapz(y, x)
print(f"梯形法则结果: {trap_result:.6f}")
# 方法3:Simpson法则
simp_result = integrate.simps(y, x)
print(f"Simpson法则结果: {simp_result:.6f}")
# 可视化
fig, ax = plt.subplots(figsize=(10, 6))
ax.fill_between(x, y, alpha=0.3, label='积分区域')
ax.plot(x, y, linewidth=2)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('f(x)', fontsize=14)
ax.set_title(f'∫₀^π x²sin(x)dx = {result:.4f}', fontsize=16)
ax.legend()
ax.grid(True, alpha=0.3)
plt.savefig('integral_demo.png', dpi=150)
plt.show()2.4 微分方程
定义 常微分方程(ODE)
包含未知函数及其导数的方程称为微分方程。
其中 $y = y(x)$ 是未知函数,$y', y'', \ldots$ 是各阶导数。
阶数:方程中出现的最高阶导数的阶数。
解:使方程成立的函数 $y(x)$。
一阶常微分方程
类型 可分离变量方程
形如:
解法:分离变量后积分
例子 - Malthus人口模型:
解得:
类型 一阶线性方程
形如:
解法:使用积分因子 $\mu(x) = e^{\int P(x)\,dx}$
高阶线性方程
定理 二阶常系数线性齐次方程
方程:
解法:设 $y = e^{rx}$,代入得特征方程:
根据特征根的情况:
- 两个不等实根 $r_1 \neq r_2$:$y = C_1 e^{r_1 x} + C_2 e^{r_2 x}$
- 重根 $r_1 = r_2 = r$:$y = (C_1 + C_2 x)e^{rx}$
- 共轭复根 $r = \alpha \pm i\beta$:$y = e^{\alpha x}(C_1\cos\beta x + C_2\sin\beta x)$
数值解法
方法 Euler方法
对于初值问题 $\frac{dy}{dt} = f(t,y)$,$y(t_0) = y_0$:
其中 $h$ 是步长。Euler方法是一阶方法,局部截断误差为 $O(h^2)$。
方法 四阶Runge-Kutta方法(RK4)
更精确的数值方法:
其中:
RK4是四阶方法,局部截断误差为 $O(h^5)$,精度远高于Euler方法。
Lorenz方程描述大气对流,是最早发现的混沌系统之一:
更多常见微分方程模型
模型 Logistic人口模型(自限增长)
考虑资源限制,人口增长满足:
其中 $r$ 是增长率,$K$ 是环境承载能力。
解:
特点:S形曲线,初期指数增长,后期趋于饱和。
模型 弹簧-质量系统(简谐振动)
牛顿第二定律 + 胡克定律:
其中 $m$ 是质量,$c$ 是阻尼系数,$k$ 是弹簧刚度。
特征方程:$mr^2 + cr + k = 0$
- 欠阻尼($c^2 < 4mk$):振荡衰减,$x(t) = Ae^{-\alpha t}\cos(\omega t + \phi)$
- 临界阻尼($c^2 = 4mk$):最快回到平衡位置,不振荡
- 过阻尼($c^2 > 4mk$):缓慢回到平衡位置
模型 SIR传染病模型
将人群分为三类:
- S(t):易感者(Susceptible)
- I(t):感染者(Infected)
- R(t):移除者(Recovered/Removed)
其中 $\beta$ 是传染率,$\gamma$ 是恢复率。基本再生数 $R_0 = \beta/\gamma$。
📊 微分方程数值解比较
import numpy as np
from scipy.integrate import solve_ivp, odeint
import matplotlib.pyplot as plt
# 示例1:人口增长模型 dP/dt = rP
def population_model(t, P, r=0.02):
return r * P
# 求解
t_span = (0, 100)
t_eval = np.linspace(0, 100, 200)
P0 = [100] # 初始人口
sol = solve_ivp(population_model, t_span, P0, t_eval=t_eval)
# 解析解对比
P_analytical = 100 * np.exp(0.02 * t_eval)
plt.figure(figsize=(10, 6))
plt.plot(t_eval, sol.y[0], 'b-', linewidth=2, label='数值解')
plt.plot(t_eval, P_analytical, 'r--', linewidth=2, label='解析解')
plt.xlabel('时间 t', fontsize=12)
plt.ylabel('人口 P(t)', fontsize=12)
plt.title('Malthus人口模型', fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('population_model.png', dpi=150)
plt.show()
# 示例2:Lorenz混沌系统
def lorenz(t, state, sigma=10, rho=28, beta=8/3):
x, y, z = state
return [sigma*(y - x),
x*(rho - z) - y,
x*y - beta*z]
# 求解(两个非常接近的初始条件)
t_span = (0, 50)
t_eval = np.linspace(0, 50, 5000)
y0_1 = [1.0, 1.0, 1.0]
y0_2 = [1.0001, 1.0, 1.0] # 微小差异
sol1 = solve_ivp(lorenz, t_span, y0_1, t_eval=t_eval)
sol2 = solve_ivp(lorenz, t_span, y0_2, t_eval=t_eval)
# 绘制混沌吸引子和蝴蝶效应
fig = plt.figure(figsize=(14, 6))
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot(sol1.y[0], sol1.y[1], sol1.y[2], 'b-', linewidth=0.5)
ax1.set_title('Lorenz吸引子', fontsize=14)
ax1.set_xlabel('x', fontsize=10)
ax1.set_ylabel('y', fontsize=10)
ax1.set_zlabel('z', fontsize=10)
ax2 = fig.add_subplot(122)
ax2.plot(t_eval, sol1.y[0], 'b-', linewidth=1, label='初始 x₀=1.0')
ax2.plot(t_eval, sol2.y[0], 'r--', linewidth=1, label='初始 x₀=1.0001')
ax2.set_title('蝴蝶效应(敏感依赖于初始条件)', fontsize=14)
ax2.set_xlabel('时间 t', fontsize=12)
ax2.set_ylabel('x(t)', fontsize=12)
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('lorenz_chaos.png', dpi=150)
plt.show()2.5 泰勒级数展开
定理 泰勒公式
如果函数 $f(x)$ 在点 $a$ 处 $n+1$ 阶可导,则:
其中余项 $R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!}(x-a)^{n+1}$,$\xi$ 在 $a$ 与 $x$ 之间。
常用函数的麦克劳林展开($a = 0$)
公式 常用展开式
| 函数 | 泰勒展开 | 收敛域 |
| $e^x$ | $1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots$ | $(-\infty, +\infty)$ |
| $\sin x$ | $x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdots$ | $(-\infty, +\infty)$ |
| $\cos x$ | $1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \cdots$ | $(-\infty, +\infty)$ |
| $\ln(1+x)$ | $x - \frac{x^2}{2} + \frac{x^3}{3} - \cdots$ | $(-1, 1]$ |
| $\frac{1}{1-x}$ | $1 + x + x^2 + x^3 + \cdots$ | $(-1, 1)$ |
近似计算与误差分析
例子 用泰勒展开计算 $\sin(0.5)$
取前3项(到 $x^5$):
精确值:$\sin(0.5) = 0.47943\ldots$,误差小于 $10^{-5}$。
📊 泰勒展开近似效果
import numpy as np
import matplotlib.pyplot as plt
def taylor_sin(x, n):
"""sin(x) 的 n 阶泰勒展开"""
result = 0
for k in range(n+1):
term = ((-1)**k) * x**(2*k+1) / np.math.factorial(2*k+1)
result += term
return result
def taylor_exp(x, n):
"""eˣ 的 n 阶泰勒展开"""
return sum(x**k / np.math.factorial(k) for k in range(n+1))
x = np.linspace(-2*np.pi, 2*np.pi, 500)
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'k-', linewidth=2, label='sin(x) 精确值')
for n in [1, 3, 5, 9]:
y_approx = [taylor_sin(xi, n) for xi in x]
plt.plot(x, y_approx, '--', linewidth=1.5, label=f'n={n}')
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
plt.title('sin(x) 的泰勒展开', fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.ylim(-3, 3)
plt.savefig('taylor_sin.png', dpi=150)
plt.show()2.6 傅里叶级数展开
定理 傅里叶级数
如果 $f(x)$ 是周期为 $2\pi$ 的函数,则可以展开为:
其中系数:
傅里叶级数 vs 泰勒级数
对比 两种展开方法
| 特性 | 泰勒级数 | 傅里叶级数 |
| 基函数 | $(x-a)^n$(多项式) | $\sin(nx), \cos(nx)$ |
| 适用函数 | 光滑函数(局部) | 周期函数(全局) |
| 逼近范围 | 展开点附近 | 整个周期 |
| 主要应用 | 近似计算、线性化 | 信号处理、振动分析 |
函数的奇偶性与傅里叶系数
性质 奇函数与偶函数
- 偶函数 $f(-x) = f(x)$:只有余弦项($b_n = 0$)
- 奇函数 $f(-x) = -f(x)$:只有正弦项($a_n = 0$)
例子:方波是奇函数,展开为纯正弦级数。
吉布斯现象
现象 吉布斯(Gibbs)现象
在函数的间断点附近,傅里叶级数的部分和会出现过冲(overshoot),即使项数增加,过冲幅度也不会消失,只会被压缩到更窄的区间。
过冲量:约等于跳跃值的 9%。
📊 傅里叶级数逼近
import numpy as np
import matplotlib.pyplot as plt
# 方波的傅里叶级数: f(x) = 4/π * Σ sin((2k-1)x)/(2k-1)
def fourier_square(x, n_terms):
result = 0
for k in range(1, n_terms+1):
result += np.sin((2*k-1)*x) / (2*k-1)
return (4/np.pi) * result
# 锯齿波: f(x) = 2/π * Σ (-1)^(k+1) * sin(kx)/k
def fourier_sawtooth(x, n_terms):
result = 0
for k in range(1, n_terms+1):
result += ((-1)**(k+1)) * np.sin(k*x) / k
return (2/np.pi) * result
x = np.linspace(-2*np.pi, 2*np.pi, 1000)
plt.figure(figsize=(12, 5))
# 方波
plt.subplot(1, 2, 1)
plt.plot(x, np.sign(np.sin(x)), 'k--', linewidth=1, alpha=0.5, label='理想方波')
for n in [1, 3, 7, 20]:
plt.plot(x, fourier_square(x, n), linewidth=1.5, label=f'N={n}')
plt.title('方波的傅里叶级数展开', fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.ylim(-1.5, 1.5)
# 锯齿波
plt.subplot(1, 2, 2)
target = (2/np.pi) * np.arctan2(np.sin(x), np.cos(x))
plt.plot(x, target, 'k--', linewidth=1, alpha=0.5, label='理想锯齿波')
for n in [1, 3, 7, 20]:
plt.plot(x, fourier_sawtooth(x, n), linewidth=1.5, label=f'N={n}')
plt.title('锯齿波的傅里叶级数展开', fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.ylim(-1.5, 1.5)
plt.tight_layout()
plt.savefig('fourier_series.png', dpi=150)
plt.show()🎲 第三篇:概率统计
研究随机现象的规律性,是数据分析、统计推断、风险评估的数学基础
3.1 概率基础
定义 概率的公理化定义
设随机试验的样本空间为 $\Omega$,对任意事件 $A \subseteq \Omega$,概率 $P(A)$ 满足:
- 非负性:$P(A) \geq 0$
- 规范性:$P(\Omega) = 1$
- 可列可加性:若 $A_1, A_2, \ldots$ 两两互斥,则 $P(\bigcup_i A_i) = \sum_i P(A_i)$
条件概率与独立性
定义 条件概率
在事件 $B$ 已发生的条件下,事件 $A$ 发生的概率:
定理 Bayes公式
设 $B_1, B_2, \ldots, B_n$ 是样本空间的一个划分(互斥且完备),则对任意事件 $A$:
各部分含义:
- $P(B_i)$:先验概率(看到证据前的信念)
- $P(A|B_i)$:似然(假设成立时观察到证据的概率)
- $P(B_i|A)$:后验概率(看到证据后的更新信念)
例子 医学检测问题
某疾病发病率0.1%,检测灵敏度99%,假阳性率2%。如果检测结果为阳性,实际患病的概率是多少?
解:
即使检测精度很高,由于疾病本身很罕见,阳性结果中大部分仍是假阳性!这就是"罕见病悖论"。
随机变量
定义 随机变量
随机变量 $X$ 是将样本空间 $\Omega$ 中的每个样本点映射到实数的函数:
分为离散型(取有限或可列个值)和连续型(在区间内可取任意值)。
定义 概率分布函数
离散型 — 概率质量函数(PMF):$P(X = x_k) = p_k$
连续型 — 概率密度函数(PDF)$f(x)$:
满足 $f(x) \geq 0$ 且 $\int_{-\infty}^{\infty} f(x)\,dx = 1$。
期望与方差
定义 数学期望(均值)
离散型:
连续型:
性质:
- $E[aX + b] = aE[X] + b$
- $E[X + Y] = E[X] + E[Y]$(无论是否独立)
- 若 $X,Y$ 独立:$E[XY] = E[X]E[Y]$
定义 方差与标准差
方差度量随机变量偏离其期望的程度:
标准差:$\sigma_X = \sqrt{\text{Var}(X)}$,与 $X$ 有相同的量纲。
性质:
- $\text{Var}(aX + b) = a^2\text{Var}(X)$
- 若 $X,Y$ 独立:$\text{Var}(X+Y) = \text{Var}(X) + \text{Var}(Y)$
3.2 常见概率分布
离散分布
分布 二项分布 $B(n,p)$
场景:$n$ 次独立Bernoulli试验中成功的次数,每次成功概率为 $p$。
期望与方差:
分布 Poisson分布 $\text{Poi}(\lambda)$
场景:单位时间内某事件发生的次数,如客服电话、放射性衰变。
与二项分布的关系:当 $n$ 很大、$p$ 很小且 $np = \lambda$ 适中时,$B(n,p) \approx \text{Poi}(\lambda)$。
连续分布
分布 正态(高斯)分布 $N(\mu, \sigma^2)$
最重要的概率分布,概率密度函数:
标准正态分布:$Z \sim N(0, 1)$,通过标准化:
3σ法则:
- $P(\mu - \sigma \leq X \leq \mu + \sigma) \approx 68.27\%$
- $P(\mu - 2\sigma \leq X \leq \mu + 2\sigma) \approx 95.45\%$
- $P(\mu - 3\sigma \leq X \leq \mu + 3\sigma) \approx 99.73\%$
定理 中心极限定理(CLT)
设 $X_1, X_2, \ldots, X_n$ 是独立同分布的随机变量,$E[X_i] = \mu$,$\text{Var}(X_i) = \sigma^2$,则当 $n$ 充分大时:
或等价地:
意义:无论原始分布是什么,样本均值的分布趋向于正态分布。这是统计推断的基石。
分布 其他重要分布
- 均匀分布 $U(a,b)$:$f(x) = \frac{1}{b-a}$,$x \in [a,b]$
- 指数分布 $\text{Exp}(\lambda)$:$f(x) = \lambda e^{-\lambda x}$,$x \geq 0$(等待时间)
- 卡方分布 $\chi^2(n)$:$n$ 个独立标准正态变量平方和(假设检验)
- t分布 $t(n)$:小样本均值检验
- F分布 $F(m,n)$:方差比的检验
📊 概率分布可视化
拖动滑块调节参数,观察正态分布曲线变化
📊 中心极限定理演示
观察不同分布的样本均值如何趋向正态分布
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 正态分布(不同参数)
x = np.linspace(-5, 5, 500)
for mu, sigma in [(0, 1), (0, 2), (2, 1)]:
y = stats.norm.pdf(x, mu, sigma)
label = f'μ={mu}, σ={sigma}'
axes[0,0].plot(x, y, linewidth=2, label=label)
axes[0,0].set_title('正态分布', fontsize=14)
axes[0,0].legend()
axes[0,0].grid(True, alpha=0.3)
# 2. 二项分布 vs Poisson近似
n, p = 50, 0.1
k = np.arange(0, 20)
binom_pmf = stats.binom.pmf(k, n, p)
poisson_pmf = stats.poisson.pmf(k, n*p)
axes[0,1].bar(k, binom_pmf, alpha=0.6, label=f'二项 B({n},{p})')
axes[0,1].plot(k, poisson_pmf, 'r-o', linewidth=2, label=f'Poisson(λ={n*p})')
axes[0,1].set_title('二项分布与Poisson近似', fontsize=14)
axes[0,1].legend()
axes[0,1].grid(True, alpha=0.3)
# 3. 中心极限定理演示
sample_means = []
for _ in range(10000):
samples = np.random.exponential(scale=2, size=100)
sample_means.append(np.mean(samples))
axes[1,0].hist(sample_means, bins=50, density=True, alpha=0.7, label='样本均值分布')
# 理论正态
x_norm = np.linspace(0, 4, 200)
axes[1,0].plot(x_norm, stats.norm.pdf(x_norm, 2, 2/np.sqrt(100)),
'r-', linewidth=2, label='理论正态')
axes[1,0].set_title('中心极限定理(指数分布样本均值)', fontsize=14)
axes[1,0].legend()
axes[1,0].grid(True, alpha=0.3)
# 4. 卡方分布
x = np.linspace(0, 30, 500)
for df in [1, 2, 5, 10]:
axes[1,1].plot(x, stats.chi2.pdf(x, df), linewidth=2, label=f'df={df}')
axes[1,1].set_title('卡方分布', fontsize=14)
axes[1,1].legend()
axes[1,1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('probability_distributions.png', dpi=150)
plt.show()3.3 参数估计
定义 点估计
用样本统计量 $\hat{\theta}$ 来估计总体参数 $\theta$ 的值。
常用方法:
- 矩估计:用样本矩估计总体矩(如样本均值估计总体均值)
- 极大似然估计(MLE):选择使观测数据出现概率最大的参数值
方法 极大似然估计
步骤:
- 写出似然函数:$L(\theta) = \prod_{i=1}^n f(x_i;\theta)$
- 取对数:$\ell(\theta) = \ln L(\theta) = \sum_{i=1}^n \ln f(x_i;\theta)$
- 求导并令为0:$\frac{d\ell}{d\theta} = 0$
- 解方程得 $\hat{\theta}_{\text{MLE}}$
例子 - 正态分布的MLE:
区间估计
定义 置信区间
对于给定的置信水平 $1-\alpha$(如95%),参数 $\theta$ 的置信区间 $[\hat{\theta}_L, \hat{\theta}_U]$ 满足:
正态总体均值的置信区间(方差未知):
其中 $S$ 是样本标准差,$t_{\alpha/2}(n-1)$ 是自由度为 $n-1$ 的 t 分布的上 $\alpha/2$ 分位数。
import numpy as np
from scipy import stats
# 示例数据:某批零件的测量值(单位:mm)
np.random.seed(42)
data = np.random.normal(loc=50.0, scale=2.5, size=30)
# ===== 1. 矩估计 =====
mu_hat = np.mean(data) # 均值估计
sigma_hat = np.std(data, ddof=1) # 标准差估计(无偏)
print("=== 矩估计 ===")
print(f"样本均值(μ的估计): {mu_hat:.4f}")
print(f"样本标准差(σ的估计): {sigma_hat:.4f}")
print(f"样本量: {len(data)}")
# ===== 2. 正态分布均值的置信区间 =====
confidence = 0.95
alpha = 1 - confidence
n = len(data)
se = sigma_hat / np.sqrt(n) # 标准误差
# t分布临界值
t_critical = stats.t.ppf(1 - alpha/2, df=n-1)
ci_lower = mu_hat - t_critical * se
ci_upper = mu_hat + t_critical * se
print(f"\n=== {confidence*100:.0f}% 置信区间 ===")
print(f"t临界值 t_{{α/2}}(n-1) = t_{{0.025}}({n-1}) = {t_critical:.4f}")
print(f"标准误差 SE = {se:.4f}")
print(f"均值的{confidence*100:.0f}%置信区间: [{ci_lower:.4f}, {ci_upper:.4f}]")
# 验证:使用scipy直接计算
ci = stats.t.interval(confidence, df=n-1, loc=mu_hat, scale=se)
print(f"scipy验证: [{ci[0]:.4f}, {ci[1]:.4f}]")
# ===== 3. 正态分布的MLE参数估计 =====
mu_mle, sigma_mle = stats.norm.fit(data)
print(f"\n=== 极大似然估计(MLE)===")
print(f"μ_MLE = {mu_mle:.4f}(等于样本均值)")
print(f"σ_MLE = {sigma_mle:.4f}(有偏,分母为n而非n-1)")
# ===== 4. 样本量对置信区间宽度的影响 =====
print("\n=== 样本量对置信区间宽度的影响 ===")
for n_size in [10, 30, 100, 1000]:
sample = np.random.normal(50, 2.5, n_size)
ci_s = stats.t.interval(0.95, df=n_size-1,
loc=np.mean(sample),
scale=stats.sem(sample))
width = ci_s[1] - ci_s[0]
print(f"n={n_size:4d}: 区间宽度 = {width:.4f}")3.4 假设检验
定义 假设检验的基本框架
步骤:
- 建立假设:
- 原假设 $H_0$(通常为"无效应"或"无差异")
- 备择假设 $H_1$(研究者想要证明的)
- 选择检验统计量:如 $Z$ 统计量、$t$ 统计量、$\chi^2$ 统计量
- 确定显著性水平 $\alpha$(常用0.05或0.01)
- 计算p值:在 $H_0$ 成立的前提下,观察到当前或更极端结果的概率
- 做出决策:
- 如果 $p \leq \alpha$,拒绝 $H_0$(结果"统计显著")
- 如果 $p > \alpha$,不拒绝 $H_0$(证据不足)
定义 p值
p值是在原假设 $H_0$ 为真的条件下,观察到当前样本或更极端结果的概率。
p值越小,说明在 $H_0$ 下观察到的数据越"不可思议",越有理由拒绝 $H_0$。
常见检验方法
检验 单样本t检验
目的:检验总体均值是否等于某个指定值 $\mu_0$。
检验统计量:
决策规则:如果 $|t| > t_{\alpha/2}(n-1)$,则拒绝 $H_0$。
检验 两样本t检验
目的:检验两个总体的均值是否相等。
检验统计量(方差齐性假定):
其中 $S_p$ 是合并标准差。
检验 卡方检验
目的:检验分类变量之间的独立性或拟合优度。
其中 $O_i$ 是观测频数,$E_i$ 是期望频数。
• 第一类错误(弃真):$H_0$ 为真但拒绝了它,概率为 $\alpha$(显著性水平)
• 第二类错误(取伪):$H_0$ 为假但没拒绝它,概率为 $\beta$
• 检验功效(Power):$1 - \beta$,即 $H_0$ 为假时正确拒绝的概率
• 在样本量固定时,减小 $\alpha$ 会增大 $\beta$,需要权衡。
📊 假设检验可视化
观察 p 值、拒绝域和检验功效的几何意义
import numpy as np
from scipy import stats
# 示例1:单样本t检验
# 问题:某厂生产的零件平均长度是否为10cm?
sample_data = np.array([10.1, 9.8, 10.3, 9.9, 10.0, 10.2, 9.7, 10.1, 9.8, 10.0])
# 执行t检验
t_stat, p_value = stats.ttest_1samp(sample_data, popmean=10.0)
print("=== 单样本t检验 ===")
print(f"样本均值: {np.mean(sample_data):.3f}")
print(f"样本标准差: {np.std(sample_data, ddof=1):.3f}")
print(f"t统计量: {t_stat:.4f}")
print(f"p值: {p_value:.4f}")
if p_value > 0.05:
print("结论: p > 0.05, 不拒绝H₀, 没有足够证据说明均值不同于10cm")
else:
print("结论: p ≤ 0.05, 拒绝H₀, 均值显著不同于10cm")
# 示例2:两样本t检验
# 问题:两种教学方法的效果是否有差异?
group_a = np.array([85, 88, 90, 82, 87, 91, 86, 89])
group_b = np.array([78, 80, 85, 76, 82, 79, 83, 81])
t_stat2, p_value2 = stats.ttest_ind(group_a, group_b)
print("\n=== 两样本t检验 ===")
print(f"A组均值: {np.mean(group_a):.2f}")
print(f"B组均值: {np.mean(group_b):.2f}")
print(f"t统计量: {t_stat2:.4f}")
print(f"p值: {p_value2:.4f}")
if p_value2 < 0.05:
print("结论: p ≤ 0.05, 拒绝H₀, 两种教学方法效果有显著差异")
else:
print("结论: p > 0.05, 不拒绝H₀")
# 示例3:卡方独立性检验
# 问题:吸烟与患肺癌是否有关?
observed = np.array([[40, 60], # 吸烟: 患癌40, 未患癌60
[10, 90]]) # 不吸烟: 患癌10, 未患癌90
chi2, p_chi, dof, expected = stats.chi2_contingency(observed)
print("\n=== 卡方独立性检验 ===")
print(f"卡方统计量: {chi2:.4f}")
print(f"自由度: {dof}")
print(f"p值: {p_chi:.6f}")
print(f"期望频数:\n{expected}")
if p_chi < 0.05:
print("结论: p ≤ 0.05, 拒绝H₀, 吸烟与患肺癌有关联")
else:
print("结论: p > 0.05, 不拒绝H₀")
# 示例4:线性回归与相关性检验
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.array([2.3, 4.1, 6.2, 8.0, 10.1, 11.8, 14.2, 16.0, 17.9, 20.1])
slope, intercept, r_value, p_value_reg, std_err = stats.linregress(x, y)
print("\n=== 线性回归 ===")
print(f"回归方程: y = {slope:.3f}x + {intercept:.3f}")
print(f"相关系数 r = {r_value:.4f}")
print(f"R² = {r_value**2:.4f}")
print(f"p值 = {p_value_reg:.6f}")
if p_value_reg < 0.05:
print("结论: x与y之间存在显著的线性关系")建模应用 数学建模竞赛中的统计方法
- 数据预处理:异常值检测(3σ原则)、缺失值处理、数据标准化
- 特征选择:相关性分析、方差分析(ANOVA)、卡方检验
- 模型验证:残差分析、拟合优度检验、交叉验证
- 结果分析:显著性检验、置信区间、效应量分析
- 预测模型:线性回归、逻辑回归、时间序列分析
🔗 第六篇:相关分析
研究变量之间的关联程度与方向,是数据分析、特征工程和因果推断的重要工具
6.1 相关系数概述
定义 相关性
相关性描述了两个变量之间线性或单调关系的方向和强度。
- 正相关:一个变量增大,另一个也倾向于增大
- 负相关:一个变量增大,另一个倾向于减小
- 不相关:两个变量之间没有明显的关联模式
三种常用相关系数
对比 三种相关系数的适用场景
| 相关系数 | 度量关系 | 数据要求 | 取值范围 |
| 皮尔逊 (Pearson) | 线性关系 | 连续变量,近似正态分布 | [-1, 1] |
| 斯皮尔曼 (Spearman) | 单调关系 | 有序变量,任意分布 | [-1, 1] |
| 肯德尔 (Kendall's τ) | 单调关系 | 有序变量,小样本 | [-1, 1] |
6.2 皮尔逊相关系数(Pearson)
定义 皮尔逊相关系数
皮尔逊相关系数 $r$ 衡量两个变量之间的线性相关程度:
其中 $\text{Cov}(X,Y)$ 是 $X$ 和 $Y$ 的协方差,$\sigma_X$ 和 $\sigma_Y$ 分别是 $X$ 和 $Y$ 的标准差。
性质解读
性质 皮尔逊相关系数的重要性质
- 取值范围:$-1 \leq r \leq 1$
- $r = 1$:完全正线性相关,所有点恰好在一条斜率为正的直线上
- $r = -1$:完全负线性相关,所有点恰好在一条斜率为负的直线上
- $r = 0$:无线性相关(但可能存在非线性关系!)
- 对称性:$r_{XY} = r_{YX}$
- 尺度不变性:对 $X$ 或 $Y$ 做线性变换(乘常数加常数),$r$ 不变
相关强度的经验判断
经验 相关系数大小解读
| |r| 范围 | 相关强度 | 示例 |
| 0.8 ~ 1.0 | 极强相关 | 身高与体重(同年龄段) |
| 0.6 ~ 0.8 | 强相关 | 学习时间与考试成绩 |
| 0.4 ~ 0.6 | 中等相关 | 温度与冰淇淋销量 |
| 0.2 ~ 0.4 | 弱相关 | 广告投入与销售额 |
| 0.0 ~ 0.2 | 极弱或无相关 | shoe size 与 IQ |
假设检验
检验 皮尔逊相关系数的显著性检验
假设:
检验统计量:
决策规则:如果 $|t| > t_{\alpha/2}(n-2)$,则拒绝 $H_0$,认为相关系数显著不为0。
• 只度量线性关系,对非线性关系不敏感(如 $y = x^2$ 可能 $r \approx 0$)
• 对异常值非常敏感,一个极端值可以大幅改变 $r$ 值
• 要求数据近似正态分布,否则检验结果可能不可靠
• 当数据不满足假定时,应使用斯皮尔曼或肯德尔相关系数
📊 皮尔逊相关系数交互式演示
拖动数据点或点击预设观察相关系数变化
import numpy as np
from scipy import stats
# 示例数据:学习时间与考试成绩
study_hours = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
exam_scores = np.array([52, 55, 58, 62, 68, 72, 78, 82, 88, 95])
# 方法1:手动计算
x_mean = np.mean(study_hours)
y_mean = np.mean(exam_scores)
numerator = np.sum((study_hours - x_mean) * (exam_scores - y_mean))
denominator = np.sqrt(np.sum((study_hours - x_mean)**2) * np.sum((exam_scores - y_mean)**2))
r_manual = numerator / denominator
print(f"手动计算 r = {r_manual:.4f}")
# 方法2:使用 numpy
r_numpy = np.corrcoef(study_hours, exam_scores)[0, 1]
print(f"numpy 计算 r = {r_numpy:.4f}")
# 方法3:使用 scipy(同时获得p值)
r_scipy, p_value = stats.pearsonr(study_hours, exam_scores)
print(f"scipy 计算 r = {r_scipy:.4f}, p = {p_value:.6f}")
# 相关强度判断
def interpret_correlation(r):
abs_r = abs(r)
if abs_r >= 0.8: return "极强相关"
elif abs_r >= 0.6: return "强相关"
elif abs_r >= 0.4: return "中等相关"
elif abs_r >= 0.2: return "弱相关"
else: return "极弱或无相关"
print(f"\n相关强度: {interpret_correlation(r_scipy)}")
print(f"R² = {r_scipy**2:.4f}({r_scipy**2*100:.1f}%的方差被解释)")
# 显著性检验
t_stat = r_scipy * np.sqrt((len(study_hours) - 2) / (1 - r_scipy**2))
print(f"t统计量 = {t_stat:.4f}")
print(f"在α=0.05水平下,相关性{'显著' if p_value < 0.05 else '不显著'}")6.3 斯皮尔曼等级相关系数(Spearman)
定义 斯皮尔曼等级相关系数
斯皮尔曼相关系数 $\rho$(或 $r_s$)是一种非参数相关度量,基于变量的秩次(排序)而非原始值。它度量的是两个变量之间单调关系的强度。
计算公式(无结时):
其中 $d_i = \text{rank}(x_i) - \text{rank}(y_i)$ 是第 $i$ 对观测值的秩次差。
一般公式(有结时):对秩次数据计算皮尔逊相关系数即可。
与皮尔逊的比较
对比 Spearman vs Pearson
| 特性 | 皮尔逊 $r$ | 斯皮尔曼 $\rho$ |
| 度量关系 | 线性关系 | 单调关系 |
| 数据类型 | 连续变量 | 连续或有序分类 |
| 分布假设 | 近似正态分布 | 无分布假设(非参数) |
| 异常值敏感度 | 敏感 | 稳健(使用秩次) |
| 计算基础 | 原始值 | 秩次(排序) |
适用场景
场景 何时使用斯皮尔曼相关系数
- 数据不满足正态分布:偏态分布或有极端值
- 存在非线性单调关系:如 $y = e^x$ 或 $y = \sqrt{x}$
- 有序分类数据:如满意度评分(1-5星)、排名数据
- 样本量较小:非参数方法在小样本下更稳健
- 存在异常值:秩次方法天然抗异常值干扰
📊 斯皮尔曼相关系数演示
对比同一数据集上 Pearson 和 Spearman 相关系数的差异
import numpy as np
from scipy import stats
# 示例1:单调非线性关系
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.exp(x * 0.3) # 指数增长
# 皮尔逊 vs 斯皮尔曼
r_pearson, p_pearson = stats.pearsonr(x, y)
r_spearman, p_spearman = stats.spearmanr(x, y)
print("=== 单调非线性关系:y = e^(0.3x) ===")
print(f"Pearson r = {r_pearson:.4f}, p = {p_pearson:.6f}")
print(f"Spearman ρ = {r_spearman:.4f}, p = {p_spearman:.6f}")
print("→ Spearman = 1.0(完美单调关系),Pearson < 1")
# 示例2:含异常值的数据
np.random.seed(42)
x2 = np.random.randn(100)
y2 = x2 + np.random.randn(100) * 0.5
# 加入异常值
x2[99] = 10
y2[99] = -10
r2_p, p2_p = stats.pearsonr(x2, y2)
r2_s, p2_s = stats.spearmanr(x2, y2)
print("\n=== 含异常值的数据 ===")
print(f"Pearson r = {r2_p:.4f}, p = {p2_p:.6f}")
print(f"Spearman ρ = {r2_s:.4f}, p = {p2_s:.6f}")
print("→ Spearman 受异常值影响小,更稳健")
# 示例3:手动计算(演示秩次转换)
x3 = [85, 92, 78, 95, 88]
y3 = [80, 90, 75, 92, 85]
rank_x = [sorted(x3).index(v)+1 for v in x3]
rank_y = [sorted(y3).index(v)+1 for v in y3]
d_squared = sum((rx - ry)**2 for rx, ry in zip(rank_x, rank_y))
n = len(x3)
rho_manual = 1 - 6*d_squared / (n*(n**2 - 1))
print("\n=== 手动计算斯皮尔曼 ===")
print(f"秩次X: {rank_x}")
print(f"秩次Y: {rank_y}")
print(f"Σd² = {d_squared}")
print(f"ρ = 1 - 6×{d_squared}/({n}×{n**2-1}) = {rho_manual:.4f}")6.4 肯德尔等级相关系数(Kendall's τ)
定义 肯德尔 τ 相关系数
肯德尔相关系数基于数据对的一致性来度量两个变量的关联程度。
一致对与不一致对:
- 对于两对观测 $(x_i, y_i)$ 和 $(x_j, y_j)$($i < j$):
- 如果 $(x_i - x_j)$ 和 $(y_i - y_j)$ 同号,称为一致对(concordant)
- 如果 $(x_i - x_j)$ 和 $(y_i - y_j)$ 异号,称为不一致对(discordant)
计算公式(τ-a):
其中 $n_c$ 是一致对数,$n_d$ 是不一致对数,$n$ 是样本量。
三种变体
定义 肯德尔 τ 的三种变体
- τ-a:基本公式,不考虑结(ties)
- τ-b:校正结的影响,适合有相同值的数据
- τ-c (τ-c):适合列联表(两个变量类别数不同)
τ-b 公式:
其中 $T_X$ 和 $T_Y$ 分别是 $X$ 和 $Y$ 中结的对数。
三种相关系数对比总结
总结 Pearson、Spearman、Kendall 对比
| 特性 | Pearson | Spearman | Kendall |
| 关系类型 | 线性 | 单调 | 单调 |
| 数据要求 | 连续、正态 | 有序即可 | 有序即可 |
| 异常值 | 敏感 | 稳健 | 最稳健 |
| 计算复杂度 | $O(n)$ | $O(n \log n)$ | $O(n^2)$ |
| 统计功效 | 最高(正态时) | 中等 | 略低于Spearman |
| 推荐场景 | 线性、正态、大样本 | 一般单调关系 | 小样本、有结 |
📊 三种相关系数综合对比
同一数据集上同时显示 Pearson、Spearman 和 Kendall 相关系数
import numpy as np
from scipy import stats
np.random.seed(42)
n = 100
# 场景1:完美线性
x1 = np.linspace(1, 10, n)
y1 = 2 * x1 + np.random.randn(n) * 0.5
# 场景2:非线性单调(指数)
x2 = np.linspace(0.5, 3, n)
y2 = np.exp(x2)
# 场景3:非单调(二次)
x3 = np.linspace(-3, 3, n)
y3 = x3**2 + np.random.randn(n) * 0.3
# 场景4:含异常值
x4 = np.random.randn(n)
y4 = x4 + np.random.randn(n) * 0.5
x4[-1], y4[-1] = 8, -8 # 异常值
def compare_all(x, y, label):
rp, pp = stats.pearsonr(x, y)
rs, ps = stats.spearmanr(x, y)
rk, pk = stats.kendalltau(x, y)
print(f"\n=== {label} ===")
print(f"Pearson: r = {rp:+.4f} (p={pp:.4f})")
print(f"Spearman: ρ = {rs:+.4f} (p={ps:.4f})")
print(f"Kendall: τ = {rk:+.4f} (p={pk:.4f})")
compare_all(x1, y1, "线性+噪声")
compare_all(x2, y2, "指数关系")
compare_all(x3, y3, "二次关系(非单调)")
compare_all(x4, y4, "含异常值")• 默认选 Spearman:适用于大多数场景,对异常值稳健,不要求正态分布
• 数据干净且线性时用 Pearson:统计功效最高
• 小样本或有大量结时用 Kendall:估计更准确
• 永远不要只用一种:报告多种相关系数,全面了解变量间关系
💻 第四篇:数值方法
计算机实现的数值计算方法,是求解复杂数学模型问题的实用工具
4.1 插值与曲线拟合
定义 插值问题
给定 $n+1$ 个数据点 $(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)$,找一个函数 $P(x)$ 使得:
即函数曲线精确穿过所有已知数据点。
拉格朗日插值
方法 拉格朗日插值多项式
构造 $n$ 次多项式:
其中基函数:
特点:公式简洁,但增加新节点时需重新计算全部基函数。
牛顿插值
方法 牛顿插值多项式
使用差商形式:
优点:增加新节点时只需增加一项,便于逐步提高精度。
分段三次插值(样条)
定义 三次样条插值
在每个子区间 $[x_i, x_{i+1}]$ 上用三次多项式 $S_i(x)$ 插值,并保证:
- $S_i(x_i) = y_i, \quad S_i(x_{i+1}) = y_{i+1}$(穿过数据点)
- $S_i'(x_{i+1}) = S_{i+1}'(x_{i+1})$(一阶导连续)
- $S_i''(x_{i+1}) = S_{i+1}''(x_{i+1})$(二阶导连续)
优势:避免高次多项式的Runge现象,曲线更光滑。
最小二乘拟合
方法 最小二乘法
给定 $m$ 个数据点 $(x_i, y_i)$,找一条直线 $y = ax + b$ 使得:
解:
与插值的区别:拟合曲线不一定穿过数据点,但使整体偏差最小,适合含噪声的实验数据。
📊 插值与拟合方法对比
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d, CubicSpline
from scipy.optimize import curve_fit
# 数据点
x_data = np.array([0, 1, 2, 3, 4, 5])
y_data = np.array([0, 0.8, 0.9, 0.1, -0.8, -1.0])
# 1. 拉格朗日插值(高次多项式)
from scipy.interpolate import BarycentricInterpolator
lagrange = BarycentricInterpolator(x_data, y_data)
# 2. 三次样条插值
cs = CubicSpline(x_data, y_data)
# 3. 最小二乘拟合(二次多项式)
coeffs = np.polyfit(x_data, y_data, 2)
poly2 = np.poly1d(coeffs)
# 绘图比较
x_fine = np.linspace(-0.5, 5.5, 500)
plt.figure(figsize=(10, 6))
plt.plot(x_data, y_data, 'ko', markersize=8, label='数据点')
plt.plot(x_fine, lagrange(x_fine), 'b--', linewidth=2, label='拉格朗日插值')
plt.plot(x_fine, cs(x_fine), 'r-', linewidth=2, label='三次样条')
plt.plot(x_fine, poly2(x_fine), 'g:', linewidth=2.5, label='最小二乘(二次)')
plt.legend()
plt.title('插值 vs 拟合')
plt.grid(True, alpha=0.3)
plt.savefig('interp_vs_fit.png', dpi=150)
plt.show()4.2 函数优化方法
定义 优化问题
寻找变量 $x$ 使得目标函数 $f(x)$ 取得最小值(或最大值):
其中 $\Omega$ 是可行域。优化是建模竞赛中最常见的任务之一。
梯度下降法
方法 梯度下降(Gradient Descent)
从初始点 $x_0$ 出发,沿负梯度方向迭代更新:
其中 $\alpha > 0$ 是学习率(步长)。
几何直观:梯度指向函数增长最快的方向,负梯度方向就是下降最快的方向。
牛顿法
方法 牛顿法(Newton's Method)
利用二阶信息(Hessian矩阵),收敛速度更快:
其中 $H_f$ 是Hessian矩阵(二阶偏导数组成的方阵)。
特点:二阶收敛,但每次需要计算和求逆Hessian,计算量大。
约束优化:拉格朗日乘数法
定理 拉格朗日乘数法
求 $f(x,y)$ 在约束 $g(x,y) = 0$ 下的极值:
步骤:
- 构造拉格朗日函数:$L(x,y,\lambda) = f(x,y) + \lambda g(x,y)$
- 解方程组:$\frac{\partial L}{\partial x} = 0, \quad \frac{\partial L}{\partial y} = 0, \quad \frac{\partial L}{\partial \lambda} = 0$
- 比较各驻点的函数值,确定极值
📊 函数优化可视化 - 梯度下降法
当前点: (3.0, 3.0) | 函数值: 27.00 | 迭代: 0
import numpy as np
import matplotlib.pyplot as plt
# 目标函数:f(x,y) = x² + 2y²
def f(x, y): return x**2 + 2*y**2
def grad_f(x, y): return np.array([2*x, 4*y])
def hessian_f(x, y): return np.array([[2, 0], [0, 4]])
# 梯度下降
def gradient_descent(start, lr=0.1, epochs=50):
x = np.array(start, dtype=float)
path = [x.copy()]
for i in range(epochs):
g = grad_f(x[0], x[1])
x = x - lr * g
path.append(x.copy())
if np.linalg.norm(g) < 1e-6: break
return x, path
# 牛顿法
def newton_method(start, epochs=20):
x = np.array(start, dtype=float)
path = [x.copy()]
for i in range(epochs):
g = grad_f(x[0], x[1])
H = hessian_f(x[0], x[1])
x = x - np.linalg.solve(H, g)
path.append(x.copy())
if np.linalg.norm(g) < 1e-6: break
return x, path
# 运行比较
start = [3.0, 3.0]
opt_gd, path_gd = gradient_descent(start, 0.1)
opt_newton, path_newton = newton_method(start)
print(f"梯度下降: 最优点 ({opt_gd[0]:.6f}, {opt_gd[1]:.6f}), f={f(*opt_gd):.8f}")
print(f"牛顿法: 最优点 ({opt_newton[0]:.6f}, {opt_newton[1]:.6f}), f={f(*opt_newton):.8f}")
print(f"梯度下降迭代: {len(path_gd)-1}, 牛顿法迭代: {len(path_newton)-1}")4.3 蒙特卡洛模拟
定义 蒙特卡洛方法
通过大量随机抽样来估计数学期望或概率的方法。
核心思想:根据大数定律,随机试验次数越多,频率越接近概率,样本均值越接近期望值。
类型一:面积/体积估算
例子 估算 π 值
在 $[-1, 1] \times [-1, 1]$ 正方形内随机投点,点落入内切圆(半径1)的概率为:
因此 $\pi \approx 4 \times \frac{\text{落入圆内的点数}}{\text{总点数}}$。
类型二:概率估算
例子 生日问题
一个房间至少需要多少人,才能使至少两人生日相同的概率超过50%?
蒙特卡洛解法:随机生成 $n$ 个人的生日,重复模拟 $N$ 次,统计有重复的比例。
理论答案:23人(概率≈50.7%)。
类型三:积分计算
方法 蒙特卡洛积分
估算定积分:
其中 $X_i \sim \text{Uniform}(a, b)$。
优势:对高维积分特别有效,不受维度灾难影响。
类型四:优化问题
方法 模拟退火(Simulated Annealing)
受冶金退火启发的随机优化算法:
- 从当前解 $x$ 随机扰动得到候选解 $x'$
- 如果 $f(x') < f(x)$,接受 $x'$
- 否则以概率 $e^{-\frac{f(x')-f(x)}{T}}$ 接受($T$ 是"温度")
- 逐渐降低 $T$,收敛到全局最优
📊 蒙特卡洛模拟
import numpy as np
# 1. 估算 π
def estimate_pi(n=100000):
x = np.random.uniform(-1, 1, n)
y = np.random.uniform(-1, 1, n)
inside = (x**2 + y**2 <= 1)
return 4 * np.sum(inside) / n
# 2. 生日问题
def birthday_problem(n=23, simulations=10000):
count = 0
for _ in range(simulations):
birthdays = np.random.randint(1, 366, n)
if len(birthdays) != len(set(birthdays)):
count += 1
return count / simulations
# 3. 蒙特卡洛积分:∫₀¹ x²dx = 1/3
def monte_carlo_integral(n=100000):
x = np.random.uniform(0, 1, n)
return np.mean(x**2)
# 4. 布丰投针估算 π
def buffon_needle(n=10000, needle_length=0.5, line_spacing=1.0):
x = np.random.uniform(0, line_spacing/2, n)
theta = np.random.uniform(0, np.pi/2, n)
crosses = (x <= needle_length/2 * np.cos(theta))
p = np.mean(crosses)
return (2 * needle_length) / (p * line_spacing)
print(f"π 估算: {estimate_pi():.6f}")
print(f"生日问题 (n=23): {birthday_problem():.4f}")
print(f"∫₀¹ x²dx ≈ {monte_carlo_integral():.6f} (理论: 0.3333)")
print(f"布丰投针 π ≈ {buffon_needle():.6f}")📝 学习建议与资源推荐
建议 学习路径
- 第一步:先学线性代数(向量和矩阵是数据的基本表示)
- 第二步:再学微积分(理解变化和优化的基础)
- 第三步:最后学概率统计(数据分析的数学工具)
- 第四步:结合建模竞赛题目,将数学知识应用到实际问题中
延伸 公开课资源
如果需要系统补课,可以进入数学课程资源导航,按中学数学、微积分、线性代数、概率统计和数学建模分类选择 MIT OCW、Khan Academy、国家智慧教育平台等公开课程。
查看课程资源 →