Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第三十二 函数(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}}$

函数是数学和计算机科学的核心概念。从基本的初等函数到复杂的复合函数,从连续的数学函数到离散的计算机程序,函数的思想贯穿始终。

练习建议:

  1. 用 Rust 实现各种初等函数的性质验证
  2. 实现牛顿迭代法求方程的根
  3. 用数值积分方法计算定积分