- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 41286
- 在线时间
- 小时
|
发表于 2013-3-9 16:11:30
|
显示全部楼层
找了一下Pari/Gp里面有intformal函数可以对多项式积分,不过里面要求所有符号有个默认顺序,而积分必须对默认符号积分,其实起来不是很方便,所以下面的代码使用前必须保证gw,gc变量没有定义,或者gw定义在gc之前,也就是调用函数reorder()可以看到gc没有定义或者gw,gc都定义了但是gw在前面-
- symbolp(n)=
- {
- local(p,q,p1,p2,p3);
- global(gw,gc,gt1,gt2);
- p=1;
- for(u=1,n,
- q=intformal(p,gw);
- q=subst(q,gc,gt1);
- q=subst(q,gw,gt2);
- p1=subst(q,gt1,gc);
- p1=subst(p1,gt2,(gc+gw)/2.0);
- p2=subst(q,gt1,1.0-gw);
- p3=subst(p2,gt2,1.0-gw);
- p2=subst(p2,gt2,1-(gc+gw)/2.0);
- p3=p3-p2;
- p2=subst(q,gt1,gw);
- p2=subst(p2,gt2,gw);
- p=p1+p2+p3;
- );
- p
- }
- getdist(n)=
- {
- local(p,d1,d2,d3,d4);
- global(gw,gc);
- p=symbolp(n);
- d1=p*(-gc^2/2.0+gw^2+gc-gw);
- d2=p*(-gc^2+2*gw*gc-gw^2+gc-gw);
- d3=intformal(d1);
- d4=intformal(d2);
- d1=subst(d3,gw,gc/2.0);
- d2=subst(d4,gw,gc);
- d4=subst(d4,gw,gc/2.0);
- d2=d2-d4;
- d1=d1+d2;
- d1=intformal(d1);
- 2.0*subst(d1,gc,1.0)
- }
复制代码 然后计算结果如下:
(16:06) gp > getdist(2)
%17 = 0.2114583333333333333333333333
(16:07) gp > getdist(10)
%18 = 0.2203686807254583318975768873
(16:07) gp > getdist(20)
%19 = 0.2204074196271448826430741941
(16:07) gp > getdist(30)
%20 = 0.2204077318388700882261725891
(16:07) gp > getdist(40)
%21 = 0.2204077356077135199957228968
(16:07) gp > getdist(50)
%22 = 0.2204077356585942289207798388
(16:07) gp > getdist(60)
%23 = 0.2204077356593274980124179385
(16:07) gp > getdist(70)
%25 = 0.2204077356593385397246878697
(16:33) gp > getdist(99)
%1 = 0.2204077356593387142224517526
(16:10) gp > getdist(100)
%26 = 0.2204077356593387141426361209
也就是我们可以得出g(a,b)=(a+b)/2时的高精度结果,也就是每秒4.537次,同Fans的模拟结果匹配 |
|