本帖最后由 Asdmath2020 于 2020-3-5 17:37 编辑 1 _0 k' F" U" s" L3 k6 g
7 ~% G, K) ]- d5 C& F# b" G' O
█ 本文译自算法R&D,内核开发工程师 Devendra Kapadia 于2017年11月9日的博客文章: Limits without Limits in Version 11.2.
9 e2 r# \" G( l$ H% t C- J& ?0 P+ p7 R
! Y/ f& a5 _* o0 d
这是一个序列的10个项:
+ f( S( ?, B2 @/ @7 h
) x, M) K' V) l( V5 ]9 |
' s- _2 j& i# }9 n3 d: X
& W, v5 y$ \! q O3 g* n2 b m8 U这是它们的数值:
% |8 W2 `5 [" {- N' s0 l/ k
. W4 L! y+ o# t
3 W" N1 k0 R8 m
1 V+ O0 M. g2 P8 {这个数列的极值是什么?如果这个数列无限继续下去,我们会得到什么? V- h/ _( ?9 X1 L! [& H% [
7 y( @4 Z7 M! \1 \7 a! Q D( f/ g在 Mathematica 和 Wolfram 语言中,有一个直接求解这一问题的函数:
* ?' E# `9 ?8 a0 s! } E$ b
3 d( T7 B9 I# ]/ J+ R V" M1 a* ]
. Z! C% Q" Q8 k$ h! b) P极限是包括数论、几何学和计算复杂性理论在内的许多领域的中心概念。它们还是微积分的核心,不仅是因为它们被用来定义导数和积分的概念。 : u) x5 w$ b6 c" m% E/ S' W
计算极限是 Mathematica 和 Wolfram 语言一直以来就具有的功能。在版本11 .2 中,这一功能被大幅扩展。我们综合利用 Wolfram 语言的许多特色功能,并发明了一些全新的算法来实现这一点。为了确保我们所做的一切满足用户的需要,我们从Wolfram|Alpha 抽选了100多万个极限问题。 : d0 e) `0 N5 K; L' }) M
# B% Z; B J% s+ F G" r" _: t
) T( f3 i3 [2 s( M% ^# j, z
- A3 c7 |+ T E5 s2 ~6 [- z这是该数列前10个值的表格:% m/ m7 ?* q5 L- b
. ]) T# L1 H- w6 m0 F
3 A: G) i5 a) {8 t下图表明,当 n 趋向于无穷时,数列收敛于 0。( f7 r3 ]$ [. |& @7 f; @! ~) I
/ f0 X, K# k+ a8 e9 M! e: ?
! E, H- \, u/ N; f1 |- S7 U: { M8 c8 }
在版本11 .2 中引入的 DiscreteLimit 函数证实了这个数列的极限是0。 2 e; J- e& N: b" m/ B' ~
: u& ]+ N6 t) Y1 L/ A% G/ h9 @/ f
- F0 f. h9 r2 V g- ~% D$ \7 v# ^, K在现实生活中出现的许多序列 (例如,在信号通信中) 是周期性的,它们的值在规则的间隔时间内重复出现。此类间隔的长度称为序列的周期。例如,考虑一个使用 Mod 定义的序列。) T& ^5 G; h1 y, M
' j9 u, n7 h6 Y% G k; Z
3 C0 r6 V% J5 ^. W6 A
序列图表明该序列是周期性的,周期为6。) G# }. l; C7 `0 @* x4 I" m9 @
- s+ k& R1 E0 O2 y0 s, S
- j& C7 o7 h X- W/ D
与我们的第一个例子相反,这个序列不收敛,它在0和5之间振荡。因此,在这种情况下, DiscreteLimit 返回 Indeterminate(不定)。
2 R/ e& T! Q% p5 G& V1 }2 ^5 Y: z! h
" E+ i7 L& {, r4 J: c
8 b- ]( P' x+ d. H2 j8 E( _
在这种情况下,版本11.2 的新增函数 DiscreteMinLimit 和 DiscreteMaxLimit 可以分别用于计算振荡的下限和上限。因此,我们有:
5 D; f5 t2 a, D7 K, r) W
! T/ a) u7 `8 D$ L% e
5 A4 v* X( K# X2 C& ?7 ^& M! o
9 f0 l! o8 {+ M! [8 a3 T8 H: [在数学文献中,DiscreteMinLimit 和 DiscreteMaxLimit 通常被称为 "lim inf" 和 "lim sup"。这些极限的传统底线和顶线符号是可用的,如下所示。/ ?$ O) c* A( K4 t. ^
* c& v: P1 r" A! a) I3 K, U+ x& [8 p
: ?3 N6 \4 p( W$ d# D o6 G
8 _, ^+ v2 i9 e: I我们的下一个例子是由三角函数 Sin 和 Cos 得到的一个振荡序列,定义如下。
0 R; b. c4 @2 R" N [4 w6 \
+ w5 A& r7 x& E2 k4 D% `
0 u8 \; x2 I; [) I- n2 E+ R: x
尽管在实数范围内 Sin 和 Cos 作为函数是周期性的,这个整数序列的行为很奇特,远远不是一个周期序列,可以通过下图证实。
8 k' `/ d1 w& b( d# B
! \" ~8 x% f$ l2 F; p4 R
1 r7 A; G; r3 q. u+ y' J t因此,该序列的极限不存在。
; l* s7 @0 O5 }6 z, z
+ `4 {5 e: Q) G% s' m' C3 @
* I9 K3 C: ^1 @3 V; F4 a. S然而,事实证明,对于这种 "密集型非周期序列",极值可以通过将它们作为实际函数来计算。不出所料,DiscreteMinLimit使用此方法返回该示例的答案0。
" b) x2 R5 [' f0 x) G* S( h
: e$ u9 B( q; o q4 i* d+ \, {. v4 k& m8 A5 @9 q9 g' }; F
使用相同的方法,DiscreteMaxLimit返回一个含有根式对象的相当凌乱的结果。
; Y+ ?$ Z- {9 l: A* A
0 h- I# J9 }3 v8 S M# e) G4 \8 F: k
这个结果的数值近似于 0.8,正如人们可能从图中猜到的那样。
z; `( J0 M( d; ?* @
7 \/ o3 M3 I0 H6 a% T* }6 c; Y1 M5 T7 X/ f$ H/ C
当我们试图计算无限嵌套的根式值时,离散极限也会以自然的方式出现。例如,考虑以下嵌套根式的求值问题。' t- J9 H$ F% w! P# F9 K8 f0 w
- r* s: \0 q: _# P6 G0 {, ]由于该序列满足非线性重复性,因此可以使用 RSolveValue 来生成根式展开式的连续项。例如,展开式的第三个项可以通过以下所示得到。
. f' y( r0 d# U; H* [' s$ R
, T& Z* s" L' W0 }
通过 RecurrenceTable 所生成的下图可以看出,无限嵌套的根式值似乎是 2。
3 U8 `: E/ ~- c8 u' q- S7 J+ }, b" R/ e
使用版本 11.2,通过求解 RSolveValue 中的值 r(∞),我们可以确认极值确实是 2,如下所示。* V- R0 R* ?8 G% x
2 c" v7 i1 O+ h) d0 a5 `% @
极限的研究是数学的一个分支,称为渐近分析。渐近分析提供了在特定值 (如0或无穷大) 附近获取问题近似解的方法。事实证明,在实际中,渐进逼近的效率通常恰恰会在相应的精确计算变得困难的情况下得到提高!这一现象的一个著名的例子是在研究整数分区时,随着数量的增加,分区会增长非常快。例如,数字6可以使用IntegerPartitions 以11种不同的方式进行分区,如下所示。
3 c r0 i0 m$ J- M. Q6 G
' @( F; n, p# ]5 t
0 i, y- B7 T& t% {0 ]
可以直接使用 PartitionsP 找到不同分区的数量,如下所示。
4 [4 p+ p9 |2 @
/ M7 S# p j- |' O: W7 A如前所述,分区的数量随着整数的大小而快速增长。例如,数字200有近4兆分区。
% Z3 K, |7 w% y: t. M* e) T
# a2 e b( R; }, f* l( ]% M( R
# F* G X0 j' t* V: n) D
在 1918年,哈代和拉马努金提供了这个数字的渐近逼近,由以下公式给出。
' Q$ w3 F- e9 C' h1 g
: p) m0 x M3 i1 w& O0 |
根据上式估计,数字200的答案相当接近4兆。
, ]7 ?0 H# ~$ @& X# f" F: }
7 Q% x, g `% n* ~, T# W; O
提供有一个更大的整数,我们几乎可以瞬间得到一个更好的分区数量近似,如下例所示。
% p; d- m4 N3 o8 s
' k- ] U+ J% `& i- ]
4 q9 L' z, C: J* ?) k, U" _最后,我们可以证实,使用 DiscreteLimit,当 n 趋于无穷时,渐近估计接近于分区数,这正印证了上面讨论的哈迪-拉马努金公式。: S. f, i( {' Q1 Z) T
$ H% n1 z/ _8 z5 i0 l. V; U
正式的表述是,当n 接近无穷时,精确和近似公式的分区数是渐近等价的。 ' T) C9 o+ {, E3 Z& W. O, }4 `' l6 S
渐近概念在函数极限的研究中也起着重要的作用。例如,三角学中的小角度逼近断言 "在 x 取很小的值时,sin (x) 近似等于 x 。" 还可以表述成, "当 x 趋向于 0 时,sin (x) 与x渐近等价。" 这个结果可以使用计算函数极值的 Limit 正式表述如下。
& f p L- a+ t$ q! K
* W* N& y5 Z& B/ U7 q6 B
这个图形直观地证实,极限确实是1。
* I) Z$ U( g1 ^- \' Q
& z; l3 U$ @+ x. P. k8 z1 ]5 x9 ?
上述极限也可以使用洛必达法则,通过分别计算分子和分母的导数 cos(x) 和1 得到,如图所示。: N2 H; C6 A& e4 S+ L" o
- F( D1 J" M& s! s洛必达法则为计算许多极限提供了一个强有力的方法。然而,在得出答案之前,可能需要大量的步骤。例如,考虑以下极限。
1 \6 _- O" k8 R1 G8 p/ n4 e
4 C) v. R) o* ?由于所有的中间计算都给出了不确定的结果,这个极限要求重复应用六次洛必达法则规则才能得到答案0。
, T8 o$ y5 s3 A4 w8 V( g
& r8 k Y5 v* h P6 h) f9 f
我们看到在求函数极值时,洛必达法则作为一个实用的算法,仍存在一定的局限性,因为我们不可能确定算法应该在什么时候停止!而内置函数 Limit 使用级数展开和现代算法的组合,可以对涉及指数和对数的输入(即所谓的"exp-log"类)很好地工作。事实上,在版本11 .2 中,Limit 得到了大幅更新,可以以相当全面的方式,对各种难题迎刃而解,如下所示(最后两个示例仅适用于最新版本)。
9 R* s3 x/ U! C% e }" @/ y
- K; g" _* q8 p* _. ^; _+ ?
+ \. [( d. V+ w v6 B
- @3 g: Q/ Y$ V3 ~
' E) M" t7 Q" c, h; ]' X2 P4 D与序列的情况相同,周期函数和振荡函数的极限往往不存在。你可以使用 MaxLimit 和MinLimit,就像它们对应的离散情况一样,给函数的振荡设置严格的边界,就像下面这个经典的例子所示。
# n6 c0 F3 F( V& i4 t# i' X0 Y
, f" f( S* \; y7 _+ }
5 I; j0 t' v, q1 x8 l% k( u0 l如图所示,函数在-1和1之间接近0处快速振荡。这些界限由 MaxLimit 和 MinLimit确认,而 Limit 本身返回 Indeterminate。
1 W0 E7 f+ S3 S7 L; \7 v
& r& e. X+ w& P8 I3 D在前面的示例中,由于函数在原点附近剧烈振荡,极限不存在。不连续函数还可以提供在某点处极限可能不存在的其他类型示例。我们这里考虑这样一个函数,它在原点和其他值上有跳跃不连续性。该函数由 SquareWave 和 FresnelS 定义,如下所示。
. K {' x& {9 C$ Z; h; s/ Q' J
: [" q0 N4 N+ D/ J% ~% J: a; C9 p从这个图可以看到跳跃不连续性,这是由于函数定义中存在方波所导致。
* F' e( z& F8 b0 z& f6 @
: j/ [- X9 b. M I9 X3 o8 O
我们看到,取决于我们接近原点的方向,函数在0点有极值。可以使用 Direction (方向)选项计算右侧 ("FromAbove")的极值。
+ u( z0 n5 Q; o* P: k
* @1 G. t' R4 |4 L% X+ d同样,左侧的极值可以计算如下。
# L4 t" m/ A$ J
6 F" |) Z3 E/ ?: s/ \6 G极值如果存在的话,是函数的 "双面" 极值,在本例中不存在。
$ @" K3 v# [% r5 l# _$ n( H3 Y
) R' q' ]' o, A. f. ^默认情况下,在版本11 .2 中 Limit 计算双面极值。这与早期版本不同,后者在默认情况下,从上面计算极值。因此,在不设定 Direction 选项时, 我们从Limit 得到一个不确定的结果 Indeterminate。
5 e0 w. ?( g6 |# Z2 O, l
, W: ?7 c, i; n6 ?7 _4 ]6 A5 ^) i6 D! |- b# T
方向极值在多变量情况下更有意义,因为在更高的维度中有许多可能的方向接近给定点。例如,考虑定义如下的二元函数 f (x,y)。
a- S! [7 b* P G/ k/ a4 h8 B3 ?( x
3 M: V2 {" S3 ?$ Q* N' t( _3 Q8 ]如果我们沿着 x 轴(由 y=0 给出)求解,则这个函数在原点的极值是 0,因为函数沿着这条线有常数值0。
8 L& ?2 w- y5 V. J) Z0 E# c
# R( T$ Z+ D0 P2 M4 X
: f& s6 y5 W4 f2 c
同样,如果我们沿着 y 轴(即x=0),则函数在原点的极值为0。
8 M- x- @; j% [. Q g
: Y! p3 G4 B2 i) j5 [% d0 c但是,如果我们沿着线 y=x 的方向接近原点,则极限为 1/2,如下所示。% g8 X- ^. h7 k% G2 t ]
% f1 F' V& \* C6 I6 e# F, s Z
更一般地,当我们沿着不同的线 y=m x 接近原点时,极值会发生变化。/ [2 X. A& ?3 q8 P" B
3 N/ }: ~/ u& n7 R极值的方向依赖性意味着不存在真正的多元极值。在版本11 .2 中,Limit 可以轻松处理多变量情况,并且快速返回该函数在原点上极值的预期答案 Indeterminate。' G K' E! \4 G7 |7 L6 Z
* h: B" w- |& T" G& Z u' d( L) \
曲面z=f(x,y)的图形确认函数在原点附近的行为。
, p. T0 e4 |, Z, a
0 Z% P7 g( t( P答案可以通过对函数直接应用 Limit 来确定。
9 X: N) r- _- d+ g7 i4 n
4 v( V, q8 ]6 ?3 y- g用户每天从 Wolfram|Alpha 所输入的查询语句是我们获取多变量极值示例的一个丰富来源。我们获得了大约10万个匿名 Wolfram|Alpha 查询,然后用版本11 .2 运算。这个示例是最新版本中 Limit 能轻松求解的浩如烟海的问题之一。) B" K" t. P& K; ~5 J
5 Z/ o8 G. Q2 P4 w: J
% T# q! t) u( v/ S7 F5 D浏览 Wolfram|Alpha 示例本身就乐趣无穷,我们在此与你分享其中1000个精彩示例(在后台发送“极限”,便可获取这1000个范例的下载链接)。示例图像如下所示。
" H0 G: H4 U+ ?0 e, P
) g: s- A. v& J4 T1 L
版本11 .2 能够计算整个集合的90 %,这是相当了不起的,因为多元极限是本版本推出的最新功能。
# f) |+ l3 p9 a7 ?
; [) k Y4 e+ H: z对于更大的集合——来自 Wolfram|Alpha 的100万个单变量极限问题,版本11 .2 能够求解的比例更高(96%),而版本11 .1为94 %。这两个版本之间的微小百分比差异可以解释为,大多数Wolfram|Alpha单变量极限查询与大学微积分中的第一或第二个课程有关,在任一版本中都很容易用 Limit 计算。: q4 u) `# @ L
4 g( I4 ^" c# r# Q- X" S
自 Wolfram 语言首次发布版本 1 开始(1988年),Limit 一直是最可靠的函数之一。版本11 .2 中对该函数的改进,以及 DiscreteLimit 和其他新函数的推出,为我们求解极限世界的难题提供了便利。希望您能喜欢本文简介,并欢迎您对新功能提出任何评论或建议。
# h/ M0 P7 ~9 u5 O$ u: z4 J/ [
4 ]+ C# t4 L6 n' @/ M6 R6 r! U |