Generated Code

The following is matlab code generated by the CellML API from this CellML file. (Back to language selection)

The raw code is available.

function [VOI, STATES, ALGEBRAIC, CONSTANTS] = mainFunction()
    % This is the "main function".  In Matlab, things work best if you rename this function to match the filename.
   [VOI, STATES, ALGEBRAIC, CONSTANTS] = solveModel();
end

function [algebraicVariableCount] = getAlgebraicVariableCount() 
    % Used later when setting a global variable with the number of algebraic variables.
    % Note: This is not the "main method".  
    algebraicVariableCount =3;
end
% There are a total of 1 entries in each of the rate and state variable arrays.
% There are a total of 7 entries in the constant variable array.
%

function [VOI, STATES, ALGEBRAIC, CONSTANTS] = solveModel()
    % Create ALGEBRAIC of correct size
    global algebraicVariableCount;  algebraicVariableCount = getAlgebraicVariableCount();
    % Initialise constants and state variables
    [INIT_STATES, CONSTANTS] = initConsts;

    % Set timespan to solve over 
    tspan = [0, 10];

    % Set numerical accuracy options for ODE solver
    options = odeset('RelTol', 1e-06, 'AbsTol', 1e-06, 'MaxStep', 1);

    % Solve model with ODE solver
    [VOI, STATES] = ode15s(@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS), tspan, INIT_STATES, options);

    % Compute algebraic variables
    [RATES, ALGEBRAIC] = computeRates(VOI, STATES, CONSTANTS);
    ALGEBRAIC = computeAlgebraic(ALGEBRAIC, CONSTANTS, STATES, VOI);

    % Plot state variables against variable of integration
    [LEGEND_STATES, LEGEND_ALGEBRAIC, LEGEND_VOI, LEGEND_CONSTANTS] = createLegends();
    figure();
    plot(VOI, STATES);
    xlabel(LEGEND_VOI);
    l = legend(LEGEND_STATES);
    set(l,'Interpreter','none');
end

function [LEGEND_STATES, LEGEND_ALGEBRAIC, LEGEND_VOI, LEGEND_CONSTANTS] = createLegends()
    LEGEND_STATES = ''; LEGEND_ALGEBRAIC = ''; LEGEND_VOI = ''; LEGEND_CONSTANTS = '';
    LEGEND_VOI = strpad('x in component main (dimensionless)');
    LEGEND_ALGEBRAIC(:,1) = strpad('sin in component sin (dimensionless)');
    LEGEND_STATES(:,1) = strpad('sin in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,1) = strpad('deriv_approx_initial_value in component main (dimensionless)');
    LEGEND_ALGEBRAIC(:,3) = strpad('sin in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,3) = strpad('k2_oPi in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,4) = strpad('k2Pi in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,5) = strpad('kPi_2 in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,6) = strpad('kPi in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,7) = strpad('kPi_32 in component sin (dimensionless)');
    LEGEND_ALGEBRAIC(:,2) = strpad('z in component sin (dimensionless)');
    LEGEND_CONSTANTS(:,2) = strpad('C in component sin (dimensionless)');
    LEGEND_RATES(:,1) = strpad('d/dt sin in component sin (dimensionless)');
    LEGEND_STATES  = LEGEND_STATES';
    LEGEND_ALGEBRAIC = LEGEND_ALGEBRAIC';
    LEGEND_RATES = LEGEND_RATES';
    LEGEND_CONSTANTS = LEGEND_CONSTANTS';
end

function [STATES, CONSTANTS] = initConsts()
    VOI = 0; CONSTANTS = []; STATES = []; ALGEBRAIC = [];
    CONSTANTS(:,1) = 0;
    CONSTANTS(:,2) = 0.75;
    CONSTANTS(:,3) = 2.00000./ pi;
    CONSTANTS(:,4) =  2.00000.* pi;
    CONSTANTS(:,5) =  pi./2.00000;
    CONSTANTS(:,6) =  pi;
    CONSTANTS(:,7) = ( 3.00000.* pi)./2.00000;
    STATES(:,1) = CONSTANTS(:,1);
    if (isempty(STATES)), warning('Initial values for states not set');, end
end

function [RATES, ALGEBRAIC] = computeRates(VOI, STATES, CONSTANTS)
    global algebraicVariableCount;
    statesSize = size(STATES);
    statesColumnCount = statesSize(2);
    if ( statesColumnCount == 1)
        STATES = STATES';
        ALGEBRAIC = zeros(1, algebraicVariableCount);
    else
        statesRowCount = statesSize(1);
        ALGEBRAIC = zeros(statesRowCount, algebraicVariableCount);
        RATES = zeros(statesRowCount, statesColumnCount);
    end
    RATES(:,1) = cos(VOI);
   RATES = RATES';
end

% Calculate algebraic variables
function ALGEBRAIC = computeAlgebraic(ALGEBRAIC, CONSTANTS, STATES, VOI)
    ALGEBRAIC(:,1) =  sin(VOI);
    ALGEBRAIC(:,2) = piecewise({VOI<CONSTANTS(:,5),  VOI.*CONSTANTS(:,3) - 0.500000 , VOI<CONSTANTS(:,6),  ( pi - VOI).*CONSTANTS(:,3) - 0.500000 , VOI<CONSTANTS(:,7),  (VOI -  pi).*CONSTANTS(:,3) - 0.500000 },  (CONSTANTS(:,4) - VOI).*CONSTANTS(:,3) - 0.500000);
    ALGEBRAIC(:,3) = piecewise({VOI<CONSTANTS(:,5),  - ( ALGEBRAIC(:,2).*ALGEBRAIC(:,2))+CONSTANTS(:,2)+ALGEBRAIC(:,2) , VOI<CONSTANTS(:,6),  - ( ALGEBRAIC(:,2).*ALGEBRAIC(:,2))+CONSTANTS(:,2)+ALGEBRAIC(:,2) , VOI<CONSTANTS(:,7), ( ALGEBRAIC(:,2).*ALGEBRAIC(:,2) - CONSTANTS(:,2)) - ALGEBRAIC(:,2) }, ( ALGEBRAIC(:,2).*ALGEBRAIC(:,2) - CONSTANTS(:,2)) - ALGEBRAIC(:,2));
end

% Compute result of a piecewise function
function x = piecewise(cases, default)
    set = [0];
    for i = 1:2:length(cases)
        if (length(cases{i+1}) == 1)
            x(cases{i} & ~set,:) = cases{i+1};
        else
            x(cases{i} & ~set,:) = cases{i+1}(cases{i} & ~set);
        end
        set = set | cases{i};
        if(set), break, end
    end
    if (length(default) == 1)
        x(~set,:) = default;
    else
        x(~set,:) = default(~set);
    end
end

% Pad out or shorten strings to a set length
function strout = strpad(strin)
    req_length = 160;
    insize = size(strin,2);
    if insize > req_length
        strout = strin(1:req_length);
    else
        strout = [strin, blanks(req_length - insize)];
    end
end

Source
Derived from workspace Approximating Sine Waves at changeset d80ad0e8c5c5.
This exposure was expired.
Collaboration
To begin collaborating on this work, please use your git client and issue this command:
License
The terms of use/license for this work is unspecified.