Mathematica解差分方程很方便,记住一个词就可以了RSolve或者RSolveValue就可以了。以下这个例子比较特殊,存在解析解,但是软件算不出。
问题:
已知:
a [ 1 ] = 1 2 a[1]=\sqrt{1\over2} a[1]=21
a [ n + 1 ] = ( 1 + a [ n ] ) 2 a[n+1]=\sqrt{(1+a[n])\over2} a[n+1]=2(1+a[n])
计算:
lim n − > ∞ ( ∏ i = 1 n a [ i ] ) \displaystyle\lim_{n->\infty}({\displaystyle\prod_{i=1}^n{a[i]}}) n−>∞lim(i=1∏na[i])
数学分析:不难发现a[n]是一个递增数列,且极限为1.无限多个小于1而趋于1的数相乘有两种结果,趋于1比较慢结果为0,趋于1速度快收敛值接近前几项乘积。这道题的结论符合后者。a[n]前后两项的关系很巧妙,满足三角变换当中的半角公式。这样令 a [ n ] = cos α a[n]=\cos{\alpha} a[n]=cosα
则a[n+1]增大到 a [ n + 1 ] = cos α 2 a[n+1]=\cos{\alpha\over2} a[n+1]=cos2α,角度越小,余弦值越大,增大到接近1。这样就很容易手算出a[n]的解析解。
表达式如下:
a [ n ] = cos π 2 n + 1 a[n]=\cos{\pi\over2^{n+1}} a[n]=cos2n+1π
接下来解决连乘求极限的问题:
为了解决角度减半无限多项的问题,可以在最后乘一个第n项的正弦值,则会角度翻倍至到剩下一项。
I = lim n − > ∞ ( ∏ i = 1 n a [ i ] ) = lim n − > ∞ ( ∏ i = 1 n cos π 2 n + 1 ∗ sin π 2 n + 1 sin π 2 n + 1 ) I=\displaystyle\lim_{n->\infty}({\displaystyle\prod_{i=1}^n{a[i]}})= \displaystyle\lim_{n->\infty}({\displaystyle\prod_{i=1}^n{{\cos{\pi\over2^{n+1}}*\sin{\pi\over2^{n+1}}}}\over\sin{\pi\over2^{n+1}}}) I=n−>∞lim(i=1∏na[i])=n−>∞lim(sin2n+1πi=1∏ncos2n+1π∗sin2n+1π)
I = lim n − > ∞ 1 2 n ∗ sin π 2 sin π 2 n + 1 = 2 π I=\displaystyle\lim_{n->\infty}{{1\over2^n}*\sin{\pi\over2}\over\sin{\pi\over2^{n+1}}}={2\over\pi} I=n−>∞limsin2n+1π2n1∗sin2π=π2
至此这道题目的手解就结束了,的确是非常巧妙的利用了三角变换,这个题目曾经陷入了很长的对连乘取对数再如何处理的困苦中,毫无破题思路。结果并不是指数形式的,所以也验证了之前的对连乘取对数方法的不合适。
接下来用mathematica来解一下吧,看上去a[n]的解析表达式很简单,但是实际上mathematica却无法直接求出来,我觉得可能是这样的变换本身没有被程序用来解一般问题吧,如果谁能用它得到解析解请告知本人。
可以看到mathematica没有输出,当然这里a[n]换成a[10]是能得到一个结果的,多试几个数就会发现趋于1的速度的确很快。但得不到解析解总是差强人意。
这里又用Nest嵌套循环直接算了一下连乘的数值解:
这里不得不佩服wolfram简洁的语言和强大的计算功能并存。
其实这里用不着100次迭代,10次以内结果就很逼近2/pi了。