⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oderk6.m

📁 FEM tools for caculation of nonlinear problems
💻 M
字号:
function [time, y_sol] = odeRK6( dydt, time, y0, u, epps )

global LK

if nargin < 4
    error(' Not enough input arguments.  See odeRK6 ');
end

 warning off;
 pts    = length(time);
 n      = length(y0);
 y_sol  = zeros(pts,3*LK); 

 y0 = y0(:);  
 y_sol(1,1:n) = y0';
 y_old = y0;


 a1=0;  a2 = 1/5;    a3 = 3/10;  a4 = 3/5;   a5 = 1;     a6 = 7/8; 
 b21= 1/5;
 b31= 3/40;   b32= 9/40;
 b41= 3/10;   b42=-9/10;  b43= 6/5;
 b51= -11/54; b52=5/2;    b53=-70/27; b54= 35/27;
 b61= 1631/55296; b62= 175/512; b63=575/13824; b64=44275/110592; b65= 253/4096;
 
 for p = 2:pts
     passit = 0;
     t      = time(p);
     dt     = t - time(p-1);
     t0     = t - dt; TT0    = t0;
     YOLD   = y_old;
     hmin = dt/100000;
     
     DTT = dt;
     stN = 1;                       
     goOUT = 0;

     u0   = u(:,p-1);              
     dudt = (u(:,p)-u0)/dt;        
     
     while passit==0   

           
         k1 = feval( dydt, t0 + DTT*a1, y_old, u0+dudt*(t0+DTT*a1-t0) );
         k2 = feval( dydt, t0 + DTT*a2, y_old + k1*DTT*b21, u0+dudt*(t0+DTT*a2-t0) );
         k3 = feval( dydt, t0 + DTT*a3, y_old + k1*DTT*b31 + k2*DTT*b32, u0+dudt*(t0+DTT*a3-t0) );
         k4 = feval( dydt, t0 + DTT*a4, y_old + k1*DTT*b41 + k2*DTT*b42 + k3*DTT*b43, u0+dudt*(t0+DTT*a4-t0) );
         k5 = feval( dydt, t0 + DTT*a5, y_old + k1*DTT*b51 + k2*DTT*b52 + k3*DTT*b53 + k4*DTT*b54, u0+dudt*(t0+DTT*a5-t0)  );
         k6 = feval( dydt, t0 + DTT*a6, y_old + k1*DTT*b61 + k2*DTT*b62 + k3*DTT*b63 + k4*DTT*b64 + k5*DTT*b65, u0+dudt*(t0+DTT*a6-t0) );


           y_n5   = y_old + ( k1*37/378 + k3*250/621 + k4*125/594 + k6*512/1771 )*DTT;
           y_n4   = y_old + ( k1*2825/27648 + k3*18575/48384 + k4*13525/55296 + k5*277/14336 + k6*1/4 )*DTT;
           EE = y_n5 - y_n4;

           wish_eps = y_n5.*epps;  
           if EE == 0 EE=wish_eps; end; 

           stN = stN - 1;          

           y_old = y_n5;
           t0 = t0 + DTT;

           if goOUT==1
               if stN==0
                   disp(['   ---  step OK  ---             ' num2str(p) ]); 
                   passit = 1; 
               end;
           else
               if stN==0
                   step_INC = (max(abs(wish_eps./EE) ))^0.2 ; 
                   if step_INC == 0   step_INC=1;   end;
                   if isnan(step_INC) step_INC=1; end
                   step_INC = 1*step_INC; 
                   DTT=1.00*DTT*step_INC; t0 = TT0; y_old = YOLD; stN=ceil(dt/DTT); DTT=dt/stN;
                   if DTT<hmin 
                       error(['integration step is smaller than min -- ' num2str(hmin) ]);
                   end;
                   if isnan(stN)>=1 
                       error('  integration is not possible -- NaN --  may be too stiff');
                   end
                   if stN==0 passit = 1; end
                   disp(['   steps: ' num2str(stN)]); 
                   goOUT = 1;   
               end;
           end;


       end;

        y_sol(p,1:n) = y_old';
   end
warning on;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -