- %Tegning af sdof oscillator
- clear all;
- %System data
- m=1.0; zeta=0.01; omega0=1.0; Dt=1.0; f0=1.0; x0=0.0; dotx0=0.0;
- xmax=sqrt(x0^2+(dotx0/omega0)^2)+min([0.5*abs(f0)*Dt/(m*omega0) f0/omega0^2]);
- omegad=omega0*sqrt(1-zeta^2); dt0=0.1*pi/omega0; nstep=500;
- a=0.70; b=0.70; r=0.35*a; fact=0.50/xmax;
- xf0=0.5*[0 -a 0 a 0]'; yf0=[0 -b/4 -b/2 -3*b/4 -b]';
- xd1=0.5*[-a -a a a]'; yd1=[-6*b 0 0 -6*b]';
- xd2=0.5*[-0.8*a 0.8*a]'; yd2=[-3*b -3*b]';
- xf0=[xf0; xf0; xf0; xf0; xf0; xf0];
- yf0=[yf0; -b+yf0; -2*b+yf0; -3*b+yf0; -4*b+yf0; -5*b+yf0];
- xf=[0; xf0; 0]; xSQ=[-a 5*a 5*a -a -a]'; ySQ=[0 0 -2*r -2*r 0]';
- xH=[-2000 2000]'; yH=[0 0]'; xx=x0; tt=0;
- set(gcf,'DoubleBuffer','on');
- i=1; t=i*dt0; t0=min([t Dt]); t1=t-t0;
- h=exp(-zeta*omega0*t)*sin(omegad*t)/(m*omegad);
- doth=exp(-zeta*omega0*t)*(cos(omegad*t)-zeta*omega0/omegad*sin(omegad*t))/m;
- H=(1/m-doth-2*zeta*omega0*h)/omega0^2;
- h1=exp(-zeta*omega0*t1)*sin(omegad*t1)/(m*omegad);
- doth1=exp(-zeta*omega0*t1)*(cos(omegad*t1)-zeta*omega0/omegad*sin(omegad*t1))/m;
- H1=(1/m-doth1-2*zeta*omega0*h1)/omega0^2;
- if t>Dt
- t2=t-Dt; h2=exp(-zeta*omega0*t2)*sin(omegad*t2)/(m*omegad);
- doth2=exp(-zeta*omega0*t2)*(cos(omegad*t2)-zeta*omega0/omegad*sin(omegad*t2))/m;
- H2=(1/m-doth2-2*zeta*omega0*h2)/omega0^2;
- else H2=0; end
- x=-f0*H2+f0*(t0/m+h1-h+2*zeta*omega0*(H1-H))/(Dt*omega0^2);
- x=x+exp(-zeta*omega0*t)*(x0*cos(omegad*t)+(dotx0+zeta*omega0*x0)*sin(omegad*t)/omegad);
- tt=[tt; t]; xx=[xx; x]; x=fact*x;
- yf=[0; -2*b+(1+x)*yf0; -6*b+(1+x)*yf0(size(yf0,1))];
- clf; figure(1); subplot(2,1,1); h1=plot(xH,yH,'r'); hold on
- h2=plot(xH,yH-6*b+yf0(size(yf0,1))-r,'k');
- h3=plot(xf,yf,'r'); h4=plot(4*a+xd1,-3*b+yd1,'r');
- h5=plot(4*a*[1 1]',-3*b*[0 1]','r'); hej=yf(size(yf,1));
- h6=plot(4*a+xd2,(-7*b+yf(size(yf,1))-hej)*ones(2,1),'r');
- h7=plot(4*a*[1 1]',[-7*b+yf(size(yf,1))-hej yf(size(yf,1))]','r');
- h8=plot(xSQ,yf(size(yf,1))+ySQ,'r'); hold off
- axis([-2 5 -10*b+(1+fact*x0)*yf0(size(yf0,1))-2*r r]);
- subplot(2,1,2); h9=plot(xH,yH,'k'); hold on;
- h10=plot(tt,-xx,'r'); hold off; axis([ 0 nstep*dt0 -xmax xmax])
- % start loop
- for i=1:nstep
- t=i*dt0; t0=min([t Dt]); t1=t-t0;
- h=exp(-zeta*omega0*t)*sin(omegad*t)/(m*omegad);
- doth=exp(-zeta*omega0*t)*(cos(omegad*t)-zeta*omega0/omegad*sin(omegad*t))/m;
- H=(1/m-doth-2*zeta*omega0*h)/omega0^2;
- h1=exp(-zeta*omega0*t1)*sin(omegad*t1)/(m*omegad);
- doth1=exp(-zeta*omega0*t1)*(cos(omegad*t1)-zeta*omega0/omegad*sin(omegad*t1))/m;
- H1=(1/m-doth1-2*zeta*omega0*h1)/omega0^2;
- if t>Dt
- t2=t-Dt; h2=exp(-zeta*omega0*t2)*sin(omegad*t2)/(m*omegad);
- doth2=exp(-zeta*omega0*t2)*(cos(omegad*t2)-zeta*omega0/omegad*sin(omegad*t2))/m;
- H2=(1/m-doth2-2*zeta*omega0*h2)/omega0^2;
- else H2=0; end
- x=-f0*H2+f0*(t0/m+h1-h+2*zeta*omega0*(H1-H))/(Dt*omega0^2);
- x=x+exp(-zeta*omega0*t)*(x0*cos(omegad*t)+(dotx0+zeta*omega0*x0)*sin(omegad*t)/omegad);
- tt=[tt;t]; xx=[xx;x]; x=fact*x;
- yf=[0; -2*b+(1+x)*yf0; -6*b+(1+x)*yf0(size(yf0,1))];
- set(h3,'Xdata',xf); set(h3,'Ydata',yf);
- set(h4,'Xdata',4*a+xd1); set(h4,'Ydata',-3*b+yd1);
- set(h5,'Xdata',4*a*[1 1]'); set(h5,'Ydata',-3*b*[0 1]');
- set(h6,'Xdata',4*a+xd2); set(h6,'Ydata',(-7*b+yf(size(yf,1))-hej)*ones(2,1));
- set(h7,'Xdata',4*a*[1 1]'); set(h7,'Ydata',[-7*b+yf(size(yf,1))-hej yf(size(yf,1))]');
- set(h8,'Xdata',xSQ); set(h8,'Ydata',yf(size(yf,1))+ySQ);
- set(h10,'Xdata',tt); set(h10,'Ydata',-xx); pause(0.1)
- end
复制代码
[ 本帖最后由 ChaChing 于 2010-8-12 00:36 编辑 ] |