function varargout = ode_solver(varargin)
% ODE_SOLVER provides a graphical user interface to solve ODE
% system
% GUI-mode using:
% data=ode_solver;
% batch (no-GUI) mode using:
% data=ode_solver(Fx,agnv,awnv,init,time,tr_time,solver,addit_param)
% Parameters:
% Fx - cell array of right-side equations
% agnv, awnv - cell arrays with additive Gaussian and additive white noise variances.
% init - cell array of initial conditions
% time - a vector specifying the interval of integration
% tr_time - a vector specifying the interval of preliminary integration
% solver - solver type:
% 1 - ode45;
% 2 - ode23;
% 3 - ode113;
% 4 - ode15s;
% 5 - ode23s;
% 6 - ode23t;
% 7 - ode23tb;
% addit_param - additional parameters (as string)
%
% data - solution matrix, first column - solution time, other columns - solution array
%
% Examples:
% data=ode_solver({'0.032*x1+0.5*x2-x3' 'x1-0.1*x2-x1^3' '0.1*x1'},{'0' '0' '0'},{'0' '0' '0'},{'0.01' '-0.01' '-0.02'},'[0:0.02:50]','[-10 0]',1,'');
% See also ODE
% author: Max Logunov, lab432@mail.ru, comments welcome
% This program is a part of Lab432 software for nonlinear analysis of time
% series
% Last Modified by GUIDE v2.5 05-Jan-2005 13:36:16
% last modified 8.12.05
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @ode_solver_OpeningFcn, ...
'gui_OutputFcn', @ode_solver_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before discrete_map_generator is made visible.
function ode_solver_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to discrete_map_generator (see VARARGIN)
% Choose default command line output for discrete_map_generator
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
handles.auto=0;
try
N=length(varargin{1});
x={};
for i=1:N
x{i}=['dx' num2str(i) '/dt'];
end
set(handles.x,'string',x);
set(handles.f,'string',varargin{1});
set(handles.agnv,'string',varargin{2});
set(handles.annv,'string',varargin{3});
set(handles.init,'string',varargin{4});
set(handles.edit_length,'string',varargin{5});
set(handles.tr_time,'string',varargin{6});
set(handles.solver,'value',varargin{7});
set(handles.addit_param,'string',varargin{8});
catch
end
if length(varargin)==8 % batch mode OK
handles.auto=1;
end
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = ode_solver_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
global csgDATA
if nargout
if handles.auto
ok_Callback(handles.ok, [], handles);
varargout{1} =csgDATA;
else
uiwait;
varargout{1} =csgDATA;
end
else
warning('Require output argument then call ode_solver');
end
try
close(handles.figure);
catch
end
% --- Executes on button press in ok.
function ok_Callback(hObject, eventdata, handles)
% hObject handle to ok (see GCBO)
% handles structure with handles and user data (see GUIDATA)
global csgDATA
clear tmp_sys
csgDATA=[];
x=get(handles.x,'string');
init=get(handles.init,'string');
f=get(handles.f,'string');
if isempty(x)
msgbox('No data for system');
return
end
s = which('ode_solver');
[pathstr,name,ext,versn] = fileparts(s);
init_str='';
for i=1:length(x)
init_str=[init_str init{i} ' '];
end
init_str=['[' init_str(1:end-1) ']'];
fid = fopen([pathstr '/tmp_sys.m'],'w');
fprintf(fid,'function Y=tmp_sys(t,X); \n');
fprintf(fid,'Y=zeros(%s,1); \n',num2str(length(x)));
for i=1:length(x)
fprintf(fid,'%s=X(%i); \n',['x' num2str(i)],i);
end
for i=1:length(x)
fprintf(fid,'Y(%s)=%s; \n',num2str(i),f{i});
end
fclose(fid);
clear fid
solvers=get(handles.solver,'string');
if ~isempty(get(handles.tr_time,'string'))
if ~isempty(get(handles.addit_param,'string'))
[T,Y]=eval([solvers{get(handles.solver,'value')} '(@tmp_sys,' get(handles.tr_time,'string') ',' init_str ',odeset(' get(handles.addit_param,'string') '))']);
else
[T,Y]=eval([solvers{get(handles.solver,'value')} '(@tmp_sys,' get(handles.tr_time,'string') ',' init_str ')']);
end
clear tmp_sys;
init_str='';
for i=1:length(x)
init_str=[init_str num2str(Y(end,i)) ' '];
end
init_str=['[' init_str(1:end-1) ']'];
end
if ~isempty(get(handles.addit_param,'string'))
[T,Y]=eval([solvers{get(handles.solver,'value')} '(@tmp_sys,' get(handles.edit_length,'string') ',' init_str ',odeset(' get(handles.addit_param,'string') '))']);
else
[T,Y]=eval([solvers{get(handles.solver,'value')} '(@tmp_sys,' get(handles.edit_length,'string') ',' init_str ')']);
end
clear tmp_sys;
agnv=get(handles.agnv,'string');
annv=get(handles.annv,'string');
g_n=randn(size(Y));
n_n=rand(size(Y));
for i=1:length(x)
g_n(:,i)=g_n(:,i)*str2num(agnv{i})^0.5;
n_n(:,i)=(n_n(:,i)-mean(n_n(:,i)))/(var(n_n(:,i)))^.5*str2num(annv{i})^0.5;
end
Y=Y+g_n+n_n;
csgDATA=[T Y];
uiresume;
% --- Executes on button press in cancel.
function cancel_Callback(hObject, eventdata, handles)
% hObject handle to cancel (see GCBO)
% handles structure with handles and user data (see GUIDATA)
close(handles.figure);
% --- Executes during object creation, after setting all properties.
function edit_length_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit_length (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function edit_length_Callback(hObject, eventdata, handles)
% hObject handle to edit_length (see GCBO)
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in load.
function load_Callback(hObject, eventdata, handles)
% hObject handle to load (see GCBO)
% handles structure with handles and user data (see GUIDATA)
[file,path] = uigetfile2('*.mat','Load System');
if file~=0
try
S=load([path file]);
set([handles.x handles.f handles.init handles.annv handles.agnv],'value',1);
set(handles.x,'string',S.sys.dx);
set(handles.f,'string',S.sys.f);
set(handles.agnv,'string',S.sys.agnv);
set(handles.annv,'string',S.sys.annv);
set(handles.init,'string',S.sys.init);
set(handles.edit_info,'string',S.sys.info);
set(handles.tr_time,'string',S.sys.tr_time);
set(handles.edit_length,'string',S.sys.time);
set(handles.addit_param,'string',S.sys.addit_param);
str=get(handles.solver,'string');
for i=1:length(str)
if strcmp(str{i},S.sys.solver)
set(handles.solver,'value',i);
break
end
end
catch
errordlg('Wrong file format','File error');
end
end
% --- Executes on button press in save.
function save_Callback(hObject, eventdata, handles)
% hObject handle to save (see GCBO)
% handles structure with handles and user data (see GUIDATA)
[file,path] = uiputfile('*.mat','Save System As');
if file~=0
sys.dx=get(handles.x,'string');
sys.f=get(handles.f,'string');
sys.agnv=get(handles.agnv,'string');
sys.annv=get(handles.annv,'string');
sys.init=get(handles.init,'string');
sys.info=get(handles.edit_info,'string');
sys.tr_time=get(handles.tr_time,'string');
sys.time=get(handles.edit_length,'string');
str=get(handles.solver,'string');
sys.solver=str{get(handles.solver,'value')};
sys.addit_param=get(handles.addit_param,'string');
save([path file],'sys');
end
% --- Executes during object creation, after setting all properties.
function edit_info_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit_info (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function edit_info_Callback(hObject, eventdata, handles)
% hObject handle to edit_info (see GCBO)
% handles structure with handles and user data (see GUIDATA)
% --- Executes during object creation, after setting all properties.
function x_CreateFcn(hObject, eventdata, handles)
% hObject handle to x (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes on selection change in x.
function x_Callback(hObject, eventdata, handles)
% hObject handle to x (see GCBO)
% handles structure with handles and user data (see GUIDATA)
set([handles.x handles.f handles.agnv handles.annv handles.init],'value',get(hObject,'Value'));
% --- Executes during object creation, after setting all properties.
function f_CreateFcn(hObject, eventdata, handles)
% hObject handle to f (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes during object creation, after setting all properties.
function agnv_CreateFcn(hObject, eventdata, handles)
% hObject handle to agnv (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes during object creation, after setting all properties.
function annv_CreateFcn(hObject, eventdata, handles)
% hObject handle to annv (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes during object creation, after setting all properties.
function init_CreateFcn(hObject, eventdata, handles)
% hObject handle to init (see GCBO)
% handles empty - handles not created until after all CreateFcns called
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes on button press in add.
function add_Callback(hObject, eventdata, handles)
% hObject handle to add (see GCBO)
% handles structure with handles and user data (see GUIDATA)
N=length(get(handles.x,'string'));
x={};
for i=1:N
x{i}=['dx' num2str(i) '/dt'];
end
set(handles.x,'string',x);
prompt = {['Enter equation dx' num2str(N+1) '/dt=...'],...
'Enter additive Gaussian noise variance:',...
'Enter additve white noise variance:',...
'Enter initial condition:'};
dlg_title = 'Add new equation';
num_lines= 1;
def = {'','0','0','0.5'};
answer = inputdlg(prompt,dlg_title,num_lines,def);
if ~isempty(answer)
x=get(handles.x,'string');
f=get(handles.f,'string');
agnv=get(handles.agnv,'string');
annv=get(handles.annv,'string');
init=get(handles.init,'string');
x{N+1}=['dx' num2str(N+1) '/dt'];
f{N+1}=answer{1};
agnv{N+1}=answer{2};
annv{N+1}=answer{3};
init{N+1}=answer{4};
set([handles.x, handles.f, handles.agnv, handles.annv, handles.init],'value',N+1);
set(handles.x,'string',x);
set(handles.f,'string',f);
set(handles.agnv,'string',agnv);
set(handles.annv,'string',annv);
set(handles.init,'string',init);
end
% --- Executes on button press in modify.
function modify_Callback(hObject, eventdata, handles)
% hObject handle to modify (see GCBO)
% handles structure with handles and user data (see GUIDATA)
x=get(handles.x,'string');
f=get(handles.f,'string');
agnv=get(handles.agnv,'string');
annv=get(handles.annv,'string');
init=get(handles.init,'string');
selection=get(handles.x,'value');
if isempty(x)
x{1}='dx1/dt'; f{1}=''; agnv{1}='0'; annv{1}='0'; init{1}='0.7';
end
prompt = {['Enter equation ' x{selection} '=...'],...
'Enter additive Gaussian noise variance:',...
'Enter additve white noise variance:',...
'Enter initial condition:'};
dlg_title = 'Modify equation';
num_lines= 1;
def = {f{selection},agnv{selection},annv{selection},init{selection}};
answer = inputdlg(prompt,dlg_title,num_lines,def);
if ~isempty(answer)
f{selection}=answer{1};
agnv{selection}=answer{2};
annv{selection}=answer{3};
init{selection}=answer{4};
set(handles.x,'string',x);
set(handles.f,'string',f);
set(handles.agnv,'string',agnv);
set(handles.annv,'string',annv);
set(handles.init,'string',init);
end
% --- Executes on button press in delete.
function delete_Callback(hObject, eventdata, handles)
% hObject handle to delete (see GCBO)
% handles structure with handles and user data (see GUIDATA)
x=get(handles.x,'string');
f=get(handles.f,'string');
agnv=get(handles.agnv,'string');
annv=get(handles.annv,'string');
init=get(handles.init,'string');
selection=get(handles.x,'value');
if isempty(x)
return
end
n_f={}; n_agnv={};n_annv={}; n_init={}; n_x={};
k=1;
for i=1:length(x)
if i~=selection
n_f{k}=f{i};
n_agnv{k}=agnv{i};
n_annv{k}=annv{i};
n_init{k}=init{i};
n_x{k}=x{i};
k=k+1;
end
end
set([handles.x, handles.f, handles.agnv, handles.annv, handles.init],'value',max([1 selection-1]));
set(handles.x,'string',n_x);
set(handles.f,'string',n_f);
set(handles.agnv,'string',n_agnv);
set(handles.annv,'string',n_annv);
set(handles.init,'string',n_init);
% --- Executes during object creation, after setting all properties.
function solver_CreateFcn(hObject, eventdata, handles)
% hObject handle to solver (see GCBO)
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
set(hObject,'string',{'ode45' 'ode23' 'ode113' 'ode15s' 'ode23s' 'ode23t' 'ode23tb'});
% --- Executes on selection change in solver.
function solver_Callback(hObject, eventdata, handles)
% hObject handle to solver (see GCBO)
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns solver contents as cell array
% contents{get(hObject,'Value')} returns selected item from solver
% --- Executes during object creation, after setting all properties.
function addit_param_CreateFcn(hObject, eventdata, handles)
% hObject handle to addit_param (see GCBO)
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function addit_param_Callback(hObject, eventdata, handles)
% hObject handle to addit_param (see GCBO)
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of addit_param as text
% str2double(get(hObject,'String')) returns contents of addit_param as a double
% --- Executes during object creation, after setting all properties.
function tr_time_CreateFcn(hObject, eventdata, handles)
% hObject handle to tr_time (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function tr_time_Callback(hObject, eventdata, handles)
% hObject handle to tr_time (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of tr_time as text
% str2double(get(hObject,'String')) returns contents of tr_time as a double