求和、解方程与微积分
本页介绍如何把一串项相加或相乘、求出使方程成立的值、以公式形式或在某一点上对表达式求导,以及计算定积分。遇到需要用 Σ 或 Π 记号表示的问题、难以手动变形的方程,或者想核对课程作业中的导数或曲线下面积时,都可以参考本页。
这些函数都把一个变量名作为参数之一,比如 sum(k^2, k, 1, 10) 中的 k。这个名称只在调用内部存在,因此绝不会改变笔记中其他地方同名的值。
有限求和与求积
sum(k, k, 1, 100) 结果为 5,050sum(k^2, k, 1, 10) 结果为 385summation(2*k - 1, k, 1, 10) 结果为 100product(k, k, 1, 5) 结果为 120参数依次是表达式、变量、起始值和结束值。两端都包含在内,所以 sum(k, k, 1, 100) 计算的是 1 + 2 + … + 100。summation 是 sum 的别名。第三行说明前十个奇数之和等于 10²,最后一行是 5 的阶乘。
求和适用于金额和单位,很适合计算定期储蓄:
# 5 年内每年年初存入 £1,200,年利率 5%sum(£1200 * 1.05^k, k, 1, 5) 结果为 £6,962.30求积适合计算一连串的概率。一个 23 人的群体中至少有两人生日相同的概率,等于一减去 23 人生日各不相同的概率:
p = 1 - product((365 - k)/365, k, 0, 22)(p as %) to 1 dp 结果为 50.7%一些细节:
- 起始值和结束值必须是整数。
- 如果结束值小于起始值,就没有任何项:和为 0,积为 1。
- 单个求和或求积最多 10,000 项。
- 求和可以嵌套,如
sum(sum(j, j, 1, n), n, 1, 4),结果是20。嵌套调用共享同一个总计算量上限。 - 要把已有的值相加,请改用列表:
sum([4, 8, 15])。请参阅列表与统计。
求一个数值根
solve 在你给出的两个界限之间搜索,找出使方程成立的变量值:
solve(x^2 = 2, x, 0, 2) 结果为 1.4142135624solve(x^2 - 4, x, -3, 0) 结果为 -2solve(cos(x) = x, x, 0, 1) 结果为 0.7390851332# 石头下落 44.1 m 需要多长时间?solve(4.9*t^2 = 44.1, t, 0, 10) 结果为 3# 蜡烛售价 £12,每支制作成本 £4,另有 £2,000 固定成本solve(12*n = 2000 + 4*n, n, 0, 1000) 结果为 250参数依次是方程、变量、下限和上限。你可以用 = 写出方程,也可以只写一个表达式,solve 会把它当作 表达式 = 0。
选择界限
solve 要求方程两边的大小关系在你给出的界限之间的某处发生交换。换句话说,left - right 必须在一个界限处为正,在另一个界限处为负(或在某个界限处恰好为零)。然后它会不断缩小范围,直到找到交点。
这会带来几个结果:
- 如果界限之间有两个根,整体上符号可能不变。
solve(x^2 - 4, x, -3, 3)会失败,因为x^2 - 4在两端都为正。请使用只包含一个根的界限,如0和3。 - 曲线只接触零点的根(如
x^2 = 0)无法用这种方法找到,因为符号始终不变。 - 表达式必须在整个范围内都有定义。
solve(sqrt(x) = 2, x, -1, 10)会失败,因为负数的sqrt会报错。请改为从0开始。 - 跨越零点的跳变(如
0附近的1/x)不是根,所以solve在那里会报错,而不会给出结果。 - 下限必须小于上限,并且两者都必须是普通数字。
solve 只返回一个根,绝不会返回所有根的列表。它只适用于普通数字,因此请不要在方程中使用单位。
舍入与复用
结果是非常接近的数值近似,显示的最后一位可能有偏差。在同一行加上 to 4 dp(或任意位数)可以得到整齐的数字;如果想再次使用,请先给结果命名:
solve(sqrt(x) = 2, x, 0, 10) 结果为 4.0000000001solve(sqrt(x) = 2, x, 0, 10) to 4 dp 结果为 4边长 = solve(sqrt(x) = 2, x, 0, 10) 结果为 4.0000000001边长 * 3 to 2 dp 结果为 12你可以把 solve 包装进自定义函数,以便用不同的值反复使用:
平方根(y) = solve(x^2 = y, x, 0, 10)平方根(9) 结果为 3对于含多个未知数的多个线性方程,请使用向量与矩阵中介绍的 solve_system。
符号求导
使用两个参数时,differentiate(或 derivative)以公式形式给出导数:
differentiate(sin(x), x) 结果为 cos(x)derivative(x^3, x) 结果为 (3*(x^(3-1)))derivative(x * sin(x), x) 结果为 (sin(x)+(x*cos(x)))derivative(exp(2*x), x) 结果为 (exp((2*x))*2)结果不会化简,并且每一步都加了括号:(3*(x^(3-1))) 就是 3x²。表达式中的小数会以分数形式返回,所以 19.6 显示为 (98/5)。
结果是文本,Varlig 无法直接用它计算。要使用它,请把公式输入到自定义函数中:
斜率(x) = 3*x^2斜率(2) 结果为 12符号求导可以处理:
+、-、*、/和幂运算,使用加法、乘法、除法、幂和链式法则- 函数
sin、cos、tan、sinh、cosh、exp、ln和sqrt - 其他名称,它们被视为常数,在结果中保留为名称
名称不需要在笔记中有值,所以你可以对含符号的公式求导:
derivative(a*x^2, x) 结果为 (a*(2*(x^(2-1))))其他函数,如 abs、log 或你自己定义的函数,会报错。对于这些函数,请使用下面的数值形式。公式也不会继承原表达式的限制条件:sqrt(x) 的导数只在 sqrt(x) 有定义的地方有效,尽管 (1/(2*sqrt(x))) 看起来像一个独立的公式。
数值求导
加上第三个参数时,derivative 以数字形式给出该点的斜率:
derivative(x^3, x, 2) 结果为 12differentiate(sin(x), x, 0) 结果为 1derivative(sqrt(x), x, 4) 结果为 0.25高度(t) = 20*t - 4.9*t^2derivative(高度(t), t, 1) 结果为 10.2这种形式适用于你在笔记中定义的函数,比如上面的 高度,而符号形式做不到这一点。由于它计算的是数字,表达式中的其他所有名称都需要有值。sum、product、solve 和 integrate 也是如此:
derivative(a*x^2, x, 2) 结果为 Unsupported: Unknown name: aa = 3derivative(a*x^2, x, 2) 结果为 12结果是根据该点两侧附近的值得出的估计值。当真实斜率是一个整齐的数字时,Varlig 会存储这个数字,因此可以精确比较。无理数斜率(如 exp(x) 的斜率)会保留全部位数,所以请在容差范围内比较:
derivative(x^3, x, 2) == 12 结果为 trueabs(derivative(exp(x), x, 1) - e) < 1e-6 结果为 true表达式在该点附近必须是光滑的,没有尖角或间断。derivative(abs(x), x, 0) 会报错,因为 abs 在零点处有尖角;derivative(sqrt(x), x, 0) 也会报错,因为 sqrt 在零的左侧没有定义。
定积分
integrate(x^2, x, 0, 3) 结果为 9integrate(sin(x), x, 0, pi) 结果为 2integrate(x^2, x, 3, 0) 结果为 -9integrate(4/(1 + x^2), x, 0, 1) 结果为 3.1415926536# 3 s 内的下落距离:对速度 9.8t m/s 积分integrate(9.8*t, t, 0, 3) 结果为 44.1参数依次是表达式、变量、下限和上限,顺序与 sum 相同。结果是界限之间曲线下的有向面积。交换上下限会使符号相反,上下限相等则结果为零。你可以对笔记中定义的函数积分,如 integrate(功率(t), t, 0, 4)。
integrate 采用数值方法,所以有些事情无法做到:
- 不支持不定积分:你得到的始终是数字,而不是公式。
- 两个界限都必须是有限的数字;无法积分到无穷远。
- 表达式必须在整个范围内都有定义。
integrate(1/sqrt(x), x, 0, 1)会报错,因为1/sqrt(0)会除以零,尽管面积本身是有限的。 - 含有跳变、尖峰或剧烈振荡的表达式可能给出不准确的结果或报错。
- 不接受单位,所以请像最后一个例子那样把单位写在注释里。
算法与收敛
日常使用无需了解这些细节,但当结果看起来不对或某一行报错时,它们会有所帮助。
solve 使用二分法:反复把范围一分为二,保留符号发生变化的那一半。当 left - right 的值与零相差不超过 10⁻¹⁰ 且范围足够窄时停止;二分 128 次后仍未找到则报错放弃。
符号 derivative 逐步应用标准法则,不做化简。结果最长为 8,192 个字符。这并不是一个完整的计算机代数系统。
数值 derivative 比较步长逐渐缩小的中心差分,并分别检查两侧的斜率。如果两者不一致,或者该点附近的某个值没有定义,就会报错,而不会给出猜测值。
integrate 使用自适应的 7 点和 15 点 Gauss–Kronrod 求积法则。它在范围的每一段上比较两个估计值,并拆分估计误差最大的那一段,直到总估计误差低于 10⁻⁹ × max(1, |结果|)。最多允许拆分 2,048 次、20 层拆分,共享 100,000 步的计算预算。采样点不是均匀分布的,所以像 cos(128*pi*x) 这样在 0 到 1 上快速振荡的函数,能被正确积分为约等于零,而不会被误判为常数。误差估计仍然是一种启发式方法,因此对于含奇点或不连续点的表达式,请谨慎看待结果。
完整规则请参阅高等数学:功能与限制参考页。
综合运用
下面核对一道物理作业题:一个球以 19.6 m/s 的速度竖直向上抛出,重力加速度取 9.8 m/s²:
# 抛出 t 秒后的高度(米)高度(t) = 19.6*t - 4.9*t^2速度(t) = 19.6 - 9.8*t# 高度回到零时落地(跳过 t = 0)落地 = solve(高度(t) = 0, t, 1, 10) 结果为 4# 1 秒后的速度,由高度的斜率求得derivative(高度(t), t, 1) 结果为 9.8# 最高点,此时速度为零最高点 = solve(速度(t) = 0, t, 0, 落地) 结果为 2高度(最高点) 结果为 19.6# 验证:把速度从 0 积分到最高点,得到相同的高度integrate(速度(t), t, 0, 最高点) 结果为 19.6球在 4 秒后落地,在 2 秒时达到 19.6 m 的高度。落地 这一行的下限设为 1,使 solve 避开 t = 0 处的另一个根。最后一行通过对速度积分,从另一个角度验证了高度。