function VTB10_1(a,b,dt,len,n,func) %VTB10_1 VTB10_1(xr,dxr,dt,len,n,func) plots the phase plane of the % second order single variable differential equation given % by func. The variable 'func' is the name of the 'm' file % which gives yields the second time derivative of the variable % 'x' given 'x' and the first time derivative of 'x'. For % example, see the example file vdp.m which is used to plot % the phase plane of the Van der Pol equation. The equation % must be in element by element form (i.e. './' instead of '/') % since it will be sent multiple values of position and % velocity simultaneously in matrix form. % INPUT ARGUMENTS: % xr : The range and step size of starting points for x. % i.e. [-3:.1:3] to start from x values from -3 to 3 by % step sizes of .1. % dxr : The range and step size of starting points for the % velocity. % dt : Step size of time for calculation of time derivatives. % Recommended step size is on the order of 1e-6 times % the total range for x. The smaller, the more accurate % the plot. % len : Length of line drawn at each time step. The smaller, % the more accurate. However, 1e-2 time the total range % for x should give quite good results for simple phase % plots. % n : Number of time steps to be taken. More time steps % must be taken to truly see the phase portrait. % More also take more time linearly. % func: The name of the function which yields the second time % derivative of x given x and the first time derivative % of x. It must accept only the inputs x and the % derivative of x and in that order. See the function % 'VTB10_ex.m' % % Example: Enter the command % VTB10_1([-3:1.5:3],[-3:1.5:3],.0001,.04,100,'VTB10_ex') % Joseph C. Slater, April 19, 1992 % % % nzero=0; clg [x,xd]=meshdom(a,b); s=size(x); axis('square') axis([x(1,1) x(1,s(2)) xd(s(2),1) xd(1,1)]); plot(x(1,1),xd(1,1)) hold on range=max(a)-min(a); for k=1:n x2=xd*dt+x; xdd=feval(func,x,xd); xd2=xd+xdd*dt; l=((x2-x).^2+(xd2-xd).^2).^.5; x2=(x2-x)./(l+1e-10*range)*len+x; xd2=(xd2-xd)./(l+1e-10*range)*len+xd; for i=1:s(1) for j=1:s(2) if xd(i,j)==0 & xdd(i,j)==0 if exist('zlog')==0 xx=num2str(x(i,j)); xxd=num2str(xd(i,j)); text1=['The point (' xx ',' xxd ') has a zero']; text2=[' first and second derivative.']; text1=[text1 text2]; plot(x(i,j),xd(i,j),'o') disp(text1) nzero=nzero+1; zlog(nzero,1:2)=[x(i,j) xd(i,j)]; else for ij=0:nzero-1 if ~(x(i,j)==zlog(ij+1,1) & xd(i,j)==zlog(ij+1,2)) xx=num2str(x(i,j)); xxd=num2str(xd(i,j)); text1=['The point (' xx ',' xxd ') has a zero']; text2=[' first and second derivative.']; text1=[text1 text2]; disp(text1) nzero=nzero+1; zlog(nzero,1:2)=[x(i,j) xd(i,j)]; end end end end plot([x(i,j) x2(i,j)],[xd(i,j) xd2(i,j)]) end end x=x2; xd=xd2; end hold off