user_defined_method

PURPOSE ^

function to define own Runge-Kutta-methods or linear-multistep-methods

SYNOPSIS ^

function [SETTINGS]=user_defined_method(SETTINGS)

DESCRIPTION ^

 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 Jäkel (University of Technology Dresden)
          o Daniel Klawitter (University of Technology Dresden)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [SETTINGS]=user_defined_method(SETTINGS)
0002 % function to define own Runge-Kutta-methods or linear-multistep-methods
0003 %
0004 % input:   o SETTINGS....struct with information for the ivp_solve function
0005 %
0006 % output:  o SETTINGS....now with the new informations about the user
0007 %                        defined method
0008 %
0009 % notes:
0010 %
0011 % authors: o Christian Jäkel (University of Technology Dresden)
0012 %          o Daniel Klawitter (University of Technology Dresden)
0013 
0014 
0015 SETTINGS.calculate_region_of_stability = 1;
0016 
0017 kind_of_method=questdlg('Runge-Kutta-Method or  Multistep Method?', ...
0018     'Kind OF Method', ...
0019     'RKM', 'MSM','RKM');
0020 % RESULT_USER_DEFINED_METHOD.method=kind_of_method;
0021 switch kind_of_method,
0022     case 'RKM'
0023         SETTINGS.isRKV = 1;
0024         SETTINGS.method='eigenesRKV';
0025         
0026         if exist('data\default_value_stufen.mat','file')
0027             load data\default_value_stufen.mat
0028             defAns={num2str(stufen)};
0029         else
0030             defAns={''};
0031         end
0032         
0033         get_input=inputdlg('How many stages has the RKM?','',1,defAns);  % Abfrage der Sutfenzahl
0034         stufen=str2num(get_input{1});
0035         
0036         save data\default_value_stufen.mat stufen
0037         
0038         if exist('data\default_value.mat','file')   % existieren Defaultwerte?
0039             load data\default_value.mat             % wenn ja lade diese
0040             if length(defAns_B)~=stufen        % stimmt die stufen zahl überein?
0041                 delete default_value.mat       % wenn nicht dann lösche die Defaultwerte und setze alles auf 1
0042                 clear defAns_B defAns_a defans_c
0043                 for i=1:stufen
0044                     defAns_B(i,1:stufen)=ones(1,stufen);
0045                 end
0046                 defAns_c=ones(1,stufen);
0047                 defAns_a=ones(1,stufen);
0048             end
0049         else  % ansonsten wird alles auf 1 gesetzt
0050             for i=1:stufen
0051                 defAns_B(i,1:stufen)=ones(1,stufen);
0052             end
0053             defAns_c=ones(1,stufen);
0054             defAns_a=ones(1,stufen);
0055         end
0056         
0057         
0058         
0059         get_input = inputdlg('Enter the bottom vector of the Butcher-Tableau','',[1],{num2str(defAns_c)});
0060         SETTINGS.c = str2num(get_input{1});
0061         
0062         test1=1;
0063         while test1==1  % test ob die summe eins ergibt
0064             
0065             if sum(SETTINGS.c)~=1 % falls nicht frage nach aenderung
0066                 aenderung = questdlg('The sum of this values is not equal to 1.', ...
0067                     '', ...
0068                     'continue', 'change','continue');
0069                 switch aenderung
0070                     
0071                     case 'continue'
0072                         test1=0; % verlassen der Testschleife
0073                         
0074                     case 'change' % falls eine aenderung gewünscht ist noch mal eingeben
0075                         defAns_c=SETTINGS.c;  % Defaultwerte neu setzen
0076                         get_input=inputdlg('Enter the bottom vector of the Butcher-Tableau','',[1],{num2str(defAns_c)});
0077                         SETTINGS.c=str2num(get_input{1});
0078                 end
0079             else
0080                 test1=0; % verlassen der Testschleife falls alles ok ist
0081             end
0082             
0083         end
0084         
0085         get_input=inputdlg('Enter the left side vector of the Butcher-Tableau ','',[1],{num2str(defAns_a)});
0086         SETTINGS.a=str2num(get_input{1});
0087         
0088         
0089         for i=1:stufen   % die Kommentare fuer die jeweilige Zeile erzeugen
0090             promt{i}=['Enter row number ',num2str(i),' of the methods matrix'];
0091             defAns_cell{i}=num2str(defAns_B(i,1:stufen));
0092         end
0093         
0094         get_input=inputdlg(promt,'matrix',1,defAns_cell);
0095         
0096         for i=1:stufen % die Eingabe auslesen
0097             SETTINGS.B(i,1:stufen)=str2num(get_input{i});
0098         end
0099         
0100         test2=1;
0101         while test2==1  % Test ob die Zeilensumme dem Eintrag in der linken Seite entspricht
0102             
0103             logic_val=(sum(SETTINGS.B')==SETTINGS.a); % wenn hier ueberall 1 steht ist alles ok
0104             
0105             if  sum(logic_val)~=stufen % falls nicht frage nach aenderung
0106                 aenderung=questdlg('The sum of some rows is not equal to the corresponding entry of the left hand side vector.', ...
0107                     '', ...
0108                     'continue', 'change','continue');
0109                 switch aenderung
0110                     
0111                     case 'continue'
0112                         test2=0; %verlassen der Testschleife
0113                         
0114                     case 'change' % falls eine aenderung gewünscht ist noch mal eingeben
0115                         for i=1:stufen % damit beim ersten mal Aufrufen die vorher eingetippten Werte angezeigt werden
0116                             defAns_cell{i}=num2str(SETTINGS.B(i,1:stufen));
0117                         end
0118                         
0119                         for i=1:stufen % den Kommentar fuer die zu aendernden Zeilen anpassen
0120                             if sum(SETTINGS.B(i,1:stufen))~=SETTINGS.a(i)
0121                                 promt{i}=['The sum of this row should be ',num2str(SETTINGS.a(i))];
0122                             else
0123                                 promt{i}=['This row is ok'];
0124                             end
0125                         end
0126                         
0127                         get_input=inputdlg(promt,'matrix',1,defAns_cell); %neue Eingabe
0128                         
0129                         for i=1:stufen  % die Eingabe auslesen
0130                             SETTINGS.B(i,1:stufen)=str2num(get_input{i});
0131                         end
0132                         
0133                         defAns_B=SETTINGS.B; % Defaultwerte an die neue Eingabe anpassen
0134                         
0135                 end
0136             else
0137                 test2=0;  %verlassen der Testschleife falls alles ok ist
0138             end
0139             
0140         end
0141         
0142         
0143         
0144         defAns_B=SETTINGS.B;
0145         defAns_c=SETTINGS.c;
0146         defAns_a=SETTINGS.a;
0147         
0148         save data\default_value.mat defAns_B defAns_c defAns_a
0149         
0150         
0151     case 'MSM'
0152         SETTINGS.isRKV = 0;
0153         SETTINGS.method='eigenesMSV';
0154         
0155         if exist('data\default_value_stufen.mat','file')
0156             load data\default_value_stufen.mat
0157             defAns={num2str(stufen)};
0158         else
0159             defAns={''};
0160         end
0161         
0162         
0163         get_input=inputdlg('How many stages has the MSM?','',1,defAns);
0164         stufen=str2num(get_input{1});
0165         
0166         save data\default_value_stufen.mat stufen
0167         
0168         stufen=stufen+1;
0169         
0170         if exist('data\default_value_msv.mat','file')   % existieren default Werte?
0171             load data\default_value_msv.mat             % wenn ja lade diese
0172             if length(defAns_sigma)~=stufen        % stimmt die stufen zahl überein?
0173                 delete default_value_msv.mat           % wenn nicht dann lösche die Defaultwerte und setze alles auf 1
0174                 clear defAans_sigma defAns_rho
0175                 defAns_sigma=ones(1,stufen);
0176                 defAns_rho=ones(1,stufen);
0177             end
0178         else
0179             defAns_sigma=ones(1,stufen);
0180             defAns_rho=ones(1,stufen);
0181         end
0182         
0183         get_input=inputdlg('Enter the coefficients from the left side','',[1],{num2str(defAns_rho)});
0184         SETTINGS.rho=str2num(get_input{1});
0185         
0186         test1=1;
0187         while test1==1  % test ob die Summe Null ergibt
0188             
0189             if sum(SETTINGS.rho)~=0 % falls nicht frage nach aenderung
0190                 aenderung=questdlg('The sum of this values is not equal to 0.', ...
0191                     '', ...
0192                     'continue', 'change','continue');
0193                 switch aenderung
0194                     
0195                     case 'continue'
0196                         test1=0; % verlassen der Testschleife
0197                         
0198                     case 'change' % falls eine aenderung gewünscht ist noch mal eingeben
0199                         defAns_rho=SETTINGS.rho;  % Defaultwerte neu setzen
0200                         get_input=inputdlg('Please enter again','',[1],{num2str(defAns_rho)});
0201                         SETTINGS.rho=str2num(get_input{1});
0202                 end
0203             else
0204                 test1=0; % verlassen der Testschleife falls alles ok ist
0205             end
0206             
0207         end
0208         
0209         get_input=inputdlg('Enter the coefficients from the right side','',[1],{num2str(defAns_sigma)});
0210         SETTINGS.sigma=str2num(get_input{1});
0211         
0212         defAns_sigma=SETTINGS.sigma;
0213         defAns_rho=SETTINGS.rho;
0214         
0215         save data\default_value_msv.mat defAns_sigma defAns_rho
0216         
0217 end
0218 end

Generated on Wed 01-Jul-2009 16:09:39 by m2html © 2003