- 积分
- 7
- 注册时间
- 2002-9-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 wanglu 于 2009-12-28 19:52 编辑
原帖位置:http://www.ilovematlab.cn/thread-60022-1-1.html
问题描述:
我用Forcal给出了递归解法,但当m=4时,运算时间就很长了,这倒不是Forcal速度太慢的缘故,此例若转换成C/C++代码,Forcal的速度估计在C/C++速度的1/10左右,甚至更快一些。速度慢的原因主要在于存在大量的函数调用。
如果能保存V(t,m)的计算结果,以后不再计算,估计能大幅提高速度。但难点在于,此问题中存在一个积分(我用的积分方法是徐士良算法中的连分式积分法),不知道积分运算时V(t,m)中的t为多少,故难以保存中间结果。
Matlab、mmtc、Maple等高手们看一下有什么好方法,最好给出代码,实际运行一下。
据原贴主xl0418讲,有人算过m=50,以运行10分钟为限,大家看能算到多少?
下面是Forcal代码及结果:
-
- SetTalk[false];
- !SetRealStackMax(1000);
- Rm(t,m:j,s,a,b,h:hVm,iRm)=
- {
- iRm++, h=0.00001,
- sys::call(2,hVm :t+h,m : &a), //计算s=Vm(t+h,m)
- sys::call(2,hVm :t,m : &b), //计算s=Vm(t,m)
- s=[a-b]/h,
- j=0,(j<=m).while{
- sys::call(2,hVm :t,j : &a), sys::call(2,hVm :t,m-j : &b), //计算a=Vm(t,j), b=Vm(t,m-j)
- s=s+a*b,
- j++
- },
- s-[1-which(m<1,0,1)] //最后返回这个值。看这句有没有问题:取m<1,而不是m<=1
- };
- //Fkappa将返回s的值。mm是模块变量,因调用Rm(t,mm-1)时mm将改变,故用a预先保存,函数返回前恢复mm的值
- Fkappa(t:a,s,kappa:mm,iFkappa)= iFkappa++, kappa=0, a=mm, s=t^(2*kappa)*Rm(t,mm-1), mm=a, s;
- Vm(t,m:h,kappa:mm,hFkappa,iVm)=
- {
- iVm++, h=-1, kappa=0,
- if[m<=0,return(t)], if[m==1,return(1/3*h*t^3)],
- which(m<=1,0,1)*Vm(t,m-1)+h*{mm=m, XSLSF::fpqg[hFkappa,0,t,1e-6]} //XSLSF::fpqg即徐士良算法中的连分式积分法
- };
- pert(t)=t-1/3*t^3+2/15*t^5-17/315*t^7;
- main(t,m:k,s:hFkappa,hVm,iRm,iFkappa,iVm)=
- {
- iRm=0, iFkappa=0, iVm=0,
- hFkappa=HFor("Fkappa"), hVm=HFor("Vm"), //预先获得函数Fkappa和Vm的句柄,函数调用时将用到
- s=0,k=0,(k<=m).while{
- s=s+Vm(t,k),
- k++
- },
- printff{"\r\n结果={1,r,-25.16}, 验证pert(t)={2,r,-25.16}, 函数Rm调用次数{3,i,-8}, 函数Fkappa调用次数{4,i,-8}, 函数Vm调用次数{5,i,-8}",s,pert(t),iRm,iFkappa,iVm},
- s //返回s
- };
- main[1,1];
- main[1,2];
- main[1,3];
- main[3,1];
- main[3,2];
- main[3,3];
复制代码 结果:
结果=0.6666666666666667 , 验证pert(t)=0.7460317460317461 , 函数Rm调用次数0 , 函数Fkappa调用次数0 , 函数Vm调用次数2
结果=0.8000050003347501 , 验证pert(t)=0.7460317460317461 , 函数Rm调用次数65 , 函数Fkappa调用次数65 , 函数Vm调用次数394
结果=0.7460312361721437 , 验证pert(t)=0.7460317460317461 , 函数Rm调用次数33702 , 函数Fkappa调用次数33702 , 函数Vm调用次数203761
结果=-6. , 验证pert(t)=-91.62857142857143 , 函数Rm调用次数0 , 函数Fkappa调用次数0 , 函数Vm调用次数2
结果=26.40004500009 , 验证pert(t)=-91.62857142857143 , 函数Rm调用次数129 , 函数Fkappa调用次数129 , 函数Vm调用次数778
结果=-91.62900091017789 , 验证pert(t)=-91.62857142857143 , 函数Rm调用次数163158 , 函数Fkappa调用次数163158 , 函数Vm调用次数982033
我还有一个问题,放在maple板块:一个含积分的等式优化题
位置:http://forum.simwe.com/thread-910945-1-1.html
大家帮忙解决一下? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|