跳到主要内容
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
对范围求和 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

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

calc
平方和(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) 会报错,而不是去猜测你的意图。

列表与统计

以下函数接受列表:lengthcountsumproductaveragemeanmedianminmax,以及 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 至少需要两个不带单位的数字。
  • mapfilter 依次接受表达式、代表每一项的名称以及列表。该名称只在调用内部有效,因此不会改变你在别处定义的同名名称。filter 中的表达式必须得出 truefalse

向量与矩阵

向量是一维列表,矩阵是由行组成的列表。矩阵必须是矩形的,只包含不带单位的实数,并且行数和列数都在 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

精确结果。 detinverseranksolve_system 使用精确分数。rank 没有舍入容差。solve_system 遇到奇异方程组时会报错,并且不处理非线性方程组或有无穷多解的方程组。

近似结果。 eigenvaluesqrlusvd 使用浮点数,并会检查输出是否为有限值。qrsvd 接受矩形矩阵,并返回紧凑(“瘦”)分解因子。特征值和 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)realimagconjabsarg(以弧度表示)和 sqrt(主平方根)都接受复数。
  • 精确性:实部与虚部、算术运算和整数次幂都保持精确。一般的开方和 arg 是近似的。
  • 实数结果:当虚部相互抵消时,例如 (2+3i) * (2-3i),结果是普通实数。你以复数形式写出的值,例如 -4 + 0icomplex(-4,0),经过运算和赋值给名称后仍然是复数,即使它显示为 -4
  • 负数的平方根和对数sqrt(-4)ln(-1)log(-100) 会保持在实数范围内,并显示虚数错误,错误信息会写出应改用的复数形式,例如 sqrt(-4 + 0i)。这样写,或者写成 sqrt(complex(-4,0)),都会得到 2i
  • 显示:只是浮点舍入误差的部分会显示为 0,因此 exp(i*pi) 显示为 -1。存储的值仍保留其数字。
  • 比较:只有当两个数的虚部都为零时,<> 才有效。
  • 其他函数sincostan 及其反函数,双曲函数及其反函数,explnloglog10log2cbrt,以及分数次幂或复数次幂,都接受复数。它们使用浮点数和主值分支。零的对数以及任何非有限的结果都会报错。
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) 对从 fromto(包含两端)的每个整数计算表达式,并把结果相加。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(expression, name, lower, upper)lowerupper 之间,找出使表达式为零的一个 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))以文本形式返回导数。

  • 它对不带单位的实数运算使用求导的加法、乘法、除法、幂和链式法则,并支持 sincostansinhcoshexplnsqrt
  • 表达式中的其他名称都被视为常数,无论它们在笔记中是否有值: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,会以数值方式计算某一点处的斜率。它使用逐步细化的中心差分,并用单侧估计加以核对。表达式可以使用你定义的函数,但在该点附近必须是光滑的,并且只使用不带单位的实数。如果估计值无法收敛,或者某个采样点无定义,该行会显示错误。

由于数值形式要计算出一个数,除变量以外的每个名称都需要有值。这适用于某点处的导数、sumproductsolveintegrate;没有值的名称会显示 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

数学函数的参数与单位

  • factorialfact 的另一个名称,truncint 的另一个名称。
  • sign 返回 -1、0 或 1。atan2(y, x) 以普通数字返回以弧度表示的角度。
  • roundfloorceil 的可选第二个参数是步长,而不是小数位数:round(17, 5) 会舍入到最接近的 5 的倍数。要舍入到指定的小数位,请参阅舍入
  • 对数、指数和双曲函数不接受单位或金额。普通三角函数接受 30° 这样的角度。
  • 当单位的幂次能被整除时,平方根和立方根会保留单位;带单位的量求幂时也会保留单位。摄氏度或华氏度的温度不能平方或开方。
calc
gcd(12, 18) 结果为 6
round(17, 5) 结果为 15
sin(30°) 结果为 0.5
sqrt(9 ) 结果为 3 m
(2 kg)^2 结果为 4 kg²

限制

在显示结果之前,会检查以下限制:

  • 列表或 range 中最多 1,024 项
  • 矩阵最大 32 × 32
  • 单个 sumproduct 最多 10,000 项
  • 嵌套列表和函数调用最多 16 层
  • 一行中所有高等数学运算(包括嵌套调用)共享 100,000 步
  • 分数的分子或分母最多 4,096 比特,与 Varlig Calc 的其他部分相同

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