第三十二 函数(Function)
函数(Function)是数学中最核心的概念之一,描述了两个集合之间的一种对应关系:对于定义域中的每一个输入,都有唯一确定的输出与之对应。函数是微积分的研究对象,也是计算机编程的基本构建块。
一、函数的基本概念
1.1 定义
设 $D$ 是一个非空实数集,如果对于 $D$ 中的每一个 $x$,按照某种对应法则 $f$,都有唯一确定的实数 $y$ 与之对应,则称 $f$ 为定义在 $D$ 上的函数,记作:
$$y = f(x), \quad x \in D$$
其中 $x$ 称为自变量,$y$ 称为因变量,$D$ 称为函数的定义域。
1.2 有界函数与无界函数
有界函数:如果存在正数 $M$,使得对于定义域内的所有 $x$,都有 $|f(x)| \le M$,则称 $f(x)$ 为有界函数。
无界函数:不存在这样的 $M$,则称 $f(x)$ 为无界函数。
fn is_bounded(f: impl Fn(f64) -> f64, a: f64, b: f64, samples: usize) -> Option<f64> {
let mut max_abs = 0.0_f64;
for i in 0..=samples {
let x = a + (b - a) * (i as f64 / samples as f64);
let y = f(x).abs();
if y.is_infinite() {
return None; // 无界
}
max_abs = max_abs.max(y);
}
Some(max_abs)
}
fn main() {
// sin(x) 在 [0, 2π] 上有界
let sin_bound = is_bounded(|x| x.sin(), 0.0, 2.0 * std::f64::consts::PI, 100);
println!("sin(x) 的最大绝对值: {:?}", sin_bound); // Some(1.0)
// 1/x 在 [-1, 1] 上无界
let inv_bound = is_bounded(|x| 1.0 / x, -1.0, 1.0, 100);
println!("1/x 有界吗: {:?}", inv_bound); // None
}
二、函数的基本性质
2.1 奇偶性
奇函数:如果对于定义域内的任意 $x$,都有 $f(-x) = -f(x)$,则称 $f(x)$ 为奇函数。奇函数的图像关于原点对称。
偶函数:如果对于定义域内的任意 $x$,都有 $f(-x) = f(x)$,则称 $f(x)$ 为偶函数。偶函数的图像关于 $y$ 轴对称。
| 函数 | 奇偶性 | 图像特征 |
|---|---|---|
| $f(x) = x^3$ | 奇函数 | 关于原点对称 |
| $f(x) = x^2$ | 偶函数 | 关于 $y$ 轴对称 |
| $f(x) = \sin x$ | 奇函数 | 关于原点对称 |
| $f(x) = \cos x$ | 偶函数 | 关于 $y$ 轴对称 |
| $f(x) = e^x$ | 非奇非偶 | — |
fn is_odd(f: impl Fn(f64) -> f64, x: f64) -> bool {
(f(-x) + f(x)).abs() < 1e-10
}
fn is_even(f: impl Fn(f64) -> f64, x: f64) -> bool {
(f(-x) - f(x)).abs() < 1e-10
}
fn main() {
let x = 2.0;
println!("x³ 是奇函数: {}", is_odd(|x| x.powi(3), x)); // true
println!("x² 是偶函数: {}", is_even(|x| x.powi(2), x)); // true
println!("sin(x) 是奇函数: {}", is_odd(|x| x.sin(), x)); // true
println!("cos(x) 是偶函数: {}", is_even(|x| x.cos(), x)); // true
}
2.2 单调性
单调递增:如果对于定义域内的任意 $x_1 < x_2$,都有 $f(x_1) \le f(x_2)$,则称 $f(x)$ 单调递增。
单调递减:如果对于定义域内的任意 $x_1 < x_2$,都有 $f(x_1) \ge f(x_2)$,则称 $f(x)$ 单调递减。
严格单调:上述不等式中的等号不成立时,称为严格单调。
若 $f(x)$ 可导,则:
- $f’(x) > 0$ $\Rightarrow$ $f(x)$ 严格单调递增
- $f’(x) < 0$ $\Rightarrow$ $f(x)$ 严格单调递减
2.3 周期性
如果存在非零常数 $T$,使得对于定义域内的任意 $x$,都有 $f(x + T) = f(x)$,则称 $f(x)$ 为周期函数,$T$ 称为周期。
| 函数 | 周期 |
|---|---|
| $\sin x$, $\cos x$ | $2\pi$ |
| $\tan x$, $\cot x$ | $\pi$ |
2.4 凹凸性
凹函数(下凸):曲线向上弯,任意两点连线在曲线上方。
$$f(\lambda x_1 + (1-\lambda)x_2) \le \lambda f(x_1) + (1-\lambda)f(x_2) \quad (\lambda \in (0,1))$$
凸函数(上凸):曲线向下弯,任意两点连线在曲线下方。
$$f(\lambda x_1 + (1-\lambda)x_2) \ge \lambda f(x_1) + (1-\lambda)f(x_2) \quad (\lambda \in (0,1))$$
若 $f(x)$ 二阶可导,则:
- $f’’(x) > 0$ $\Rightarrow$ 凹函数(下凸)
- $f’’(x) < 0$ $\Rightarrow$ 凸函数(上凸)
2.5 连续性
函数 $f(x)$ 在点 $x_0$ 处连续,当且仅当:
$$\lim_{x \to x_0} f(x) = f(x_0)$$
间断点的分类:
| 类型 | 定义 | 示例 |
|---|---|---|
| 第一类间断点(可去) | 左右极限存在且相等,但不等于函数值 | $f(x) = \frac{\sin x}{x}$ 在 $x=0$ |
| 第一类间断点(跳跃) | 左右极限存在但不相等 | 符号函数 $\text{sgn}(x)$ 在 $x=0$ |
| 第二类间断点 | 至少一侧极限不存在 | $f(x) = \frac{1}{x}$ 在 $x=0$ |
fn is_continuous_at(f: impl Fn(f64) -> f64, x0: f64, epsilon: f64) -> bool {
let h = 1e-6;
let left_limit = f(x0 - h);
let right_limit = f(x0 + h);
let f_x0 = f(x0);
(left_limit - f_x0).abs() < epsilon && (right_limit - f_x0).abs() < epsilon
}
fn main() {
// sin(x)/x 在 x=0 处有可去间断点
let f = |x: f64| if x == 0.0 { 1.0 } else { x.sin() / x };
println!("sin(x)/x 在 x=0 连续: {}", is_continuous_at(f, 0.0, 1e-5));
}
三、基本初等函数
3.1 幂函数
$$f(x) = x^a \quad (a \in \mathbb{R})$$
运算法则:
$$a^m \cdot a^n = a^{m+n}$$ $$\frac{a^m}{a^n} = a^{m-n}$$ $$(a^m)^n = a^{mn}$$ $$a^{-n} = \frac{1}{a^n}$$
fn main() {
let x: f64 = 2.0;
println!("平方根: {}", x.sqrt()); // 1.4142
println!("立方: {}", x.powi(3)); // 8
println!("x^0.5: {}", x.powf(0.5)); // 1.4142
}
3.2 指数函数
$$f(x) = a^x \quad (a > 0, a \neq 1)$$
最常用的指数函数是以 $e$ 为底的指数函数:
$$f(x) = e^x$$
性质:
- 定义域:$(-\infty, +\infty)$
- 值域:$(0, +\infty)$
- 过点 $(0, 1)$
- $a > 1$ 时单调递增,$0 < a < 1$ 时单调递减
fn main() {
let x = 2.0_f64;
println!("e^2 = {}", x.exp()); // 7.3891
println!("2^3 = {}", 2.0_f64.powf(3.0)); // 8
}
3.3 对数函数
$$f(x) = \log_a x \quad (a > 0, a \neq 1, x > 0)$$
常用对数:
- 自然对数:$\ln x = \log_e x$
- 常用对数:$\lg x = \log_{10} x$
运算法则:
$$\log_a(M \cdot N) = \log_a M + \log_a N$$ $$\log_a\left(\frac{M}{N}\right) = \log_a M - \log_a N$$ $$\log_a(M^k) = k \cdot \log_a M$$ $$\log_a b = \frac{\log_c b}{\log_c a} \quad \text{(换底公式)}$$
fn main() {
let x = 100.0_f64;
println!("ln(100) = {}", x.ln()); // 4.6052
println!("log10(100) = {}", x.log10()); // 2
println!("log2(64) = {}", 64.0_f64.log2()); // 6
}
3.4 三角函数
| 函数 | 定义 | 周期 | 奇偶性 |
|---|---|---|---|
| $\sin x$ | 对边/斜边 | $2\pi$ | 奇函数 |
| $\cos x$ | 邻边/斜边 | $2\pi$ | 偶函数 |
| $\tan x$ | $\sin x / \cos x$ | $\pi$ | 奇函数 |
| $\cot x$ | $\cos x / \sin x$ | $\pi$ | 奇函数 |
| $\sec x$ | $1 / \cos x$ | $2\pi$ | 偶函数 |
| $\csc x$ | $1 / \sin x$ | $2\pi$ | 奇函数 |
平方和关系:
$$\sin^2\theta + \cos^2\theta = 1$$ $$1 + \tan^2\theta = \sec^2\theta$$ $$1 + \cot^2\theta = \csc^2\theta$$
两角和差公式:
$$\sin(\alpha \pm \beta) = \sin\alpha\cos\beta \pm \cos\alpha\sin\beta$$ $$\cos(\alpha \pm \beta) = \cos\alpha\cos\beta \mp \sin\alpha\sin\beta$$ $$\tan(\alpha \pm \beta) = \frac{\tan\alpha \pm \tan\beta}{1 \mp \tan\alpha\tan\beta}$$
二倍角公式:
$$\sin 2\theta = 2\sin\theta\cos\theta$$ $$\cos 2\theta = \cos^2\theta - \sin^2\theta = 2\cos^2\theta - 1 = 1 - 2\sin^2\theta$$ $$\tan 2\theta = \frac{2\tan\theta}{1 - \tan^2\theta}$$
半角公式(降幂公式):
$$\sin^2\frac{\theta}{2} = \frac{1 - \cos\theta}{2}$$ $$\cos^2\frac{\theta}{2} = \frac{1 + \cos\theta}{2}$$
辅助角公式:
$$a\sin\theta + b\cos\theta = \sqrt{a^2 + b^2} \sin(\theta + \varphi) \quad \left(\tan\varphi = \frac{b}{a}\right)$$
use std::f64::consts::PI;
fn main() {
let theta = PI / 6.0; // 30°
println!("sin(30°) = {}", theta.sin()); // 0.5
println!("cos(30°) = {}", theta.cos()); // 0.8660
println!("tan(30°) = {}", theta.tan()); // 0.5774
// 验证 sin²θ + cos²θ = 1
let identity = theta.sin().powi(2) + theta.cos().powi(2);
println!("sin²θ + cos²θ = {}", identity); // 1.0
// 勾三股四弦五,求勾所对应的角度
let opposite = 3.0;
let hypotenuse = 5.0;
let angle_rad = (opposite / hypotenuse).asin();
let angle_deg = angle_rad * 180.0 / PI;
println!("角度 = {:.2}°", angle_deg); // 36.87°
}
3.5 反三角函数
| 函数 | 定义 | 定义域 | 值域 |
|---|---|---|---|
| $\arcsin x$ | $\sin(\arcsin x) = x$ | $[-1, 1]$ | $[-\frac{\pi}{2}, \frac{\pi}{2}]$ |
| $\arccos x$ | $\cos(\arccos x) = x$ | $[-1, 1]$ | $[0, \pi]$ |
| $\arctan x$ | $\tan(\arctan x) = x$ | $(-\infty, +\infty)$ | $(-\frac{\pi}{2}, \frac{\pi}{2})$ |
fn main() {
let x = 0.5_f64;
println!("arcsin(0.5) = {:.4} rad = {:.2}°", x.asin(), x.asin().to_degrees());
println!("arccos(0.5) = {:.4} rad = {:.2}°", x.acos(), x.acos().to_degrees());
println!("arctan(1.0) = {:.4} rad = {:.2}°", 1.0_f64.atan(), 1.0_f64.atan().to_degrees());
}
四、复合函数与反函数
4.1 复合函数
设 $y = f(u)$,$u = g(x)$,则 $y = f(g(x))$ 称为 $f$ 和 $g$ 的复合函数。
4.2 反函数
如果函数 $f$ 是一一对应的,则存在反函数 $f^{-1}$,满足:
$$f(f^{-1}(x)) = x, \quad f^{-1}(f(x)) = x$$
性质:
- 函数与其反函数的图像关于直线 $y = x$ 对称
- 单调函数一定存在反函数
| 函数 | 反函数 |
|---|---|
| $f(x) = x^3$ | $f^{-1}(x) = \sqrt[3]{x}$ |
| $f(x) = e^x$ | $f^{-1}(x) = \ln x$ |
| $f(x) = \sin x$(限制定义域) | $f^{-1}(x) = \arcsin x$ |
五、双曲函数
双曲函数与三角函数类似,但基于指数函数定义:
| 函数 | 定义 | 恒等式 |
|---|---|---|
| 双曲正弦 $\sinh x$ | $\frac{e^x - e^{-x}}{2}$ | $\cosh^2 x - \sinh^2 x = 1$ |
| 双曲余弦 $\cosh x$ | $\frac{e^x + e^{-x}}{2}$ | — |
| 双曲正切 $\tanh x$ | $\frac{\sinh x}{\cosh x}$ | — |
| 反双曲正弦 $\text{arsinh } x$ | $\ln(x + \sqrt{x^2 + 1})$ | — |
| 反双曲余弦 $\text{arcosh } x$ | $\ln(x + \sqrt{x^2 - 1})$($x \ge 1$) | — |
| 反双曲正切 $\text{artanh } x$ | $\frac{1}{2}\ln\frac{1+x}{1-x}$($ | x |
fn main() {
let x = 2.0_f64;
println!("sinh(2) = {}", x.sinh()); // 3.6269
println!("cosh(2) = {}", x.cosh()); // 3.7622
println!("tanh(2) = {}", x.tanh()); // 0.9640
// 验证恒等式: cosh²(x) - sinh²(x) = 1
let identity = x.cosh().powi(2) - x.sinh().powi(2);
println!("恒等式验证: {}", identity); // 1.0
// 反双曲函数
println!("arsinh(2) = {}", x.asinh()); // 1.4436
println!("arcosh(2) = {}", x.acosh()); // 1.3170
}
六、正弦定理与余弦定理
6.1 正弦定理
对于任意三角形,记角 $A, B, C$ 为三个角,对应的边为 $a, b, c$,则:
$$\frac{a}{\sin A} = \frac{b}{\sin B} = \frac{c}{\sin C} = 2R$$
其中 $R$ 为三角形外接圆的半径。
6.2 余弦定理
$$a^2 = b^2 + c^2 - 2bc\cos A$$ $$b^2 = a^2 + c^2 - 2ac\cos B$$ $$c^2 = a^2 + b^2 - 2ab\cos C$$
use std::f64::consts::PI;
fn solve_triangle_sas(b: f64, c: f64, angle_a: f64) -> (f64, f64, f64) {
// 已知两边及其夹角,求第三边和另外两个角
let a = (b * b + c * c - 2.0 * b * c * angle_a.cos()).sqrt();
let angle_b = ((b * b + a * a - c * c) / (2.0 * b * a)).acos();
let angle_c = PI - angle_a - angle_b;
(a, angle_b, angle_c)
}
fn main() {
let (a, b, c) = solve_triangle_sas(3.0, 4.0, PI / 2.0);
println!("第三边 a = {:.4}", a); // 5.0
println!("角 B = {:.2}°", b.to_degrees()); // 53.13°
println!("角 C = {:.2}°", c.to_degrees()); // 36.87°
}
七、欧拉公式
欧拉公式是数学中最优美的公式之一,将指数函数、三角函数和虚数联系在一起:
$$e^{i\theta} = \cos\theta + i\sin\theta$$
当 $\theta = \pi$ 时,得到欧拉恒等式:
$$e^{i\pi} + 1 = 0$$
这个等式将数学中五个最重要的常数联系在一起:$e$(自然常数)、$i$(虚数单位)、$\pi$(圆周率)、1(乘法单位元)、0(加法单位元)。
八、函数在 Rust 中的表示
8.1 闭包
Rust 中的闭包(Closure)可以捕获环境中的变量,类似于数学中的函数:
fn main() {
let a = 2.0;
let b = 3.0;
// 线性函数 f(x) = ax + b
let linear = |x: f64| a * x + b;
println!("f(1) = {}", linear(1.0)); // 5.0
println!("f(2) = {}", linear(2.0)); // 7.0
// 二次函数 f(x) = x² + 2x + 1
let quadratic = |x: f64| x * x + 2.0 * x + 1.0;
println!("g(3) = {}", quadratic(3.0)); // 16.0
}
8.2 高阶函数
接受函数作为参数或返回函数的函数:
fn compose<F, G>(f: F, g: G) -> impl Fn(f64) -> f64
where
F: Fn(f64) -> f64,
G: Fn(f64) -> f64,
{
move |x| f(g(x))
}
fn main() {
let f = |x: f64| x + 1.0;
let g = |x: f64| x * 2.0;
let h = compose(f, g); // h(x) = f(g(x)) = 2x + 1
println!("h(3) = {}", h(3.0)); // 7.0
}
九、数值积分
9.1 复合梯形法则
$$\int_a^b f(x) dx \approx \frac{b - a}{2n} \sum_{i=0}^{n-1} [f(x_i) + f(x_{i+1})]$$
9.2 复合辛普森法则
$$\int_a^b f(x) dx \approx \frac{h}{3}[f(x_0) + 4f(x_1) + 2f(x_2) + 4f(x_3) + \cdots + 2f(x_{n-2}) + 4f(x_{n-1}) + f(x_n)]$$
其中 $h = \frac{b-a}{n}$,$n$ 为偶数。
fn simpson_integral(f: impl Fn(f64) -> f64, a: f64, b: f64, n: usize) -> f64 {
assert!(n % 2 == 0, "n 必须是偶数");
let h = (b - a) / n as f64;
let mut sum = f(a) + f(b);
for i in 1..n {
let x = a + i as f64 * h;
if i % 2 == 0 {
sum += 2.0 * f(x);
} else {
sum += 4.0 * f(x);
}
}
sum * h / 3.0
}
fn main() {
// 计算 ∫₀¹ x² dx = 1/3
let result = simpson_integral(|x| x * x, 0.0, 1.0, 100);
println!("∫₀¹ x² dx ≈ {}", result); // 0.3333
// 计算 ∫₀^π sin(x) dx = 2
let result2 = simpson_integral(|x| x.sin(), 0.0, std::f64::consts::PI, 100);
println!("∫₀^π sin(x) dx ≈ {}", result2); // 2.0
}
十、特殊函数
10.1 Sigmoid 函数
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
Sigmoid 函数的核心作用是将任意实数输入压缩到 $(0, 1)$ 区间,形成一个光滑的 S 形曲线。在神经网络中,它常被用作激活函数,将线性输出转换为概率。
fn sigmoid(x: f64) -> f64 {
1.0 / (1.0 + (-x).exp())
}
fn main() {
println!("sigmoid(0) = {}", sigmoid(0.0)); // 0.5
println!("sigmoid(2) = {}", sigmoid(2.0)); // 0.8808
println!("sigmoid(-2) = {}", sigmoid(-2.0)); // 0.1192
}
10.2 高斯函数
$$f(x) = e^{-x^2}$$
$$\int_{-\infty}^{+\infty} e^{-x^2} dx = \sqrt{\pi}$$
十一、物理中的应用
11.1 万有引力
$$F = G \frac{m_1 m_2}{r^2}$$
11.2 质能方程
$$E = mc^2$$
11.3 单摆周期
$$T = 2\pi \sqrt{\frac{l}{g}}$$
十二、总结
| 概念 | 要点 |
|---|---|
| 奇偶性 | 奇函数 $f(-x) = -f(x)$,偶函数 $f(-x) = f(x)$ |
| 单调性 | 导数大于零递增,小于零递减 |
| 周期性 | $f(x+T) = f(x)$ |
| 凹凸性 | 二阶导数大于零下凸,小于零上凸 |
| 连续性 | $\lim_{x \to x_0} f(x) = f(x_0)$ |
| 幂函数 | $x^a$,指数运算法则 |
| 指数函数 | $a^x$,以 $e^x$ 最常用 |
| 对数函数 | $\log_a x$,换底公式 |
| 三角函数 | $\sin, \cos, \tan$ 及其关系 |
| 双曲函数 | $\sinh, \cosh, \tanh$ |
| 欧拉公式 | $e^{i\theta} = \cos\theta + i\sin\theta$ |
| Sigmoid | $\sigma(x) = \frac{1}{1+e^{-x}}$ |
函数是数学和计算机科学的核心概念。从基本的初等函数到复杂的复合函数,从连续的数学函数到离散的计算机程序,函数的思想贯穿始终。
练习建议:
- 用 Rust 实现各种初等函数的性质验证
- 实现牛顿迭代法求方程的根
- 用数值积分方法计算定积分