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