高等数学:功能与限制
本页概述 Varlig Calc 中的高等数学功能:列表、向量与矩阵、复数、求和与求积、解方程以及微积分。对于每项功能,本页列出函数的作用、接受哪些参数、结果有多精确,以及限制在哪里。当结果让你感到意外时,可以在这里核对细节。
有关包含更多示例的入门介绍,请参阅以下指南:列表与统计、向量与矩阵、复数和求和、解方程与微积分。
概览
| 功能 | 示例 | 结果 |
|---|---|---|
| 列表 | [1, 2+3, 4*2] |
[1, 5, 8] |
| 从列表中取项 | [10, 20, 30][1] |
20 |
| 从嵌套列表中取项 | [[1,2],[3,4]][1][0] |
3 |
| 带单位的量求和 | sum([1 kg, 500 g]) |
1.5 kg |
| 统计 | average([1,2,3]), median([5,1,3]) |
2, 3 |
| 范围(递减) | range(5, 1, -2) |
[5, 3, 1] |
| 列表相加 | [1,2] + [3,4] |
[4, 6] |
| 矩阵乘积 | [[1,2],[3,4]] * [[1,0],[0,1]] |
[[1, 2], [3, 4]] |
| 逆矩阵 | inverse([[1,2],[3,4]]) |
[[-2, 1], [1.5, -0.5]] |
| 行列式 | det([[1,2],[3,4]]) |
-2 |
| 转置 | transpose([[1,2],[3,4]]) |
[[1, 3], [2, 4]] |
| 线性方程组 | solve_system([[2,1],[1,2]], [34,29]) |
[13, 8] |
| 复数运算 | (2+3i) * (2-3i) |
13 |
| 复数平方根 | sqrt(complex(-4,0)) |
2i |
| 对范围求和 | sum(k^2, k, 1, 10) |
385 |
| 对范围求积 | product(k, k, 1, 5) |
120 |
| 解方程 | solve(x^2 = 4, x, 0, 3) |
2 |
| 符号求导 | differentiate(sin(x), x) |
cos(x) |
| 某点处的导数 | derivative(x^3, x, 2) |
12 |
| 定积分 | integrate(x^2, x, 0, 3) |
9 |
列表、矩阵和复数都是普通的值。你可以给它们命名,把它们传给自定义函数;编辑前面的行时,它们也会重新计算。
平方和(n) = sum(k^2, k, 1, n)平方和(3) 结果为 14首项(列表) = 列表[0]首项([10, 20]) 结果为 10求根(y) = solve(x^2 = y, x, 0, 10)求根(9) 结果为 3书写列表和数学函数
- 逗号用于分隔项和参数。 逗号后面跟空格时总是用于分隔,逗号后面紧跟三位数字时则用于千位分组,所以
[1,200, 1,800]包含两项。不加空格时,每个逗号都会分隔,例如[12,-51,4]。如果逗号两种读法都说得通,例如[1,234],错误信息会列出两种写法。表示小数时请使用小数点。 - 矩阵是由行组成的列表,例如
[[1,2],[3,4]]。不支持[1,2;3,4]这样的分号简写。 - 索引从 0 开始,必须是 0 或更大的整数。超出列表末尾的索引会报错;它绝不会回绕,也不会被截断以适应列表长度。
- 参数个数会被检查。
sqrt(4,9)会报错,而不是去猜测你的意图。
列表与统计
以下函数接受列表:length 或 count、sum、product、average 或 mean、median、min、max,以及 stddev(样本标准差)。
- 空列表的
sum为 0,product为 1,count为 0。空列表的其他统计量会报错。 - 长度相同的两个列表可以逐项相加和相减。你可以将列表乘以或除以一个数字,也可以用
==比较两个列表。 range(start, end, step)包含两端。步长可以省略。dot(a, b)计算两个实数向量的点积。
支出 = [420, 385, 510, 460] 结果为 [420, 385, 510, 460]sum(支出) 结果为 1,775average(支出) 结果为 443.75median(支出) 结果为 440支出[0] 结果为 420支出 * 1.1 结果为 [462, 423.5, 561, 506]range(0, 1, 0.25) 结果为 [0, 0.25, 0.5, 0.75, 1]列表变换
| 调用 | 结果 | 作用 |
|---|---|---|
sort([3,1,2]) |
[1, 2, 3] |
将不带单位的数字按升序排列;相等的项保持原有顺序 |
reverse([1,2,3]) |
[3, 2, 1] |
反转任意列表 |
unique([3,1,3,2]) |
[3, 1, 2] |
每个值只保留第一次出现的项;项必须完全相同(包括单位) |
slice([10,20,30,40], 1, 3) |
[20, 30] |
从起始索引开始取项,直到结束索引为止(不含结束索引) |
map(x^2, x, [1,2,3]) |
[1, 4, 9] |
对每一项计算表达式 |
filter(x > 1, x, [1,2,3]) |
[2, 3] |
保留满足条件的项 |
variance([1,2,3]) |
1 |
精确的样本方差,除以项数减一 |
slice需要满足 0 ≤ start ≤ end ≤ 列表长度的整数。其他边界会报错。variance至少需要两个不带单位的数字。map和filter依次接受表达式、代表每一项的名称以及列表。该名称只在调用内部有效,因此不会改变你在别处定义的同名名称。filter中的表达式必须得出true或false。
向量与矩阵
向量是一维列表,矩阵是由行组成的列表。矩阵必须是矩形的,只包含不带单位的实数,并且行数和列数都在 1 到 32 之间。
| 函数 | 作用 |
|---|---|
A * B |
矩阵乘积;A 的列数必须等于 B 的行数 |
transpose(A) |
交换行和列 |
shape(A) |
[rows, columns],即行数和列数 |
identity(n) |
n × n 单位矩阵 |
trace(A) |
方阵对角线元素之和 |
det(A) |
方阵的行列式 |
inverse(A) |
方阵的逆矩阵;奇异矩阵会报错 |
rank(A) |
通过精确消元求秩,适用于任何矩形矩阵 |
dot(a, b) |
两个长度相同的向量的点积 |
cross(a, b) |
两个三维向量的叉积 |
solve_system(A, b) |
对方阵 A 和一维向量 b 求解 A*x = b |
eigenvalues(A) |
实方阵的特征值,包括共轭复数对,顺序不固定 |
qr(A) |
[Q, R],其中 Q*R 近似等于 A |
lu(A) |
[P, L, U],其中 P*A 近似等于 L*U;仅限方阵 |
svd(A) |
[U, s, Vt],其中 s 是由奇异值组成的一维列表,A 近似等于 U*diag(s)*Vt |
精确结果。 det、inverse、rank 和 solve_system 使用精确分数。rank 没有舍入容差。solve_system 遇到奇异方程组时会报错,并且不处理非线性方程组或有无穷多解的方程组。
近似结果。 eigenvalues、qr、lu 和 svd 使用浮点数,并会检查输出是否为有限值。qr 和 svd 接受矩形矩阵,并返回紧凑(“瘦”)分解因子。特征值和 SVD 计算在 10,000 次迭代后停止。在显示的结果中,相对于最大元素只是舍入误差的元素会显示为 0,而通过索引取出它时返回的是存储的值。病态矩阵可能会损失精度,因此不要用 == 检验这些结果。
# 两张成人票加一张儿童票共 34;一张成人票加两张儿童票共 29solve_system([[2,1],[1,2]], [34,29]) 结果为 [13, 8]det([[2,1],[1,2]]) 结果为 3rank([[1,2],[2,4]]) 结果为 1复数
i 是虚数单位,除非你定义了名为 i 的名称或自定义单位。
- 函数:
complex(real, imaginary)、real、imag、conj、abs、arg(以弧度表示)和sqrt(主平方根)都接受复数。 - 精确性:实部与虚部、算术运算和整数次幂都保持精确。一般的开方和
arg是近似的。 - 实数结果:当虚部相互抵消时,例如
(2+3i) * (2-3i),结果是普通实数。你以复数形式写出的值,例如-4 + 0i或complex(-4,0),经过运算和赋值给名称后仍然是复数,即使它显示为-4。 - 负数的平方根和对数:
sqrt(-4)、ln(-1)和log(-100)会保持在实数范围内,并显示虚数错误,错误信息会写出应改用的复数形式,例如sqrt(-4 + 0i)。这样写,或者写成sqrt(complex(-4,0)),都会得到2i。 - 显示:只是浮点舍入误差的部分会显示为 0,因此
exp(i*pi)显示为-1。存储的值仍保留其数字。 - 比较:只有当两个数的虚部都为零时,
<和>才有效。 - 其他函数:
sin、cos、tan及其反函数,双曲函数及其反函数,exp、ln、log或log10、log2、cbrt,以及分数次幂或复数次幂,都接受复数。它们使用浮点数和主值分支。零的对数以及任何非有限的结果都会报错。
(2+3i) * (2-3i) 结果为 13abs(3+4i) 结果为 5sqrt(-4 + 0i) 结果为 2isqrt(complex(-4,0)) 结果为 2isqrt(-4) 结果为 Error: imaginary number. For a complex answer, write sqrt(-4 + 0i)exp(i*pi) 结果为 -1求和与求积
sum(expression, name, from, to) 对从 from 到 to(包含两端)的每个整数计算表达式,并把结果相加。summation 是它的另一个名称,product 则改为相乘。
- 该名称只在调用内部有效。它不会改变你已经定义的同名名称,也不会让该行依赖于那个名称。
- 求和或求积可以相互嵌套。
- 如果
to小于from,范围为空:和为 0,积为 1。 - 单次调用最多可以有 10,000 项。
sum(k^2, k, 1, 10) 结果为 385product(k, k, 1, 5) 结果为 120k = 7 结果为 7sum(k, k, 1, 3) 结果为 6k 结果为 7解方程
solve(expression, name, lower, upper) 在 lower 和 upper 之间,找出使表达式为零的一个 name 实数值。solve(left = right, name, lower, upper) 找出使两边相等的值。
- 边界必须是有限的数,并且
lower小于upper。 - 恰好位于边界上的根也会被接受。否则,表达式必须在一个边界处为正、在另一个边界处为负,并且在两者之间应当连续。
- 搜索每一步都会把区间减半。当表达式与零的差不超过
1e-10,并且区间足够窄时,搜索即告成功,这必须在 128 步之内完成。如果表达式在某个检查点上无定义,或者搜索无法收敛,该行会显示错误。 - 它只找出一个根,而不是所有根。要求解线性方程组,请使用
solve_system。
solve(1500 + 12*x = 20*x, x, 0, 1000) 结果为 187.5solve(x^2 = 2, x, 0, 2) 结果为 1.4142135624微积分
符号求导
differentiate(expression, name)(也可写作 derivative(expression, name))以文本形式返回导数。
- 它对不带单位的实数运算使用求导的加法、乘法、除法、幂和链式法则,并支持
sin、cos、tan、sinh、cosh、exp、ln和sqrt。 - 表达式中的其他名称都被视为常数,无论它们在笔记中是否有值:
differentiate(a*x^2, x)得到(a*(2*(x^(2-1))))。 - 结果不会被化简,并且最多 8,192 个字符。
- 其他函数(例如
abs)会报错;对于这些函数,请改用某点处的导数。这并不是一个完整的计算机代数系统。 - 导数的定义域限制与原表达式相同。
differentiate(sin(x), x) 结果为 cos(x)differentiate(x^3, x) 结果为 (3*(x^(3-1)))某点处的导数
derivative(expression, name, point),或带三个参数的 differentiate,会以数值方式计算某一点处的斜率。它使用逐步细化的中心差分,并用单侧估计加以核对。表达式可以使用你定义的函数,但在该点附近必须是光滑的,并且只使用不带单位的实数。如果估计值无法收敛,或者某个采样点无定义,该行会显示错误。
由于数值形式要计算出一个数,除变量以外的每个名称都需要有值。这适用于某点处的导数、sum、product、solve 和 integrate;没有值的名称会显示 Unsupported: Unknown name:,后面跟着该名称。
derivative(x^3, x, 2) 结果为 12f(x) = x^2derivative(f(x), x, 3) 结果为 6differentiate(a*x^2, x) 结果为 (a*(2*(x^(2-1))))derivative(a*x^2, x, 3) 结果为 Unsupported: Unknown name: a定积分
integrate(expression, name, lower, upper) 计算表达式在两个有限边界之间的曲线下面积。
- 交换边界会改变结果的符号,边界相等时结果为零。
- 它使用自适应的 7 点和 15 点高斯-克朗罗德(Gauss–Kronrod)求积规则,在不均匀分布的点上采样。这样,
cos(128*pi*x)这种规则的波形就不会让它出错:integrate(cos(128*pi*x), x, 0, 1)的结果约为-1.3e-15,在舍入误差范围内即为零。 - 它的目标是让总误差估计不超过结果大小的
1e-9倍(对于小于 1 的结果,则不超过1e-9)。它至少比较两个精细程度的计算,考虑舍入误差,并优先细化估计误差最大的部分。 - 当达到 2,048 次细化、20 层细分,或与该行中其他高等数学运算共享的 100,000 步时,它会停止。达到限制或遇到无定义的采样点都会报错。
- 误差估计是很好的参考,但并不是保证。请使用光滑、有限的表达式。对于含有尖峰、跳变或快速振荡的表达式,结果可能不准确。
- 不支持不定积分和无穷边界。
integrate(x^2, x, 0, 3) 结果为 9integrate(x^2, x, 3, 0) 结果为 -9数学函数的参数与单位
factorial是fact的另一个名称,trunc是int的另一个名称。sign返回 -1、0 或 1。atan2(y, x)以普通数字返回以弧度表示的角度。round、floor和ceil的可选第二个参数是步长,而不是小数位数:round(17, 5)会舍入到最接近的 5 的倍数。要舍入到指定的小数位,请参阅舍入。- 对数、指数和双曲函数不接受单位或金额。普通三角函数接受
30°这样的角度。 - 当单位的幂次能被整除时,平方根和立方根会保留单位;带单位的量求幂时也会保留单位。摄氏度或华氏度的温度不能平方或开方。
gcd(12, 18) 结果为 6round(17, 5) 结果为 15sin(30°) 结果为 0.5sqrt(9 m²) 结果为 3 m(2 kg)^2 结果为 4 kg²限制
在显示结果之前,会检查以下限制:
- 列表或
range中最多 1,024 项 - 矩阵最大 32 × 32
- 单个
sum或product最多 10,000 项 - 嵌套列表和函数调用最多 16 层
- 一行中所有高等数学运算(包括嵌套调用)共享 100,000 步
- 分数的分子或分母最多 4,096 比特,与 Varlig Calc 的其他部分相同
达到限制时,该行会显示错误,笔记的其余部分照常工作。部分求和、逆矩阵或未收敛的根绝不会被当作答案显示。有关所有限制以及结果有多精确,请参阅解读结果:显示与精度。