回 帖 发 新 帖 刷新版面

主题:[讨论]可以这样直接进行复数的运算吗?

在下面一段程序中,等号右边使用的数组和变量都为己经赋好实际值的双精度型,程序思路是将DD1得到一个复数值,然后将其实部和虚部的值分别赋于D1和D2,除了一开始声明的复数变量,其它变量都为双精度变量。程序编译和运行是没有错误的,但得到的结果与matlab原程序的结果相差较大,(这段程序是主程序中的一段子程序,如果直接将DD1直接赋予一个确定复数的话,跟matlab相应结果比较几乎是没有误差的,所以原因在于DD1没有得到matlab原程序中的复数值),大家帮忙看下这段程序是不是有些地方少声明复数变量还是什么的,我觉得搞不好是因为fortran与matlab在双精度计算方面的差异造成了,因为程序中引用的数组变量都是1e-7这个数量级的。([color=808080][size=4][size=2][color=FFFF00][color=808000]这个格式看着太晕了,下面这段程序附件里也有[/color][/color][/size][/size][/color])
complex(8) meanphase(2),DD1(2) 
complex(8) expphases0,curbeam,pi,IA,c,vz0   
complex(8) anzsum,meanphasen0,primesum,i1
complex(8) anzsum1(64),meanphasen(10),expphase(10),primesum1(64)
i1=(0,1.0)
nw1=2
do 11,m2=1,nw1 
    w1(m2)=2*pi*freq0*m2                               
    kzn0(m2)=w1(m2)/bp_in(m2) 
11 continue 
Npt=64                                                                                         
do 20,m3=1,nw1 
    if (m3.eq.2)  factor1=1.8  
    expphases0=0                              
    do 30,j2=1,Npt 
        expphases0=expphases0+(-i1*Y(nw1+Npt+j2+2)+Y(nw1+Npt+Npt+j2+2))**m3 
    30 continue
    meanphase(m3)=expphases0/Npt  
    kzn(m3)=kzn0(m3) 
    z_in(m3)=z_in0(m3) 
    if ((t.GE.0).AND.(t.LT.NumsATT1))       then
    alphaATT(m3)=factor*factor1*0.31/8.686 
    else if ((t.GE.NumsATT1).AND.(t.LT.NumeATT1))     then
        alphaATT1add(m3)=(15.8-0.31)/((NumeATT1-NumsATT1)*8.686)*(t-NumsATT1)*m3**(f_scale) 
        alphaATT(m3)=factor*factor1*(0.31/8.686+alphaATT1add(m3)) 
    else if ((t.GE.Numposition1(1)).AND.(t.LT.Numposition2(1)))  then
        alphaATTsadd(m3)=78D0/8.686D0*m3**(f_scale) 
        alphaATT(m3)=factor*factor1*(0.31/8.686+alphaATTsadd(m3))     
    else if ((t.GE.NumsATT2).AND.(t.LT.NumeATT2))   then
        alphaATT2add(m3)=(0.267D0-8.56D0)/((NumeATT2-NumsATT2)*8.686)*(t-NumeATT2)*m3**(f_scale) 
        alphaATT(m3)=factor*factor1*(0.267/8.686+alphaATT2add(m3))     
    else if((t.GE.NumeATT2).AND.(t.LE.zint))  then
    alphaATT(m3)=factor*factor1*0.267D0/8.686D0
    end if 
    if(m3.eq.1) then
 DD1(m3)=-alphaATT(m3)*Y(1)+2*pi*i1*curbeam/IA*conjg(kzn(m3)*sqrt(z_in(m3)/(9*1E011)*c/(4*pi))   *exp(i1*t*(kzn(m3)-w1(m3)/vz0)))*meanphase(m3) 
     D1(1)=real(DD1(m3))  
     D1(2)=AIMAG(DD1(m3))
     end if
     if(m3.eq.2) then
 DD1(m3)=-alphaATT(m3)*Y(3)+2*pi*i1*curbeam/IA*conjg(kzn(m3)*sqrt(z_in(m3)/(9*1E011)*c/(4*pi))  *exp(i1*t*(kzn(m3)-w1(m3)/vz0)))*meanphase(m3)
     D1(3)=real(DD1(m3))  
     D1(4)=AIMAG(DD1(m3))
     end if[em10][em10][em10]

回复列表 (共1个回复)

沙发

将上面程序中涉及到的变量一个一个地运行后输出,跟matlab的结果比较后终于发现误差是出现在主程序里的四阶龙格库塔函数上,DD1是子程序里定义的导数值,这个没有问题,关键在于每次返回的y(m3)值跟matlab比有误差,这样在一个区间上做定步长的一步积分,等于每做一个步长的积分初值就会产生一次的误差,越到后面差值就越大了,用的是徐士良二版里面的那个龙格-库塔函数,感觉跟matlab的ode45在某些初值的情况下误差有点儿大了

各位老师有没有比较好的四阶龙格-库塔法解常微分方程组的函数[em11]

我来回复

您尚未登录,请登录后再回复。点此登录或注册