高等数学:功能与限制
本页概述 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 |
| 最常出现的值 | mode([1,2,2,3]) |
2 |
| 百分位数 | percentile([1,2,3,4],25) |
1.75 |
| 总体标准差 | population_stddev([1,2,3,4]) |
1.1180339887 |
| 对范围求和 | sum(k^2, k, 1, 10) |
385 |
| 对范围求积 | product(k, k, 1, 5) |
120 |
| 精确解方程 | solve(x^2 - 5x + 6 = 0) |
[2, 3] |
| 在区间内解方程 | 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引擎作出的保证
本页所讲的一切背后只有一条规则:一次计算要么给出 Varlig 能够担保的答案,要么显示一条说明缘由的错误。它绝不会从精确计算退而求其次,给出一个看上去合理的数字。
答案有多精确
| 计算方式 | 涵盖的内容 |
|---|---|
| 精确分数 | 方程的系数和一次方程的根;判别式为完全平方数的二次方程的根;矩阵的 +、-、*、乘以一个数、transpose、det、inverse、rank 和 solve_system;median、mode、modes、percentile、quartile 以及全部三种方差 |
| 十进制平方根 | stddev、sample_stddev、population_stddev,以及其余二次方程的根 |
| 二进制浮点 | eigenvalues、qr、lu、svd、integrate 和四参数的 solve |
精确就是精确:从读入这一行到显示答案,中间没有任何舍入,所以一个精确的答案在被命名、存储和再次使用之后依然精确。近似的答案与 sqrt 返回的结果一样,是有界的十进制数。它并不保证在显示的最后一位上正确舍入,所以用 == 比较两个近似结果并不是可靠的检验 —— solve(x^2 - 2 = 0) 和 sqrt(2) 都显示为 1.4142135624,却并不相等。
同一个答案绝不会把两者混在一起。判别式不是完全平方数的二次方程,它的两个根都是近似值。
单位
| 运算 | 规则 |
|---|---|
| 矩阵 | 只接受普通数字;带单位的量、金额和复数元素都会被拒绝 |
| 方程 | 两边都只接受普通数字 |
median、mode、modes、percentile、quartile、stddev、population_stddev |
同一个量纲,或者普通数字。兼容的单位按第一个值的单位读取,答案也保留该单位 |
variance、sample_variance、population_variance |
只接受普通数字:方差要对观测值求平方,没有哪个单位能挺过这一步 |
把带单位的量和不带单位的值混在一起会报错,而不会悄悄按裸数字来读取;只有一个由来已久的例外:裸写的 0 会按其他值的单位计入。
哪些会被拒绝
下面这些都不会给出数字或一句话。每一种都是一条错误,说明它做不到什么,并在有替代写法时给出应当改写的形式:
- 次数高于 2 的多项式方程、非多项式方程、位于除数或指数上的未知数、两个都没有取值的名称、没有未知数的方程,或者带有单位或金额的方程。每一种都指向四参数的数值
solve。 - 没有实根的方程 —— 而不是给出复数根;以及任何取值都成立的方程 —— 而不是从中挑一个。
- 维度不匹配或非方阵的矩阵运算、奇异矩阵求逆,或者不是普通数字的元素。
- 没有任何值重复或几个值并列时的
mode、超出 0 到 100 的百分位数、超出 0 到 4 的四分位数,以及对空列表调用除sum、product和count以外的任何统计量。
以下功能按设计不予支持:超出收集多项式系数范围的符号变形、非线性方程组、实系数方程的复数根、由单位或金额构成的矩阵、不定积分,以及绘图。
这些信息本身列在错误、诊断与限制中。
书写列表和数学函数
- 逗号用于分隔项和参数。 逗号后面跟空格时总是用于分隔,逗号后面紧跟三位数字时则用于千位分组,所以
[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、mode 和 modes、percentile 和 quartile,以及离散程度函数 variance、sample_variance、population_variance、stddev、sample_stddev 和 population_stddev。
- 只有当某一个值严格地出现得最多时,
mode才会给出答案;几个值并列,以及没有任何值重复出现,都会报错,并在信息中点出modes、median或average。modes会返回出现最多的所有值。 percentile(list, rank)接受一个 0 到 100 之间的名次,并在最接近的两个名次之间做线性插值,采用的是包含式定义:第 50 百分位数就是中位数,第 0 和第 100 百分位数是最小值和最大值。quartile(list, k)接受 0 到 4 之间的整数k,等同于percentile(list, 25k)。variance和stddev是样本形式,除以n - 1,需要两个值。population_variance和population_stddev除以n,只需要一个值。sample_variance和sample_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(equation) 读取一个含单个未知数、次数为 1 或 2 的多项式方程,并求出它的根。未知数就是方程中唯一没有取值的那个名称;有取值的名称会按它的数值来读取,等号右边也可以省略,这时表达式会被置为零。
- 一次方程的答案是那个数。二次方程的答案是它互不相同的实根按升序排列而成的列表,所以重根就是只有一个元素的列表。答案的形态取决于写下的次数,而不是找到了几个根。
- 系数及其变形都是精确的;判别式为完全平方数时,根也是精确的。其余的二次方程会给出两个十进制的平方根近似值。
- 两边都必须是普通数字。带单位的量、金额和复数都会被拒绝。
- 没有实根的方程会给出
Error: no real solution,而不是复数根;任何取值都成立的方程会如实说明,而不会挑出某个值。 - 其余情况 —— 次数在 3 及以上、非多项式方程、位于除数或指数上的未知数、第二个没有取值的名称 —— 都会被拒绝,信息中会点出下面那个四参数的形式。
solve(2x + 6 = 10) 结果为 2solve(x^2 - 5x + 6 = 0) 结果为 [2, 3]solve(x^2 - 2 = 0) 结果为 [-1.4142135624, 1.4142135624]solve(x^2 + 1 = 0) 结果为 Error: no real solutionsolve(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 的其他部分相同
达到限制时,该行会显示错误,笔记的其余部分照常工作。部分求和、逆矩阵或未收敛的根绝不会被当作答案显示。有关所有限制以及结果有多精确,请参阅解读结果:显示与精度。