跳到主要内容
Varlig 指南
Varlig 首页

高等数学:功能与限制

本页概述 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

列表、矩阵和复数都是普通的值。你可以给它们命名,把它们传给自定义函数;编辑前面的行时,它们也会重新计算。

calc
平方和(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) 计算两个实数向量的点积。
calc
支出 = [420, 385, 510, 460] 结果为 [420, 385, 510, 460]
sum(支出) 结果为 1,775
average(支出) 结果为 443.75
median(支出) 结果为 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,而通过索引取出它时返回的是存储的值。病态矩阵可能会损失精度,因此不要用 == 检验这些结果。

calc
# 两张成人票加一张儿童票共 34;一张成人票加两张儿童票共 29
solve_system([[2,1],[1,2]], [34,29]) 结果为 [13, 8]
det([[2,1],[1,2]]) 结果为 3
rank([[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,以及分数次幂或复数次幂,都接受复数。它们使用浮点数和主值分支。零的对数以及任何非有限的结果都会报错。
calc
(2+3i) * (2-3i) 结果为 13
abs(3+4i) 结果为 5
sqrt(-4 + 0i) 结果为 2i
sqrt(complex(-4,0)) 结果为 2i
sqrt(-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 项。
calc
sum(k^2, k, 1, 10) 结果为 385
product(k, k, 1, 5) 结果为 120
k = 7 结果为 7
sum(k, k, 1, 3) 结果为 6
k 结果为 7

解方程

solve(equation) 读取一个含单个未知数、次数为 1 或 2 的多项式方程,并求出它的根。未知数就是方程中唯一没有取值的那个名称;有取值的名称会按它的数值来读取,等号右边也可以省略,这时表达式会被置为零。

  • 一次方程的答案是那个数。二次方程的答案是它互不相同的实根按升序排列而成的列表,所以重根就是只有一个元素的列表。答案的形态取决于写下的次数,而不是找到了几个根。
  • 系数及其变形都是精确的;判别式为完全平方数时,根也是精确的。其余的二次方程会给出两个十进制的平方根近似值。
  • 两边都必须是普通数字。带单位的量、金额和复数都会被拒绝。
  • 没有实根的方程会给出 Error: no real solution,而不是复数根;任何取值都成立的方程会如实说明,而不会挑出某个值。
  • 其余情况 —— 次数在 3 及以上、非多项式方程、位于除数或指数上的未知数、第二个没有取值的名称 —— 都会被拒绝,信息中会点出下面那个四参数的形式。
calc
solve(2x + 6 = 10) 结果为 2
solve(x^2 - 5x + 6 = 0) 结果为 [2, 3]
solve(x^2 - 2 = 0) 结果为 [-1.4142135624, 1.4142135624]
solve(x^2 + 1 = 0) 结果为 Error: no real solution

solve(expression, name, lower, upper) 是另一个函数:它在 lower 和 upper 之间,找出使表达式为零的一个 name 实数值。solve(left = right, name, lower, upper) 找出使两边相等的值。

  • 边界必须是有限的数,并且 lower 小于 upper。
  • 恰好位于边界上的根也会被接受。否则,表达式必须在一个边界处为正、在另一个边界处为负,并且在两者之间应当连续。
  • 搜索每一步都会把区间减半。当表达式与零的差不超过 1e-10,并且区间足够窄时,搜索即告成功,这必须在 128 步之内完成。如果表达式在某个检查点上无定义,或者搜索无法收敛,该行会显示错误。
  • 它只找出一个根,而不是所有根。要求解线性方程组,请使用 solve_system。
calc
solve(1500 + 12*x = 20*x, x, 0, 1000) 结果为 187.5
solve(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)会报错;对于这些函数,请改用某点处的导数。这并不是一个完整的计算机代数系统。
  • 导数的定义域限制与原表达式相同。
calc
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:,后面跟着该名称。

calc
derivative(x^3, x, 2) 结果为 12
f(x) = x^2
derivative(f(x), x, 3) 结果为 6
differentiate(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 步时,它会停止。达到限制或遇到无定义的采样点都会报错。
  • 误差估计是很好的参考,但并不是保证。请使用光滑、有限的表达式。对于含有尖峰、跳变或快速振荡的表达式,结果可能不准确。
  • 不支持不定积分和无穷边界。
calc
integrate(x^2, x, 0, 3) 结果为 9
integrate(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° 这样的角度。
  • 当单位的幂次能被整除时,平方根和立方根会保留单位;带单位的量求幂时也会保留单位。摄氏度或华氏度的温度不能平方或开方。
calc
gcd(12, 18) 结果为 6
round(17, 5) 结果为 15
sin(30°) 结果为 0.5
sqrt(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 的其他部分相同

达到限制时,该行会显示错误,笔记的其余部分照常工作。部分求和、逆矩阵或未收敛的根绝不会被当作答案显示。有关所有限制以及结果有多精确,请参阅解读结果:显示与精度。