子程序ODEX(N,FCN,X,Y,XEND,H,&RTOL、ATOL、ITOL、,&SOLOUT、IOUT、,&工作,工作,工作C类----------------------------------------------------------一类一阶系统的C数值解C常微分方程Y'=F(X,Y)。C这是基于C显式中点规则(具有步长控制,C订单选择和密集输出)。C类C作者:E.HAIRER和G.WANNERC日内瓦大学数学系C CH-1211 GENEVE 24,瑞士C电子邮件:Ernst.Hairer@unige.chC类Gerhard.Wanner@unige.chE.海尔和A.奥斯特曼编写的C密集输出C类C本书第II.9节对该代码进行了说明:C E.HAIRER、S.P.NORSETT和G.WANNER,解决普通问题微分方程I.非刚性问题。第二版。计算数学中的C弹簧系列,C弹簧-VERLAG(1993)C类C基于1995年9月30日版本C 2009年10月11日的小型更正C功能IDID=2的微小变化,2015年10月4日C被SOLOUT中断(C.LUDWIG)C类C输入参数C----------------C N系统尺寸C类C FCN计算的子例程的名称(外部)F(X,Y)的C值:C子程序FCN(N、X、Y、F、RPAR、IPAR)C双精度X、Y(N)、F(N)C F(1)=。。。等。C类C X初始X值C类C Y(N)Y的初始值C类C XEND最终X值(XEND-X可以是正值或负值)C类C H初始步长猜测;C H=1.D0/(F'的正常值),通常为1.D-1或1.D-3。C此选择并不十分重要,请快速输入代码C调整步长。当你不确定的时候C研究选择的值C子程序“解决”中的步骤。C(如果H=0.D0,则代码为H=1.D-4)。C类C RTOL、ATOL相对误差容限和绝对误差容限。他们C可以是标尺,也可以是长度为N的两个向量。C类RTOL和ATOL的ITOL开关:C ITOL=0:RTOL和ATOL都是标尺。代码粗略地保留了C Y(I)低于RTOL*ABS(Y(1))+ATOLC ITOL=1:RTOL和ATOL都是向量。C代码将Y(I)的局部错误保持在以下C RTOL(I)*ABS(Y(I))+ATOL(I)。C类C提供C积分过程中的数值解。C如果IOUT。GE.1,每一个成功的步骤都会被调用。C如果IOUT=0,则提供虚拟子例程。C必须有表格C次常规溶液(NR、XOLD、X、Y、N、CON、NCON、ICOMP、ND、,C RPAR、IPAR、IRTRN)C尺寸X、Y(N)、CON(NCON)、ICOMP(ND)C。。。。C SOLOUT在NR-TH提供解决方案“Y”C网格点“X”(因此初始值为C第一个网格点)。C“XOLD”是前一个网格点。C“IRTRN”用于中断集成。如果IRTRNC设置为<0,ODEX将返回到调用程序。C类C------连续输出(如果IOUT=2):-----C在呼叫“解决”时,持续解决方案C间隔[XOLD,X]可用C双精度功能C>>>CONTEX(I、S、CON、NCON、ICOMP、ND)<<<C提供了I-TH的近似值C点处解的分量C S应位于区间[XOLD,X]。C类调用子例程解决方案的IOUT开关:C IOUT=0:从不调用子例程C IOUT=1:输出使用子例程C IOUT=2:在SOLOUT中执行密集输出C类C“LWORK”长度工作空间的工作阵列。C用作所有矢量的工作空间。C“LWORK”必须至少C N*(KM+5)+5*KM+20+(2*KM*(KM+2)+5)*NRDENSC其中NRDENS=工程(8)(见下文)和如果IWORK(2)=0,则C KM=9C KM=IWORK(2)IF IWORK(2)。燃气轮机.0C工程(1),。。。,工作(20)用作参数C代表代码。对于标准用途,请设置这些呼叫前C参数归零。C类C LWORK声明的阵列“工程”长度。C类C IWORK长度为“LIWORK”的集成工作空间。C“LIWORK”必须至少C 2*KM+21+NRDENSC IWORK(1),。。。,IWORK(20)用作参数C代表代码。对于标准用途,请设置这些呼叫前C参数归零。C类C LIWORK声明的阵列长度“IWORK”。C类C RPAR、IPAR实参数和整数参数(或参数数组),其中C可用于您通话之间的通信C程序和FCN、JAC、MAS、SOLOUT子程序。C类C类-----------------------------------------------------------------------C类C参数的完善设置C类-----------------------------------C几个参数(功(1),。。。,网络(1),…)允许C根据问题和需求调整代码C用户。对于零输入,代码选择默认值。C类C工作(1)绕过,取整装置,默认2.3D-16。C类C工作(2)最大步长,默认XEND-X。C类C工作(3)步骤尺寸因系数工作(3C稳定性检查为负值,默认值为0.5。C类C工件(4)、工件(5)步长选择参数C J-TH对角入口的新台阶尺寸为C受限制的选择C FACMIN/WORK(5)<=HNEW(J)/HOLD<=1/表面处理其中FACMIN=功(4)**(1/(2*J-1))C默认值:功(4)=0.02D0,功(5)=4.D0C类C工作(6),工作(7)订单选择参数如果W(K-1)<=W(K)*工作(6),台阶尺寸减小C如果W(K)<=W(K-1)*工作(7),台阶尺寸增加C默认值:功(6)=0.8D0,功(7)=0.9D0C类C工作(8)、工作(9)步进控制算法的安全系数C HNEW=H*工作(9)*(工作(8)*TOL/ERR)**(1/(J-1))C默认值:功(8)=0.65D0,C工作(9)=0.94D0,如果“希望收敛”如果“没有收敛的希望”,C功(9)=0.90D0C类C IWORK(1)这是允许的最大步数。C默认值(对于IWORK(1)=0)为10000。C类C IWORK(2)外推中的最大列数C表。默认值(对于IWORK(2)=0)为9。C如果工作(2)。NE.0则网络(2)应为。通用电气3。C类C IWORK(3)步长顺序开关(仅偶数)C如果工作(3)。等式1然后是2、4、6、8、10、12、14、16,。。。C如果工作(3)。等式2然后是2,4,8,12,16,20,24,28,。。。C如果工作(3)。等式3然后是2,4,6,8,12,16,24,32,。。。C如果IWORK(3)。等式4然后2,6,10,14,18,22,26,30,。。。C如果工作(3)。等式5然后4,8,12,16,20,24,28,32,。。。C默认值为IWORK(3)=1,如果IOUT。第1节;C如果IOUT,默认值为IWORK(3)=4。通用电气2。C类C IWORK(4)稳定性检查在C一行提取液。表,默认IWORK(4)=1。C类C IWORK(5)稳定性检查仅在管线中激活C 1至i工作(5)。表,默认IWORK(5)=1。C类C IWORK(6)如果IWORK(6)=0,则密集型误差估计C输出公式已激活。它可以被抑制C通过铺设管道(6)=1。C默认IWORK(6)=0(如果IOUT.GE.2)。C类C IWORK(7)确定插值公式的阶数C MU=2*KAPPA-工程(7)+1C管道(7)应介于1和6之间C默认IWORK(7)=4(如果IWORK(7)=0)。C类C IWORK(8)=NRDENS=输出密集的组件数量需要CC类C IWORK(21),。。。,网络(NRDENS+20)表示组件C需要密集输出C类C-------------------------------------------------------------------------CC输出参数C-----------------已计算解决方案的C X X值C(成功返回后X=XEND)。C类X处的C Y(N)数值解C类C H最后接受步骤的预测步长C类关于退货成功率的IDID报告:C IDID=1计算成功,C IDID=2计算机。成功(被独奏打断)C IDID=-1计算不成功。C类C IWORK(17)NFCN功能评估数量C IWORK(18)NSTEP计算步骤数C IWORK(19)NACCPT验收步骤数量C IWORK(20)NREJCT拒绝步数(由于错误测试),C(第一步中的步骤拒绝不计在内)C类-----------------------------------------------------------------------C*******************C声明C*******************隐式双精度(A-H,O-Z)隐式整数(I-N)尺寸Y(N)、ATOL(*)、RTOL(*)RPAR尺寸(*),IPAR(*)逻辑阵列外部FCN,SOLOUTC***************C设置参数C****************NFCN=0NSTEP=0NACCPT=0NREJCT=0ARRET=。错误。C---------NMAX,最大步数-----如果(工作(1)。等式.0)然后NMAX=10000ELSE公司NMAX=工作(1)如果(NMAX.LE.0),则写入(6,*)“输入错误(1)=”,IWORK(1)ARRET=。真的。结束IF结束IFC---------KM外推中的最大列数如果(工作(2)。等式.0)然后公里=9ELSE公司KM=网络(2)如果(KM.LE.2),则写入(6,*)“CURIOUS INPUT IWORK(2)=”,IWORK(2)ARRET=。真的。结束IF结束IFC---------NSEQU步长序列的选择NSEQU=工程(3)如果(工作(3)。等式0和。IOUT。LE.1)NSEQU=1如果(IWORK(3)。等式0和。IOUT。通用电气2)NSEQU=4如果(NSEQU.LE.0.或.NSEQU.GE.6),则写入(6,*)“CURIOUS INPUT IWORK(3)=”,IWORK(3)ARRET=。真的。结束IF如果(NSEQU.LE.3.和.IOUT.GE.2),则写入(6,*)“IWORK(3)与IOUT不兼容”ARRET=。真的。如果结束C---------用于稳定性检查的MSTAB参数如果(工作(4)。等式.0)然后MSTAB=1ELSE公司MSTAB=工作(4)结束IFC---------用于稳定性检查的JSTAB参数如果(工作(5)。等式.0)然后JSTAB=2ELSE公司JSTAB=工程(5)结束IFC---------用于密集输出中误差估计的IDERR参数如果(工作(6)。方程0),则IF(IOUT.LE.1)IDERR=1如果(IOUT.GE.2)IDERR=0ELSE公司IDERR=工程(6)如果(IOUT.LE.1)那么写入(6,*)“密集输出中的误差估计”,&'不可能,错误的IWORK(6)=',IWORK(6)ARRET=。真的。结束IF结束IFC---------穆迪如果(工作(7)。等式.0)然后MUDIF=4ELSE公司MUDIF=工作(7)如果(MUDIF.LE.0.或.MUDIF.GE.7),则写入(6,*)“输入错误(7)=”,IWORK(7)ARRET=。真的。结束IF结束IFC---------密集输出分量的NRDENS数NRDENS=工程(8)如果(NRDENS.LT.0.或.NRDENS.GT.N),则写入(6,*)“CURIOUS INPUT IWORK(8)=”,IWORK(8)ARRET=。真的。结束IF如果(NRDENS.EQ.N),则DO 17 I=1,n个17网络(20+I)=I结束IFC---------圈数最小,满足1.D0+UROUND>1.D0如果(工作(1)。等式.0.D0)然后圆=2.3D-16ELSE公司UROUND=工程(1)如果(圆形LE.1.D-35.或圆形GE.1.D0),则写下(6,*)“你有哪台机器?你的UROUND是:“&,工程(1)ARRET=。真的。结束IF结束IFC---------最大步长如果(工作(2)。等式.0.D0)然后HMAX=XEND-XELSE公司HMAX=ABS(工程(2))结束IFC---------台阶尺寸缩减系数如果(工作(3)。等式.0.D0)然后安全系数3=0.5D0ELSE公司安全3=工作(3)如果(SAFE3.LE.UROUND.或SAFE3.GE.1.D0),则写入(6,*)“CURIOUS INPUT WORK(3)=”,作品(3)ARRET=。真的。结束IF结束IFC---------用于步长选择的FAC1、FAC2参数如果(工作(4)。等式.0.D0)然后FAC1=0.02D0ELSE公司FAC1=工程(4)结束IF如果(工作(5)。等式.0.D0)然后FAC2=4.0D0ELSE公司FAC2=工程(5)结束IFC---------订单选择的FAC3、FAC4参数IF(工程(6)。方程0.D0),则FAC3=0.8D0ELSE公司FAC3=工程(6)结束IF如果(工作(7)。等式.0.D0)然后FAC4=0.9D0ELSE公司FAC4=工程(7)结束IFC-------台阶尺寸预测的SAFE1、SAFE2安全系数如果(工作(8)。等式.0.D0)然后安全系数1=0.65D0ELSE公司安全1=工作(8)结束IFIF(工程(9)。方程0.D0),则安全系数2=0.94D0ELSE公司安全2=工作(9)结束IFC-------为工作中的阵列准备入口点-----LFSAFE=2*KM*KM+KMIEDY=21IEYH1=IEDY+NIEYH2=IEYH1+NIEDZ=IEYH2+NIESCAL=IEDZ+NIET=IESCAL+NIEFS=IET+KM*NIEYS=IEFS+LFSAFE*NRDENSIEHH=IEYS+KM*NRDENSIEW=IEHH+公里IEA=IEW+KMIEFAC=IEA+KMC-------总储存要求-----------IECO=IEFAC+2*KM伊斯托雷=IECO+(2*KM+5)*NRDENS-1如果(ISTORE.GT.LWORK)那么写入(6,*)“工作存储不足,最小LWORK=”,ISTOREARRET=。真的。结束IFC-------集成工作空间的入口点-----ICOM=21IENJ=ICOM+NRDENSC---------总要求---------------IEIP=IENJ+KMISTORE=IEIP+KM+1-1如果(ISTORE.GT.LIWORK)那么写入(6,*)“INSUFF”。网络存储,MIN.LIWORK=',ISTOREARRET=。真的。结束IFC-------当失败发生时,我们返回IDID=-1如果(ARRET)THENIDID=-1返回结束IFC---------调用核心积分器------------NRD=最大值(1,NRDENS)NCOM=最大值(1,(2*KM+5)*NRDENS)致电ODXCOR(N、FCN、X、Y、XEND、HMAX、H、RTOL、ATOL、ITOL、KM、,&SOLOUT、IOUT、IDID、NMAX、UROUND、WORK(IEDY)、WORK(IEYH1)、,&工程(IEYH2)、工程(IEDZ)、工程,&工作(IEYS)、工作(IET)、工作,&工程(IECO)、NCOM、IWORK(ICOM)、,&IWORK(IENJ)、IWORK(IEIP)、NSEQU、MSTAB、JSTAB、LFSAFE、,&SAFE1、SAFE2、SAFE3、FAC1、FAC2、FAC3、FAC4、IDERR、WORK(IEFAC)、,&MUDIF、NRD、RPAR、IPAR、NFCN、NSTEP、NACCPT、NREJCT)IWORK(17)=全国有色人种协进会网络(18)=NSTEP网络(19)=NACCPT网络(20)=NREJCTC-----------返回-----------返回结束C类C类C类C------。。。这是核心集成器----------C类子程序ODXCOR(N、FCN、X、Y、XEND、HMAX、H、RTOL、ATOL、ITOL、KM、,&SOLOUT、IOUT、IDID、NMAX、UROUND、DY、YH1、YH2、DZ、SCAL、FSAFE、,&YSAFE、T、HH、W、A、DENS、NCOM、ICOMP、NJ、IPOINT、NSEQU、MSTAB、JSTAB、,&LFSAFE、SAFE1、SAFE2、SAFE3、FAC1、FAC2、FAC3、FAC4、IDERR、ERRFAC、,&MUDIF、NRD、RPAR、IPAR、NFCN、NSTEP、NACCPT、NREJCT)C----------------------------------------------------------ODEX的C核积分器C参数与添加了工作空间的ODEX中的参数相同C----------------------------------------------------------C声明C----------------------------------------------------------隐式双精度(A-H,O-Z)隐式整数(I-N)逻辑拒绝,最后,ATOV外部FCN尺寸Y(N)、DY(N尺寸T(KM,N)、NJ(KM)、HH(KM尺寸FSAFE(LFSAFE,NRD)、YSAFE(KM,NRD尺寸ERRFAC(2*KM)、RPAR(*)、IPAR(*)、DENS(NCOM)、ICOMP(NRD)COMMON/CONODX/XOLDD、HHH、KMITC--定义步长序列如果(NSEQU.EQ.1)那么DO 1 I=1,公里1新泽西州(I)=2*I结束IF如果(NSEQU.EQ.2)那么新泽西(1)=2DO 2 I=2,公里2新泽西州(I)=4*I-4结束IF如果(NSEQU.EQ.3)那么新泽西(1)=2NJ(2)=4新泽西(3)=6DO 11 I=4,公里11新泽西(I)=2*新泽西(I-2)结束IF如果(NSEQU.EQ.4)那么DO 3 I=1,公里3新泽西州(I)=4*I-2结束IF如果(NSEQU.EQ.5)那么DO 6 I=1,公里6新泽西州(I)=4*I结束IFC--为订单选择定义A(I)A(1)=1.D0+NJ(1)DO 4 I=2,公里4a(I)=A(I-1)+NJ(I)C--初始缩放DO 8 I=1,N如果(ITOL.EQ.0),则SCAL(I)=ATOL(1)+RTOL(1)*ABS(Y(I))ELSE公司刻度(I)=ATOL(I)+RTOL(I)*ABS(Y(I))结束IF8继续C--初始准备POSNEG=标志(1.D0,XEND-X)K=最大值(2,最小值(KM-1,INT(-LOG10(RTOL(1)+1.0D-40)*0.6D0+1.5D0))HMAX=ABS(HMAX)H=最大值(ABS(H),1.D-4)H=位置*最小值(H,HMAX,ABS(XEND-X)/2.D0)如果(IOUT.GE.1),则如果(IOUT.GE.2)那么IPOINT(1)=0DO 5 I=1,公里NJADD=4*I-2IF(新泽西州(I)。GT.NJADD)NJADD=NJADD+15 IPOINT(I+1)=IPOINT(I)+NJADDDO 9 MU=1,KM*2误差=平方米(MU/(MU+4.D0))*0.5D0产品=1.D0/(MU+4.D0)**2DO 7 J=1,MU7产品=产品*错误x/J9 ERRFAC(MU)=产品IPT=0结束IFIRTRN=0XOLD=X呼叫解决(NACCPT+1、XOLD、X、Y、N、DENS、NCON、ICOMP、NRD,&RPAR、IPAR、IRTRN)如果(IRTRN.LT.0)转到130结束IF错误=0.D0ERROLD=1.D10HOPTDE=POSNEG*HMAXW(1)=0.D0拒绝=。错误。最后=。错误。10 ATOV=。错误。C-下一步是否到达XEND?IF(0.1D0*ABS(XEND-X)。拉丁美洲。ABS(X)*UROUND)转到110H=位置*最小值(ABS(H)、ABS(XEND-X)、HMAX、ABS(HOPTDE))IF((X+1.01D0*H-XEND)*位置。GT.0.D0)然后H=XEND-X最后=。真的。结束IF如果(NSTEP.EQ.0.或.IOUT.NE.2),请致电FCN(N、X、Y、DZ、RPAR、IPAR)NFCN=NFCN+1C——第一步和最后一步如果(NSTEP.EQ.0.或.LAST),则IPT=0NSTEP=NSTEP+1DO 20 J=1,KKC=J呼叫MIDEX(J,X,Y,H,HMAX,N,FCN,DY,YH1,YH2,DZ,T,NJ,HH,W,1个错误,FAC,A,SAFE1,UROUND,FAC1,FAC2,SAFE2,SCAL,ATOV,SAFE3,2拒绝、KM、RTOL、ATOL、ITOL、MSTAB、JSTAB、ERROLD、FSAFE、LFSAFE,3 IOUT、IPT、YSAFE、ICOMP、NRD、RPAR、IPAR、NFCN)如果(ATOV)转到1020如果(J.GT.1.和错误LE.1.D0)转到60转到55结束IFC--基本集成步骤30继续IPT=0NSTEP=NSTEP+1如果(NSTEP.GE.NMAX)转至120KC=K-1DO 40 J=1,KC调用MIDEX(J,X,Y,H,HMAX,N,FCN,DY,YH1,YH2,DZ,T,NJ,HH,W,1 ERR、FAC、A、SAFE1、UROUND、FAC1、FAC2、SAFE2、SCAL、ATOV、SAFE3、,2拒绝、KM、RTOL、ATOL、ITOL、MSTAB、JSTAB、ERROLD、FSAFE、LFSAFE,3 IOUT、IPT、YSAFE、ICOMP、NRD、RPAR、IPAR、NFCN)如果(ATOV)转到1040继续C--汇流监控器如果(K.EQ.2.或拒绝)转到50如果(错误代码1.D0),转到60如果(错误GT.((NJ(K+1)*NJ(K))/4.D0)**2)转到10050继续呼叫MIDEX(K,X,Y,H,HMAX,N,FCN,DY,YH1,YH2,DZ,T,NJ,HH,W,1 ERR、FAC、A、SAFE1、UROUND、FAC1、FAC2、SAFE2、SCAL、ATOV、SAFE3、,2拒绝,KM,RTOL,ATOL,ITOL,MSTAB,JSTAB,ERROLD,FSAFE,LFSAFE,3 IOUT、IPT、YSAFE、ICOMP、NRD、RPAR、IPAR、NFCN)如果(ATOV)转到10KC=K如果(错误代码1.D0),转到60C-线K+1收敛的希望55继续如果(错误GT.(NJ(K+1)/2.D0)**2)转到100KC=K+1呼叫MIDEX(KC、X、Y、H、HMAX、N、FCN、DY、YH1、YH2、DZ、T、NJ、HH、W、,1 ERR、FAC、A、SAFE1、UROUND、FAC1、FAC2、SAFE2、SCAL、ATOV、SAFE3、,2拒绝、KM、RTOL、ATOL、ITOL、MSTAB、JSTAB、ERROLD、FSAFE、LFSAFE,3 IOUT、IPT、YSAFE、ICOMP、NRD、RPAR、IPAR、NFCN)如果(ATOV)转到10如果(错误GT.1.D0)转至100C--步骤被接受60 XOLD=XX=X+H如果(IOUT.GE.2)那么C--KMIT=论文数量KMIT=2*KC-MUDIF+1DO 69 I=1,NRD69 DENS(I)=Y(ICOMP(I))XOLDD=XOLDHHH=高DO 76 I=1,NRD76 DENS(NRD+I)=H*DZ(ICOMP(I))KLN=2*NRDDO 176 I=1,NRD176 DENS(KLN+I)=T(1,主标志(I))C--中点的计算机解----DO 473 J=2,KCDBLENJ=新泽西州(J)DO 473 L=J,2,-1系数=(DBLENJ/NJ(L-1))**2-1.D0DO 473 I=1,NRDYSAFE(L-1,I)=YSAFE473继续KRN=4*NRDDO 474 I=1,NRD474 DENS(KRN+I)=YSAFE(1,I)C--计算右端的一阶导数----DO 478 I=1,N478 YH1(I)=T(1,I)呼叫FCN(N、X、YH1、YH2、RPAR、IPAR)KRN=3*NRDDO 274 I=1,NRD274 DENS(KRN+I)=YH2(ICOMP(I))*HC——回路---DO 180 KMI=1,KMITC——计算中点处的第i个KMI导数----KBEG=(KMI+1)/2DO 375 KK=KBEG、KCFACNJ=(新泽西州(KK)/2.D0)**(KMI-1)IPT=IPOINT(KK+1)-2*KK+KMIDO 371 I=1,NRD371 YSAFE(KK,I)=FSAFE(IPT,I)*FACNJ375继续DO 373 J=KBEG+1,KCDBLENJ=新泽西州(J)DO 373 L=J,KBEG+1,-1系数=(DBLENJ/NJ(L-1))**2-1.D0DO 373 I=1,NRDYSAFE(L-1,I)=YSAFE(L,I)+(YSAFE(L,I)-YSAFE(L-1,I))/因子373继续KRN=(KMI+4)*NRDDO 374 I=1,NRD374 DENS(KRN+I)=YSAFE(KBEG,I)*H如果(KMI.EQ.KMIT)转到180C--计算机差异DO 66 KK=(KMI+2)/2,KCLBEG=IPOINT(KK+1)贷款=IPOINT(KK)+KMI+1如果(KMI.EQ.1.和.NSEQU.EQ.4)贷款=贷款+2DO 64 L=LBEG,长度,-2DO 64 I=1,NRD64 FSAFE(L,I)=FSAFE(L,I)-FSAFE(L-2,I)如果(KMI.EQ.1.和.NSEQU.EQ.4),则L=长度-2DO 65 I=1,NRD65 FSAFE(L,I)=FSAFE结束IF66继续C--计算机差异DO 166 KK=(KMI+2)/2,KCLBEG=IPOINT(KK+1)-1贷款=IPOINT(KK)+KMI+2DO 164 L=LBEG,长度,-2DO 164 I=1,NRD164 FSAFE(L,I)=FSAFE(L,I)-FSAFE(L-2,I)166继续180继续呼叫INTERP(NRD、DENS、KMIT)C--插值误差估计如果(IDERR.EQ.0.和.KMIT.GE.1),则误差=0.D0DO 187 I=1,NRD187 ERRINT=ERRINT+(DENS((KMIT+4)*NRD+I)/SCAL(ICOMP(I)))**2ERRINT=平方米(ERRINT/NRD)*ERRFAC(KMIT)HOPTDE=H/MAX((误差)**(1.D0/(KMIT+4)),0.01D0)如果(错误GT.10.D0)则H=霍普特X=异或NREJCT=NREJCT+1拒绝=。真的。转到10结束IF结束IFDO 189 I=1,N189 DZ(I)=YH2(I)结束IFDO 70 I=1,N70 Y(I)=T(1,I)NACCPT=NACCPT+1如果(IOUT.GE.1)那么呼叫解决(NACCPT+1、XOLD、X、Y、N、DENS、NCOM、ICOMP、NRD,&RPAR、IPAR、IRTRN)如果(IRTRN.LT.0)转到130结束IFC--计算最佳顺序如果(KC.EQ.2),则KOPT=最小值(3,KM-1)如果(拒绝)KOPT=2转到80结束IF如果(KC.LE.K)那么KOPT=KCIF(W(KC-1)。LT.W(KC)*FAC3)KOPT=KC-1如果(W(KC)。LT.W(KC-1)*FAC4)KOPT=最小值(KC+1,KM-1)ELSE公司KOPT=KC-1IF(KC.GT.3.和.W(KC-2))。LT.W(KC-1)*FAC3)KOPT=KC-2IF(W(KC)。LT.W(KOPT)*FAC4)KOPT=最小值(KC,KM-1)结束IFC--拒绝步骤后80如果(拒绝)那么K=最小值(KOPT,KC)H=位置*最小值(ABS(H),ABS(HH(K)))拒绝=。错误。转到10结束IFC--计算下一步的步长如果(KOPT.LE.KC)那么H=HH(KOPT)ELSE公司IF(KC.LT.K.AND.W(KC))。LT.W(KC-1)*FAC4)然后H=HH(KC)*A(KOPT+1)/A(KCELSE公司H=HH(KC)*A(KOPT)/A(KC结束IF结束IFK=KOPTH=POSNEG*ABS(H)转到10C--步骤被拒绝100继续K=最小值(K、KC、KM-1)IF(K.GT.2.和.W(K-1)。LT.W(K)*FAC3)K=K-1NREJCT=NREJCT+1H=位置*HH(K)拒绝=。真的。转到30C--溶液出口110继续IDID=1返回C--被SOLOUT中断130继续IDID=2返回C--故障退出120写入(6979)X,H979格式('EXIT OF ODEX AT X=',D14.7,'H=',D14.7)IDID=-1返回结束C类子程序MIDEX(J,X,Y,H,HMAX,N,FCN,DY,YH1,YH2,DZ,T,NJ,HH,W,1 ERR、FAC、A、SAFE1、UROUND、FAC1、FAC2、SAFE2、SCAL、ATOV、SAFE3、,2拒绝、KM、RTOL、ATOL、ITOL、MSTAB、JSTAB、ERROLD、FSAFE、LFSAFE,3 IOUT、IPT、YSAFE、ICOMP、NRD、RPAR、IPAR、NFCN)C-此子例程计算C--外推表并提供估计值C——最佳步长隐式双精度(A-H,O-Z)隐式整数(I-N)逻辑拒绝,ATOV尺寸Y(N)、DY(N尺寸T(KM,N)、NJ(KM)、HH(KM尺寸FSAFE(LFSAFE,NRD)、YSAFE(KM,NRD外部FCNHJ=H/NJ(J)C--欧拉启动步骤DO 30 I=1,NYH1(I)=Y(I)30 YH2(I)=Y(I)+HJ*DZ(I)C--显式中点规则M=新泽西(J)-1NJMID=NJ(J)/2DO 35 MM=1,M如果(IOUT.GE.2.和.MM.EQ.NJMID),则DO 31 I=1,NRD31 YSAFE(J,I)=YH2(ICOMP(I))结束IF呼叫FCN(N,X+HJ*MM,YH2,DY,RPAR,IPAR)IF(IOUT.GE.2.和.ABS(MM-NJMID)。LE.2*J-1)然后IPT=IPT+1DO 32 I=1,NRD32 FSAFE(IPT,I)=DY(ICOMP(I))结束IFDO 34 I=1,NYS=YH1(I)YH1(I)=YH2(I34 YH2(I)=YS+2.D0*HJ*DY(I)如果(MM.LE.MSTAB.和J.LE.JSTAB),则c-稳定性检查DEL1=0.D0DO 21 I=1,N21 DEL1=DEL1+(DZ(I)/SCAL(I))**2DEL2=0.D0DO 26 I=1,N26 DEL2=DEL2+((DY(I)-DZ(I))/SCAL(I)报价=DEL2/MAX(UROUND,DEL1)如果(引用GT.4.D0),则NFCN=NFCN+1转到79结束IF结束IF35继续C--最后的平滑步骤调用FCN(N,X+H,YH2,DY,RPAR,IPAR)如果(IOUT.GE.2.和.NJMID.LE.2*J-1),则IPT=IPT+1DO 39 I=1,NRD39 FSAFE(IPT,I)=DY(ICOMP(I))结束IFDO 40 I=1,N40吨(J,I)=(YH1(I)+YH2(I”)+HJ*DY(I))/2.D0NFCN=NFCN+新泽西州(J)C--多项式外推IF(J.EQ.1)返回DBLENJ=新泽西州(J)DO 60 L=J,2,-1FAC=(DBLENJ/NJ(L-1))**2-1.D0DO 60 I=1,NT(L-1、I)=T(L、I)+(T(L,I)-T(L-1,I))/FAC60继续错误=0.D0C--缩放DO 65 I=1,NT1I=最大值(ABS(Y(I)),ABS(T(1,I)))如果(ITOL.EQ.0),则SCAL(I)=ATOL(1)+RTOL(1)*T1IELSE公司SCAL(I)=环礁(I)+RTOL(I)*T1I结束IF65错误=错误+((T(1,I)-T(2,I))/SCAL(I))**2ERR=平方根(ERR/N)如果(ERR*UROUND.GE.1.D0)转到79如果(J.GT.2.和.ERR.GE.ERROLD)转到79ERROLD=最大值(4*ERR,1.D0)C--计算最佳步长世博会=1.D0/(2*J-1)FACMIN=FAC1**展会FAC=最小值(FAC2/FACMIN,最大值(FACMIN,(ERR/SAFE1)**EXPO/SAFE2))FAC=1.D0/FACHH(J)=最小值(ABS(H)*FAC,HMAX)W(J)=A(J)/HH(J)返回79 ATOV=。真的。H=H*安全3拒绝=。真的。返回结束C类子程序接口(N、Y、IMIT)C-计算插值公式的系数隐式双精度(A-H,O-Z)隐式整数(I-N)尺寸Y(N*(IMIT+5)),A(0:30)C--从HERMITE插值开始DO 100 I=1,NY0=Y(I)Y1=Y(2*N+I)YP0=Y(N+I)YP1=Y(3*N+I)YDIFF=Y1-Y0ASPL=-YP1+YDIFFBSPL=YP0-YDIFFY(N+I)=YDIFFY(2*N+I)=ASPLY(3*N+I)=BSPL如果(IMIT.LT.0)转到100C-计算HERMITE在中点的导数PH0=(Y0+Y1)*0.5D0+0.125D0*(ASPL+BSPL)PH1=YDIFF+(ASPL-BSPL)*0.25D0PH2=-(YP0-YP1)PH3=6.D0*(BSPL-ASPL)C--计算进一步的系数如果(IMIT.LT.1)转到20A(1)=16.D0*(Y(5*N+I)-PH1)如果(IMIT.LT.3)转到20A(3)=16.D0*(Y(7*N+I)-PH3+3*A(1))如果(IMIT.LT.5)转到20DO 10 IM=5,IMIT,2FAC1=IM*(IM-1)/2.D0FAC2=FAC1*(IM-2)*(IM-3)*2.D010A(IM)=16.D0*(Y(IM+4)*N+I)+FAC1*A(IM-2)-FAC2*A(IM-4))20继续A(0)=(Y(4*N+I)-PH0)*16.D0如果(IMIT.LT.2)转到60A(2)=(Y(N*6+I)-PH2+A(0))*16.D0如果(IMIT.LT.4)转到60DO 30 IM=4,IMIT,2FAC1=IM*(IM-1)/2.D0FAC2=IM*(IM-1)*(IM-2)*(IM-3)30 A(IM)=(Y(N*(IM+4)+I)+A(IM-2)*FAC1-A(IM-4)*FAC2)*16.D060继续DO 70 IM=0,IMIT70 Y(N*(IM+4)+I)=A(IM)100继续返回结束C类功能控制(II、X、Y、NCON、ICOMP、N)C类----------------------------------------------------------C此功能可用于连续输出C与ODEX的输出子例程。它提供了C近似于X处解的II-TH分量。C类----------------------------------------------------------隐式双精度(A-H,O-Z)隐式整数(I-N)尺寸Y(NCON),图标(N)COMMON/CONODX/XOLD、H、IMITC------计算II-TH组件的位置I=0DO 5 J=1,NIF(ICOMP(J))。等式II)I=J5继续如果(I.EQ.0)那么写入(6,*)“压缩机无密集输出”,返回结束IFC----计算插值THETA=(X-XOLD)/小时THETA1=1.D0-THETA(泰塔)phthat=Y(I)+θ*(Y(N+I)+θ1*(Y(2*N+I)*θ+Y(3*N+I)*θ1))如果(IMIT.LT.0),则CONTEX=菲特返回结束IFTHETAH=THETA-0.5D0CONTEX=Y(N*(IMIT+4)+I)DO 70 IM=IMIT,1,-170 CONTEX=Y(N*(IM+3)+I)+CONTEX*THETAH/IMCONTEX=PHTHET+(THETA*THETA1)**2*CONTEX返回结束