8. 累加、累乘与积分
本贴展现了数学语言和计算机语言的高度统一.
8.1 累加
- 单重整数累加
∑ i = 1 10 i (1) \sum_{i = 1}^{10} i \tag{1} i=1∑10i(1)
表示 1 + 2 + ⋯ + 10 1 + 2 + \dots +10 1+2+⋯+10. 源码: \sum_{i = 1}^{10} i \tag{1}.
Java 代码
int sum = 0;
for (int i = 1; i <= 10; i ++)
sum += i;
数学表达式的下标习惯从 1 开始, 程序的下标习惯从 0 开始. 写自己程序时应注意.
- 向量分量累加
∑ i = 1 n x i (2) \sum_{i = 1}^{n} x_i \tag{2} i=1∑nxi(2)
表示 x 1 + x 2 + ⋯ + x n x_1 + x_2 + \dots +x_n x1+x2+⋯+xn.
如果 x \mathbf{x} x 的维度就是 n n n 也可以简写为 ∑ i x i \sum_i x_i ∑ixi.
Java 代码
double sum = 0;
for (int i = 1; i <= n; i ++)
sum += x[i];
- 带条件的向量分量累加
∑ x i > 0 x i (3) \sum_{x_i > 0} x_i \tag{3} xi>0∑xi(3)
表示仅将向量 x \mathbf{x} x 取值为正的分量相加.
Java 代码
double sum = 0;
for (int i = 1; i <= n; i ++)
if (x[i] > 0)
sum += x[i];
- 课堂练习: ∑ x i > 0 x i 2 \sum_{x_i > 0} x_i^2 ∑xi>0xi2 的 Java 代码怎么写?
- 存在歧义的累加
∑ x i > 0 x i 2 + x i + 1 \sum_{x_i > 0} x_i^2 + x_i + 1 ∑xi>0xi2+xi+1, 需要加括号消除歧义.
∑ x i > 0 ( x i 2 + x i + 1 ) (4) \sum_{x_i > 0} \left(x_i^2 + x_i + 1\right) \tag{4} xi>0∑(xi2+xi+1)(4)
源码: \sum_{x_i > 0} \left(x_i^2 + x_i + 1\right) \tag{4}. - 矩阵分量的二重累加
∑ i = 1 n ∑ j = 1 i x i j (5) \sum_{i = 1}^n \sum_{j = 1}^i x_{ij} \tag{5} i=1∑nj=1∑ixij(5)
表示上三角矩阵分量 (左下部分) 相加.
Java 代码
double sum = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= i; j ++)
sum += x[i][j];
- 具有欺骗性的表示法
上式可简写为 ∑ i ≥ j x i j \sum_{i \ge j} x_{ij} ∑i≥jxij, 要清楚这是二重累加. - 课堂练习: 将矩阵中小于 1 的分量平方并累加, 数学表达式如何和 Java 代码分别怎么写?
8.2 累乘
- 整数累乘
∏ i = 1 10 i (6) \prod_{i = 1}^{10} i \tag{6} i=1∏10i(6)
表示 1 × 2 × ⋯ × 10 1 \times 2 \times \dots \times10 1×2×⋯×10. 源码: \prod_{i = 1}^{10} i \tag{6}, 其中 prod 是 product 的简写.
Java 代码
int product = 1;
for (int i = 1; i <= 10; i ++)
product *= i;
程序要注意溢出, 数学表达式不存在这种担忧. 同时注意 product 初始化为 1.
- 向量分量累乘
∏ i = 1 n x i (7) \prod_{i = 1}^{n} x_i \tag{7} i=1∏nxi(7)
表示 x 1 ∗ x 2 ∗ ⋯ ∗ x n x_1 * x_2 * \dots * x_n x1∗x2∗⋯∗xn.
如果 x \mathbf{x} x 的维度就是 n n n 也可以简写为 ∏ i x i \prod_i x_i ∏ixi.
Java 代码
double product = 1;
for (int i = 1; i <= n; i ++)
product *= x[i];
8.3 定积分
- 单变量函数的定积分, 本质就是求曲线与 x 轴之间的面积.
- 该面积带符号, 所以正负面积可能抵消一些.
∫ 0 10 x 2 + x + 1 d x (8) \int_{0}^{10} x^2 + x + 1 \mathrm{d}x \tag{8} ∫010x2+x+1dx(8)
源码: \int_{0}^{10} x^2 + x + 1 \mathrm{d}x. 注意 d 的写法. 也可以换成 {\rm d}
Java 代码
double integration = 0;
double delta = 0.01;
for (double x = 0; x <= 10; x += delta)
integeration += x * x * delta;
- 二重积分可以看作是求体积.
∫ 0 10 ∫ y 2 y 2 x 2 y + y 2 d x d y (9) \int_{0}^{10} \int_{\frac{y}{2}}^{y} 2 x^2 y + y^2 \mathrm{d}x\mathrm{d}y \tag{9} ∫010∫2yy2x2y+y2dxdy(9).
源码: \int_{0}^{10} \int_{\frac{y}{2}}^{y} 2 x^2 y + y^2 \mathrm{d}x\mathrm{d}y.
Java 代码
double integration = 0;
double deltax = 0.01;
double deltay = 0.01;
for (double y = 0; y <= 10; y += deltay)
for (double x = y/2; x <= y; x += deltay)
integeration += (2 * x * x * y + y * y) * deltax * deltay;
写代码根本不考虑积分的简洁形式, 就是这么任性!
8.4 作业
- 将向量下标为偶数的分量 (x2, x4, …) 累加, 写出相应表达式.
- 各出一道累加、累乘、积分表达式的习题, 并给出标准答案.
- 你使用过三重累加吗? 描述一下其应用.
- 给一个常用的定积分, 将手算结果与程序结果对比.