📄 dfield7.m
字号:
end pstring{kk} = [pname{kk},' = ', tp1str]; end end % Get ready to do some error trapping. SS = warning; warning off XxXxXx = WINvect(1) + rand*(WINvect(2)-WINvect(1)); TtTtTt = WINvect(3) + rand*(WINvect(4)-WINvect(3)); err = 0; % Now we remove the backslashes (\) used to get Greek into the % labels. txname = Xname; ttname = Tname; derivstr(find(abs(derivstr)==92))=[]; Xname(find(abs(Xname)==92))=[]; Tname(find(abs(Tname)==92))=[]; eval([Xname,'=XxXxXx;'],'err = 1;'); if err errmsg = ['"',xstr, '" is not a valid variable name in MATLAB.']; fprintf('\a') errordlg(errmsg,'dfield7 error','on'); warning(SS) return end err = 0; eval([Tname,'=TtTtTt;'],'err = 1;'); if err errmsg = ['"',tstr, '" is not a valid variable name in MATLAB.']; fprintf('\a') errordlg(errmsg,'dfield7 error','on'); warning(SS) return end % Replace the parameters/expressions with their values. pflag = zeros(1,4); perr = []; pnameh = sud.h.pname; pvalh = sud.h.pval; for kk = 1:4; pn = char(get(pnameh(kk),'string')); pn(find(abs(pn)==92))=[]; pv = char(get(pvalh(kk),'string')); if ~isempty(pn) if isempty(pv) perr = pvalh(kk); else if isempty(str2num(pv)) % This is an expression. tpv = pv; tpv(find(abs(tpv)==92))=[]; err = 0; pval = ''; eval(['pval = ',tpv,';'],'err=1;'); %pval; if (err | isempty(pval)) errmsg = ['The expression for ',pn,' is not valid.']; fprintf('\a') errordlg(errmsg,'dfield7 error','on'); warning(SS) return end end xderivstr = dfield7('paraeval',pn,pv,derivstr); if ~strcmp(xderivstr,derivstr) pflag(kk) = 1; derivstr = xderivstr; end end end end % We have to make the derivative strings array smart. l = length(derivstr); for (k=fliplr(find((derivstr=='^')|(derivstr=='*')|(derivstr=='/')))) derivstr = [derivstr(1:k-1) '.' derivstr(k:l)]; l = l+1; end % Some more error trapping. eval(['res = ',derivstr, ';'],'err = 1;'); if err | isempty(res) if isempty(perr) errmsg = ['The differential equation ',... 'is not entered correctly.']; else errstr1 = 'The differential equation does not evaluate correctly.'; errstr2 = 'At least one of the parameter values is not a number.'; errmsg = str2mat(errstr1,errstr2); set(perr,'string','?'); end fprintf('\a') errordlg(errmsg,'dfield7 error','on'); dfield7('restart'); warning(SS); return end warning(SS); % Build a new derivative m-file. tee = clock; tee = ceil(tee(6)*100); dfcn=['dftp',num2str(tee)]; fcnstr = ['function YYyYypr = ',dfcn,'(TtTt,YyYy)\n\n']; commstr = '%%%% Created by dfield7\n\n'; varstr = [Xname,' = YyYy;', Tname,' = TtTt;\n\n']; lenstr = ['l = length(YyYy);\n']; derstr1 = ['YYyYypr = ', derivstr,';\n']; derstr2 = ['if (length(YYyYypr) < l) YYyYypr = YYyYypr*ones(1,l);end\n']; dff = fopen([tempdir,dfcn,'.m'],'w'); fprintf(dff,fcnstr); fprintf(dff,commstr); fprintf(dff,varstr); fprintf(dff,lenstr); fprintf(dff,derstr1); fprintf(dff,derstr2); fclose(dff); % Find dfield7 Display if it exists. % If dfield7 Display exists, update it. If it does not build it. dfdisp = findobj('name','dfield7 Display'); if (~isempty(dfdisp)) figure(dfdisp); dud = get(dfdisp,'user'); dud.syst = sud.c; dud.settings = sud.settings; dfcnn = dud.function; if exist(dfcnn) == 2 delete([tempdir,dfcnn,'.m']) end else dfdisp = figure('name','dfield7 Display',... 'numb','off','interrupt','on',... 'visible','off','tag','dfield7'); dfield7('figdefault',dfdisp); dud = get(dfdisp,'user'); dud.syst = sud.c; dud.settings = sud.settings; fs = dud.fontsize; ssize = dud.ssize; r = ssize/10; dfaxw = 437*1.2; % Default axes width dfaxh = 315*1.2; % Default axes height dfaxl = 45*1.2; % Default axes left buttw = 40*1.2; % Default button width uni = get(0,'units'); set(0,'units','pixels'); ss = get(0,'screensize'); style = sud.style; set(0,'units',uni); nframeh = 70; % Default notice frame height dfaxb = 4+nframeh+35; titleh = 30; bottomedge = 38; dfdh = dfaxh + nframeh + titleh + bottomedge; sw = ss(3);sh = ss(4); bottom = 20; if r*dfdh > sh - bottom -35; r = (sh-bottom-35)/dfdh; fs = 10*r; lw = 0.5*r; set(gcf,'defaultaxesfontsize',fs,'defaultaxeslinewidth',lw); set(gcf,'defaulttextfontsize',fs); set(gcf,'defaultlinelinewidth',lw); set(gcf,'defaultuicontrolfontsize',fs*0.9); end % Set up the bulletin window. nframe = uicontrol('style','frame','visible','on'); nstr = {'More';'than';'five';'lines';'of text'}; dud.notice = uicontrol('style','text',... 'horiz','left',... 'string',nstr,'visible','on'); ext = get(dud.notice,'extent'); nframeh = ext(4)+2; titleh = r*titleh; dfaxl = r*dfaxl; buttw = r*buttw; butth = fs+20*r; dfaxw = r*dfaxw; dfaxh = r*dfaxh; dfaxb = nframeh+r*bottomedge; buttl = dfaxl + dfaxw + 5; buttsep = (dfaxh - butth)/2; % Set up the coordinate display cstr = '(0.9999, 0,9999)'; dud.ccwind = uicontrol('style','text',... 'horiz','left',... 'string',cstr,... 'visible','on'); cext = get(dud.ccwind,'extent'); ccwindtxt = uicontrol('style','text',... 'horiz','left',... 'string','Cursor position: ',... 'visible','on'); cwh = cext(4); cww = cext(3); % Set up the plot axes. dud.axes = axes('units','pix',... 'position',[dfaxl,dfaxb,dfaxw,dfaxh],... 'next','add',... 'box','on',... 'interrupt','on',... 'xgrid','on',... 'ygrid','on',... 'drawmode','fast',... 'visible','off',... 'tag','display axes'); % Finish the positions. dfdw = buttl + buttw +5; dfdh = dfaxb+dfaxh+titleh; set(nframe,'pos',[10,1,dfdw-20,nframeh]); set(dud.notice,'pos',[15,1,dfdw-30,nframeh-2],... 'string',{' ';' ';' ';' ';' '}); ctext = get(ccwindtxt,'extent'); cc1pos = [dfaxl,2+nframeh,ctext(3),cwh]; cc2pos = [dfaxl+ctext(3),2+nframeh,cww,cwh]; set(ccwindtxt,'pos',cc1pos); set(dud.ccwind,'pos',cc2pos,... 'string',''); dfdleft = max((sw-dfdw)/2,sw-dfdw-60); dfdbot = sh - dfdh - 70; dfdpos = [dfdleft,dfdbot,dfdw,dfdh]; set(dfdisp,'resize','on'); set(dfdisp,'pos',dfdpos); Arrflag = sud.fieldtype; % Set up the buttons and the menu. stopstr = 'aud = get(gca,''user'');aud.stop = 4;set(gca,''user'',aud);'; dbutt(1) = uicontrol('style','push',... 'pos',[buttl,dfaxb+2*buttsep,buttw,butth],... 'string','Stop',... 'call',stopstr,... 'vis','off',... 'tag','stop'); dbutt(2) = uicontrol('style','push',... 'pos',[buttl,dfaxb,buttw,butth],... 'string','Quit',... 'call','dfield7(''quit'')',... 'visible','off'); dbutt(3) = uicontrol('style','push',... 'pos',[buttl,dfaxb+buttsep,buttw,butth],... 'string','Print',... 'call','dfield7(''print'')',... 'visible','off'); dud.butt = dbutt; hhsetup = get(0,'showhiddenhandles'); set(0,'showhiddenhandles','on'); % File menu fmenu = findobj(gcf,'label','&File'); delete(findobj(fmenu,'label','&New Figure')); delete(findobj(fmenu,'label','&Open...')); delete(findobj(fmenu,'label','&Close')); set(findobj(fmenu,'label','&Save'),... 'separator','off',... 'pos',1); set(findobj(fmenu,'label','Save &As...'),... 'pos',2); delete(findobj(fmenu,'label','Pre&ferences...')); set(findobj(fmenu,'label','&Export...'),... 'pos',3); set(findobj(fmenu,'label','Pa&ge Setup...'),'pos',4,... 'separator','on'); set(findobj(fmenu,'label','Print Pre&view...'),'pos',5); set(findobj(fmenu,'label','Print Set&up...'),'pos',6); set(findobj(fmenu,'label','&Print...'),'pos',7); merestart = uimenu(fmenu,'label','Restart dfield7','call',... 'dfield7(''restart'')','separator','on','pos',8); mequit = uimenu(fmenu,'label','Quit dfield7',... 'call','dfield7(''quit'')','separator','on'); % Tools menu tmenu = findobj(gcf,'label','&Tools'); delete(tmenu); % Insert menu imenu = findobj(gcf,'label','&Insert'); inschild = get(imenu,'child'); legitem = findobj(inschild,'label','&Legend'); colitem = findobj(inschild,'label','&Colorbar'); delete([legitem,colitem]); % Edit menu emenu = findobj(gcf,'label','&Edit'); menu(2) = uimenu(emenu,'label','Zoom in.',... 'call','dfield7(''zoomin'')',... 'pos',1); zbmenu = uimenu(emenu,'label','Zoom back.',... 'call','dfield7(''zoomback'')',... 'enable','off',... 'tag','zbmenu',... 'pos',2); metext = uimenu(emenu,'label','Enter text on the Display Window.',... 'call','dfield7(''text'')',... 'separator','on',... 'pos',3); medel = uimenu(emenu,'label','Delete a graphics object.',... 'call','dfield7(''delete'')',... 'visible','on',... 'pos',4); medall = uimenu(emenu,'label','Erase all solutions.',... 'call','dfield7(''dallsol'')',... 'separator','off',... 'pos',5); medalllev = uimenu(emenu,'label','Erase all level curves.',... 'call','dfield7(''dalllev'')',... 'separator','off',... 'pos',6); medall = uimenu(emenu,'label','Erase all graphics objects.',... 'call','dfield7(''dall'')',... 'separator','off',... 'pos',7); set(findobj(emenu,'label','&Undo'),'separator','on',... 'pos',8); set(findobj(emenu,'label','Cu&t'),'pos',9); set(findobj(emenu,'label','&Copy'),'pos',10); set(findobj(emenu,'label','&Paste'),'pos',11); set(findobj(emenu,'label','&Select All'),'pos',12); set(findobj(emenu,'label','Copy &Figure'),'pos',13); set(findobj(emenu,'label','Copy &Options'),'pos',14); set(findobj(emenu,'label','F&igure Properties'),'pos',15); set(findobj(emenu,'label','&Axes Properties'),'pos',16); set(findobj(emenu,'label','C&urrent Object Properties'),'pos',17); % Options menu menu(1) = uimenu('label','Options','visible','off','pos',3); menukey = uimenu(menu(1),'label','Keyboard input.','call',... 'dfield7(''kbd'')'); mesev = uimenu(menu(1),'label','Plot several solutions.',... 'call','dfield7(''several'')'); menulevel = uimenu(menu(1),'label','Plot level curves.',... 'call','dfield7(''level'')',... 'separator','off','tag','level'); meexportdata = uimenu(menu(1),'label','Export solution data.',... 'call','dfield7(''export'')',... 'separator','off','tag','dexp'); plcall = [ 'ud = get(gcf,''user'');',... 'me = gcbo;',... 'label = get(me,''label'');',... 'if strcmp(label,''Show the phase line.''),',... ' set(me,''label'',''Hide the phase line.'');',... ' ud.pline = ''on'';',... ' set(ud.plineh,''vis'',''on'');',... ' set(gcf,''user'',ud);',... 'else,',... ' set(me,''label'',''Show the phase line.'');',... ' ud.pline = ''off'';',... ' set(ud.plineh,''vis'',''off'');',... ' kk = find(ishandle(ud.plhand));',... ' delete(ud.plhand(kk));',... ' ud.plhand = [];',... ' set(gcf,''user'',ud);',... 'end']; mepline = uimenu(menu(1),'label','Show the phase line.',... 'call',plcall,'tag','pline','separator','on'); mesolvset = uimenu(menu(1),'label','Solver settings.',... 'call','dfield7(''solvset'')'); mesolve = uimenu(menu(1),'label','Solver.'); solverstr = ['ud = get(gcf,''user'');',... 'me = gcbo;',... 'meud = get(me,''user'');',... 'ud.settings.refine = meud.refine;',... 'ud.settings.tol = meud.tol;',... 'ud.settings.solver = meud.solver;',... 'ud.settings.solvhandle = meud.solvhandle;',... 'ud.settings.stepsize = meud.stepsize;',... 'ud.settings.hmax = meud.hmax;',... 'set(ud.solver,''checked'',''off'');',... 'set(me,''checked'',''on'');',... 'set(gcf,''user'',ud);',... 'dfset = findobj(''name'',''dfield7 Setup'');',... 'sud = get(dfset,''user'');',... 'sud.settings = ud.settings;',... 'set(dfset,''user'',sud);',... 'dfield7(''solvset'');']; solver = dud.settings.solver; dpset.refine = 4; dpset.tol = 1e-6; dpset.solver = 'Dormand-Prince'; dpset.solvhandle = @dfdp45; dpset.stepsize = 0; dpset.hmax = 0; if strcmp(solver,'Dormand-Prince') dpch = 'on'; else dpch = 'off'; end eulset.refine = 1; eulset.tol = 0; eulset.solver = 'Euler'; eulset.solvhandle = @dfeul; eulset.stepsize = 0.1; eulset.hmax = 0; if strcmp(solver,'Euler') eulch = 'on';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -