回复 2 # kangarooli 的帖子
我要用的是截面法,系统的程序三部分:
1,系统方程的程序:
function dxdt=fun1(t,x)
global w
q1=0;
q2=w;
q3=0.05;
q4=0;
q5=4;
q6=4;
q7=3;
dxdt=zeros(4,1);
dxdt(1)=x(3);
dxdt(2)=x(4);
dxdt(3)=(1-q1)*sin(q2*t+q4)-2*q3*x(3)+2*q3*x(4)-x(1)+x(2);
dxdt(4)=(q1*sin(q2*t+q4)+2*q3*x(3)-2*q3*(1+q5)*x(4)+x(1)-(1+q6)*x(2))/q7;
end
2.龙格库塔法:
function x_new=rk144(x,h,T)
k1=h*feval('fun1',T,x(:,1));
k2=h*feval('fun1',T+h/2,x(:,1)+k1/2);
k3=h*feval('fun1',T+h/2,x(:,1)+k2/2);
k4=h*feval('fun1',T+h,x(:,1)+k3);
x_new=x(:,1)+(k1+2*k2+2*k3+k4)/6;
end
3.主程序
function [T,x,V]=changerk344(N)
x(:,1)=[0;0;0;0;]; % 初始状态
h=0.01; % 初始步长,最大步长
AbsTol=1e-5; % 容差
p=4;
T=zeros(1,N); % 时间向量
T(1,1)=0; % 时间起点
p21=2^p-1;
V =[];
tic
for i=1:N-1
if abs(x(1,i))<0.09 % 定步长
h=0.01;
x(:,i+1)=rk144(x(:,i),h,T(1,i));
T(1,i+1) = T(1,i) + h; % 更新时间
else % 变步长
x1=rk144(x(:,i),h,T(1,i));
x2=rk144(x(:,i),h/2,T(1,i));
a=abs(x1-x2)/p21;
while a(1,1)>AbsTol % 选择合适步长
h=h/10;
x1=rk144(x(:,i),h,T(1,i));
x2=rk144(x(:,i),h/2,T(1,i));
a=abs(x1-x2)/p21;
end
x(:,i+1)=x1; % 根据选择的步长更新状态
if abs(x(1,i+1))>=0.1
V=x(3,i+1);
x(3,i+1)=-0.8*x(3,i+1);
x(1,i+1)=sign(x(1,i+1))*min(0.1,abs(x(1,i+1))); %限制位置在0.1处
end
T(1,i+1) = T(1,i) + h;
end
h=0.01;
end
toc
T = T(:); % 将时间转换为列向量
x = x(:,1:N);
选的截面是x(1)=0.1,1的速度等于碰后的速度
|