Code covered by the BSD License  

Highlights from
Program to Solve initial value problems by various methods

image thumbnail
from Program to Solve initial value problems by various methods by Daniel Klawitter
initial value problem solver enter >>IVPsolve to start

[SETTINGS]=user_defined_method(SETTINGS)
function [SETTINGS]=user_defined_method(SETTINGS)
% function to define own Runge-Kutta-methods or linear-multistep-methods
%
% input:   o SETTINGS....struct with information for the ivp_solve function
%
% output:  o SETTINGS....now with the new informations about the user
%                        defined method
%
% notes:   
%
% authors: o Christian Jkel (University of Technology Dresden)
%          o Daniel Klawitter (University of Technology Dresden)


SETTINGS.calculate_region_of_stability = 1;

kind_of_method=questdlg('Runge-Kutta-Method or  Multistep Method?', ...
    'Kind OF Method', ...
    'RKM', 'MSM','RKM');
% RESULT_USER_DEFINED_METHOD.method=kind_of_method;
switch kind_of_method,
    case 'RKM'
        SETTINGS.isRKV = 1;
        SETTINGS.method='eigenesRKV';
        
        if exist('data\default_value_stufen.mat','file')
            load data\default_value_stufen.mat
            defAns={num2str(stufen)};
        else
            defAns={''};
        end
        
        get_input=inputdlg('How many stages has the RKM?','',1,defAns);  % Abfrage der Sutfenzahl
        stufen=str2num(get_input{1});
        
        save data\default_value_stufen.mat stufen
        
        if exist('data\default_value.mat','file')   % existieren Defaultwerte?
            load data\default_value.mat             % wenn ja lade diese
            if length(defAns_B)~=stufen        % stimmt die stufen zahl berein?
                delete default_value.mat       % wenn nicht dann lsche die Defaultwerte und setze alles auf 1
                clear defAns_B defAns_a defans_c
                for i=1:stufen
                    defAns_B(i,1:stufen)=ones(1,stufen);
                end
                defAns_c=ones(1,stufen);
                defAns_a=ones(1,stufen);
            end
        else  % ansonsten wird alles auf 1 gesetzt
            for i=1:stufen
                defAns_B(i,1:stufen)=ones(1,stufen);
            end
            defAns_c=ones(1,stufen);
            defAns_a=ones(1,stufen);
        end
        
        
        
        get_input = inputdlg('Enter the bottom vector of the Butcher-Tableau','',[1],{num2str(defAns_c)});
        SETTINGS.c = str2num(get_input{1});
        
        test1=1;
        while test1==1  % test ob die summe eins ergibt
            
            if sum(SETTINGS.c)~=1 % falls nicht frage nach aenderung
                aenderung = questdlg('The sum of this values is not equal to 1.', ...
                    '', ...
                    'continue', 'change','continue');
                switch aenderung
                    
                    case 'continue'
                        test1=0; % verlassen der Testschleife
                        
                    case 'change' % falls eine aenderung gewnscht ist noch mal eingeben
                        defAns_c=SETTINGS.c;  % Defaultwerte neu setzen
                        get_input=inputdlg('Enter the bottom vector of the Butcher-Tableau','',[1],{num2str(defAns_c)});
                        SETTINGS.c=str2num(get_input{1});
                end
            else
                test1=0; % verlassen der Testschleife falls alles ok ist
            end
            
        end
        
        get_input=inputdlg('Enter the left side vector of the Butcher-Tableau ','',[1],{num2str(defAns_a)});
        SETTINGS.a=str2num(get_input{1});
        
        
        for i=1:stufen   % die Kommentare fuer die jeweilige Zeile erzeugen
            promt{i}=['Enter row number ',num2str(i),' of the methods matrix'];
            defAns_cell{i}=num2str(defAns_B(i,1:stufen));
        end
        
        get_input=inputdlg(promt,'matrix',1,defAns_cell);
        
        for i=1:stufen % die Eingabe auslesen
            SETTINGS.B(i,1:stufen)=str2num(get_input{i});
        end
        
        test2=1;
        while test2==1  % Test ob die Zeilensumme dem Eintrag in der linken Seite entspricht
            
            logic_val=(sum(SETTINGS.B')==SETTINGS.a); % wenn hier ueberall 1 steht ist alles ok
            
            if  sum(logic_val)~=stufen % falls nicht frage nach aenderung
                aenderung=questdlg('The sum of some rows is not equal to the corresponding entry of the left hand side vector.', ...
                    '', ...
                    'continue', 'change','continue');
                switch aenderung
                    
                    case 'continue'
                        test2=0; %verlassen der Testschleife
                        
                    case 'change' % falls eine aenderung gewnscht ist noch mal eingeben
                        for i=1:stufen % damit beim ersten mal Aufrufen die vorher eingetippten Werte angezeigt werden
                            defAns_cell{i}=num2str(SETTINGS.B(i,1:stufen));
                        end
                        
                        for i=1:stufen % den Kommentar fuer die zu aendernden Zeilen anpassen
                            if sum(SETTINGS.B(i,1:stufen))~=SETTINGS.a(i)
                                promt{i}=['The sum of this row should be ',num2str(SETTINGS.a(i))];
                            else
                                promt{i}=['This row is ok'];
                            end
                        end
                        
                        get_input=inputdlg(promt,'matrix',1,defAns_cell); %neue Eingabe
                        
                        for i=1:stufen  % die Eingabe auslesen
                            SETTINGS.B(i,1:stufen)=str2num(get_input{i});
                        end
                        
                        defAns_B=SETTINGS.B; % Defaultwerte an die neue Eingabe anpassen
                        
                end
            else
                test2=0;  %verlassen der Testschleife falls alles ok ist
            end
            
        end
        
        
        
        defAns_B=SETTINGS.B;
        defAns_c=SETTINGS.c;
        defAns_a=SETTINGS.a;
        
        save data\default_value.mat defAns_B defAns_c defAns_a
        
        
    case 'MSM'
        SETTINGS.isRKV = 0;
        SETTINGS.method='eigenesMSV';
        
        if exist('data\default_value_stufen.mat','file')
            load data\default_value_stufen.mat
            defAns={num2str(stufen)};
        else
            defAns={''};
        end
        
        
        get_input=inputdlg('How many stages has the MSM?','',1,defAns);
        stufen=str2num(get_input{1});
        
        save data\default_value_stufen.mat stufen
        
        stufen=stufen+1;
        
        if exist('data\default_value_msv.mat','file')   % existieren default Werte?
            load data\default_value_msv.mat             % wenn ja lade diese
            if length(defAns_sigma)~=stufen        % stimmt die stufen zahl berein?
                delete default_value_msv.mat           % wenn nicht dann lsche die Defaultwerte und setze alles auf 1
                clear defAans_sigma defAns_rho
                defAns_sigma=ones(1,stufen);
                defAns_rho=ones(1,stufen);
            end
        else
            defAns_sigma=ones(1,stufen);
            defAns_rho=ones(1,stufen);
        end
        
        get_input=inputdlg('Enter the coefficients from the left side','',[1],{num2str(defAns_rho)});
        SETTINGS.rho=str2num(get_input{1});
        
        test1=1;
        while test1==1  % test ob die Summe Null ergibt
            
            if sum(SETTINGS.rho)~=0 % falls nicht frage nach aenderung
                aenderung=questdlg('The sum of this values is not equal to 0.', ...
                    '', ...
                    'continue', 'change','continue');
                switch aenderung
                    
                    case 'continue'
                        test1=0; % verlassen der Testschleife
                        
                    case 'change' % falls eine aenderung gewnscht ist noch mal eingeben
                        defAns_rho=SETTINGS.rho;  % Defaultwerte neu setzen
                        get_input=inputdlg('Please enter again','',[1],{num2str(defAns_rho)});
                        SETTINGS.rho=str2num(get_input{1});
                end
            else
                test1=0; % verlassen der Testschleife falls alles ok ist
            end
            
        end
        
        get_input=inputdlg('Enter the coefficients from the right side','',[1],{num2str(defAns_sigma)});
        SETTINGS.sigma=str2num(get_input{1});
        
        defAns_sigma=SETTINGS.sigma;
        defAns_rho=SETTINGS.rho;
        
        save data\default_value_msv.mat defAns_sigma defAns_rho
        
end
end

Contact us at files@mathworks.com