主题:求助,这个程序有啥问题吗,是关于双球系统的振动与转动的
function zdzdxq
m = 20; k = 10; L0 = 10;
w0 = 0.1; x0 = 1;
tmax = 50; h = 0.05;
[t, u] = ode45(@F, 0:h:tmax, [x0 0 0 w0]); % 需定义函数F
subplot(2,2,1)
L = L0 + 2*u(:,1);
plot(t, L, 'linewidth', 1.5), title('弹簧长度-时间图像');
xlabel('t'); ylabel('l'); axis([0 tmax 8 12.5]);
subplot(2,2,2)
theta = u(:,3) - floor(u(:,3)/(2*pi)) * 2*pi; % 修正括号和运算符
plot(t, theta, 'linewidth', 1.5), title('角度-时间图像');
xlabel('t'); ylabel('\theta'); axis([0 tmax 0 2*pi+0.1]);
subplot(2,2,3)
plot(t, u(:,4), 'linewidth', 1.5), title('角速度-时间图像');
xlabel('t'); ylabel('\omega'); axis([0 tmax 0 0.3]);
subplot(2,2,4)
x1 = (L0/2 + u(:,1)) .* cos(u(:,3)); y1 = (L0/2 + u(:,1)) .* sin(u(:,3));
x2 = (L0/2 - u(:,1)) .* cos(u(:,3)); y2 = (L0/2 - u(:,1)) .* sin(u(:,3));
xx = linspace(x1(1), x2(1), 50); % 弹簧两端应为x1和x2
yy = 0.35*sin(20*pi*(xx - x2(1))/L0) + y1(1);
xx1 = (xx - x2(1)) .* cos(u(1,3)) - (yy - y1(1)) .* sin(u(1,3)) + x2(1);
yy1 = (xx - x2(1)) .* sin(u(1,3)) + (yy - y1(1)) .* cos(u(1,3)) + y1(1);
hold on
h1 = plot(x1(1), y1(1), 'r.', 'MarkerSize', 45);
h2 = plot(x2(1), y2(1), 'g.', 'MarkerSize', 45); % 修正y2(1)
h3 = plot(xx1, yy1, 'b', 'LineWidth', 2);
axis equal; axis([-6 6 -6 6]); axis off;
title('双振子随时间变化');
for i = 1:length(x1) % 修正循环变量和长度
xx = linspace(x1(i), x2(i), 50);
yy = 0.35*sin(20*pi*(xx - xx(i))/L(1)) + y1(i);
xx_rot = (xx - x2(i)) .* cos(u(i,3)) - (yy - y1(i)) .* sin(u(i,3)) + x2(i); % 使用u(i,3)
yy_rot = (xx - x2(i)) .* sin(u(i,3)) + (yy - y1(i)) .* cos(u(i,3)) + y1(i);
set(h1, 'XData', x1(i), 'YData', y1(i));
set(h2, 'XData', x2(i), 'YData', y2(i));
set(h3, 'XData', xx_rot, 'YData', yy_rot);
drawnow;
end
end
% 必须定义微分方程函数F
function dudt = F(t, u)
m = 20; k = 10; L0 = 10;
x = u(1); dxdt = u(2); theta = u(3); dthetadt = u(4);
% 根据系统动力学编写方程
d2xdt2 = (k/m)*(L0/2 - x) - (k/m)*x - (dxdt/m); % 示例,需根据实际模型修正
d2thetadt2 = - (2*x*dthetadt + k*theta)/m; % 示例,需根据实际模型修正
dudt = [dxdt; d2xdt2; dthetadt; d2thetadt2];
end