Mercurial > repos > public > sbplib
view +time/Rungekutta.m @ 931:384ca2331a12 feature/timesteppers
Make Rungekutta class allow for discrete data.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Mon, 03 Dec 2018 16:26:44 -0800 |
parents | 679f4ddd982f |
children | 3860dad28239 |
line wrap: on
line source
classdef Rungekutta < time.Timestepper properties F % RHS of the ODE dt % Time step t % Time point v % Solution vector n % Time level scheme % The scheme used for the time stepping, e.g rk4, rk6 etc. coeffs % Butcher tableau coefficients V % All stage approximations in most recent time step K % All stage rates in most recent time step end methods % Timesteps v_t = F(v,t), using the specified RK method from t = t0 with % timestep dt and initial conditions v = v0 function obj = Rungekutta(F, dt, t0, v0, method, discreteData) default_arg('method',"rk4"); default_arg('discreteData', []); obj.F = F; obj.dt = dt; obj.t = t0; obj.v = v0; obj.n = 0; % Extract the coefficients for the specified method % used for the RK updates from the Butcher tableua. [s,a,b,c] = time.rk.butcherTableau(method); obj.coeffs = struct('s',s,'a',a,'b',b,'c',c); if isempty(discreteData) % TODO: method "rk4" is also implemented in the butcher tableau, but the rungekutta_4.m implementation % might be slightly more efficient. Need to do some profiling before deciding whether or not to keep it. if (method == "rk4") obj.scheme = @(v,t,dt,F,n) time.rk.rungekutta_4(v ,t, dt, F); else obj.scheme = @(v,t,dt,F,n) time.rk.rungekutta(v, t, dt, F, obj.coeffs); end else obj.scheme = @(v,t,dt,F,n) time.rk.rungekuttaDiscreteData(v, t, dt, F, obj.coeffs, discreteData, n); end end % v: Current solution % t: Current time % V: All stage approximations in most recent time step % K: All stage rates in most recent time step % T: Time points (corresponding to V and K) in most recent time step function [v,t,V,T,K] = getV(obj) v = obj.v; t = obj.t; V = obj.V; K = obj.K; T = obj.t + obj.dt*obj.coeffs.b; end function obj = step(obj) [obj.v, obj.V, obj.K] = obj.scheme(obj.v, obj.t, obj.dt, obj.F, obj.n); obj.t = obj.t + obj.dt; obj.n = obj.n + 1; end end end