预测一个数列的极限
已知一数列$\{A_n\}$具有某种规律,当$n->\infty$时收敛于极限$c$,
并且知道前$18$项的近似值(小数点后$14$位有效):
$A_1=0.5000000000000000$
$A_2=0.5411961001461970$
$A_3=0.5592963160013235$
$A_4=0.5697241339680272$
$A_5=0.5758100732116277$
$A_6=0.5797027571324435$
$A_7=0.5823512950800830$
$A_8=0.5842414664898477$
$A_9=0.5856415568613965$
$A_10=0.5867100340534064$
$A_11=0.5875456013767071$
$A_12=0.5882124706064433$
$A_13=0.5887539536513828$
$A_14=0.5892001711937236$
$A_15=0.5895726247096161$
$A_16=0.5898870137232585$
$A_17=0.5901550299615904$
$A_18=0.5903855332606833$
能否根据这些值预测当$n->\infty$时,极限$c$的值?
精确程度可以达到几位小数?
用什么方法预测? 本帖最后由 wayne 于 2010-8-1 14:23 编辑
这跟看序列找规律区别不大吧,呵呵 本帖最后由 KeyTo9_Fans 于 2010-8-1 14:30 编辑
好像是的。
拿个什么函数拟合一下,然后根据函数表达式求极限。 我猜测,A2的准确值应该是
1/{\sqrt{2+\sqrt{2}}} 老大,能否说说这道题的背景 看成是曲线拟合的话,会忽视掉 题干给的高精度的信息。
我感觉应该有一种预测方法,比曲线拟合更强的方法,要不插值试试....... 本帖最后由 wayne 于 2010-8-1 15:26 编辑
关于外插方法,推荐你一本书:
Practical Extrapolation Methods: Theory and Applications
书里面开篇就谈到了问题背景:
下载地址:
http://ifile.it/d5x87go/0521661595.rar http://mathworld.wolfram.com/WynnsEpsilonMethod.html 8# Buffalo
呵呵,你给的方法我那本书里面大篇幅介绍了 我自己设计了一个很土的方法,预测出了一个极限值:
$lim_{n->\infty}A_n=0.592746063$
$c++$代码如下:#include<cstdio>
#include<math.h>
double a={0,
0.5,
0.54119610014619698439972320536639,
0.55929631600132353475576392078938,
0.56972413396802715322804051835303,
0.57581007321162765360503297431458,
0.57970275713244352141943997833056,
0.58235129508008298007347469183041,
0.58424146648984767386035113239817,
0.58564155686139651141699566635464,
0.58671003405340635980469047312441,
0.58754560137670707686509637674778,
0.58821247060644326317197307974183,
0.58875395365138276709785553207334,
0.58920017119372364434464005947868,
0.58957262470961612944817110769224,
0.5898870137232585,
0.5901550299615904,
0.5903855332606833};
int i;
double b,c,d,e;
double f(int i) //f(i)是二次函数(a+bi+ci^2)的倒数,a、b、c的值是根据误差最小的原则拟合出来的。
{
return 1/(51.339415-11.69409*i+0.64923801*i*i);
}
int main()
{
for(i=1;i<19;i++)
{
b=exp(-log(a-a)*4/11); //将a数列的相邻两项作差,将差的(-4/11)次方记为b数列
if(i>1)c=b-b; //将b数列的相邻两项作差,记为c数列
}
for(i=3;i<19;i++)
{
d=exp(-log(c-c)*4/10); //将c数列的相邻两项作差,将差的(-4/10)次方记为d数列
if(i>3)e=d-d; //将d数列的相邻两项作差,记为e数列
}
for(i=5;i<19;i++)
{
if(i>5)printf("%d %.16lf %.16lf\n",i,e-e,f(i)); //输出e数列的相邻两项之差和f(i)的值,看看是否吻合得比较好
}
puts("");
for(i=19;i<999999;i++)
e=e+f(i); //根据f(i)的值延长e数列
for(i=19;i<999999;i++)
d=d+e; //根据e数列的值延长d数列
for(i=19;i<999999;i++)
c=c-exp(-log(d)*10/4); //根据d数列的值延长c数列
for(i=19;i<999999;i++)
b=b+c; //根据c数列的值延长b数列
for(i=19;i<999999;i++)
a=a+exp(-log(b)*11/4); //根据b数列的值延长a数列
for(i=0;i<999999;i+=(i>19?i/2:1))
printf("%6d: %.9lf\n",i,a); //输出a数列
return 0;
}运行结果如下:6 1.#QNAN00000000000 0.2199037834745008
7 1.#QNAN00000000000 0.7731276358192092
8 1.#QNAN00000000000 -1.5104089226742774
9 1.#QNAN00000000000 -0.7580833345696476
10 -0.3713578484461415 -1.4756140029866442
11 0.5864595799163581 0.7922522734689024
12 0.1712273296721794 0.2221921798644612
13 0.1107856277919126 0.1106504524996588
14 0.0669381691118112 0.0672368126045807
15 0.0456397026485718 0.0454408775614979
16 0.0328465962300193 0.0328526923554737
17 0.0248567106136584 0.0248944042293199
18 0.0195452906191100 0.0195316657192975
0: 0.000000000
1: 0.500000000
2: 0.541196100
3: 0.559296316
4: 0.569724134
5: 0.575810073
6: 0.579702757
7: 0.582351295
8: 0.584241466
9: 0.585641557
10: 0.586710034
11: 0.587545601
12: 0.588212471
13: 0.588753954
14: 0.589200171
15: 0.589572625
16: 0.589887014
17: 0.590155030
18: 0.590385533
19: 0.590585342
20: 0.590759776
30: 0.591733134
45: 0.592235286
67: 0.592487243
100: 0.592616157
150: 0.592681661
225: 0.592714218
337: 0.592730303
505: 0.592738279
757: 0.592742224
1135: 0.592744172
1702: 0.592745132
2553: 0.592745605
3829: 0.592745838
5743: 0.592745952
8614: 0.592746009
12921: 0.592746037
19381: 0.592746050
29071: 0.592746057
43606: 0.592746060
65409: 0.592746062
98113: 0.592746063
147169: 0.592746063
220753: 0.592746063
331129: 0.592746063
496693: 0.592746063
745039: 0.592746063我可以看到,$e$数列的相邻两项之差从$i=13$开始与$f(i)$的值吻合得非常好。
根据$f(i)$的值反推$A$数列,得到$A$数列的极限:$0.592746063$。
不知道这个方法是否正确,也不知道准确度有多高。
我没有时间阅读大量的相关文献。
如果谁知道正规一点的方法,请回帖告知。
如果能根据$1#$的数据直接实现一遍就更好了。