matlab-双摆仿真

物理学数学中,在动力系统领域双摆是一个摆锤,另一个摆锤连接在其末端,是一个简单的物理系统,具有丰富的动态特性对初始条件具有很强的敏感性双摆的运动由一组耦合的常微分方程控制并且是混沌的

 

由于双摆运动涉及到二阶微分方程组,在matlab中对双摆的仿真需要用到ode45求其数值解。

(代码来自 https://wenku.baidu.com/view/f78cec060912a21615792925.html

clear all;
%控制r1 r2两个角位移 就可改变双摆初状态
r1=0.8;
r2=0.8;
m1=1;
m2=1;
L1=1;
L2=1;
g=9.8;
Da=inline(['[x(3);x(4);',...
    'inv([(m1+m2)*L1,m2*L2*cos(x(1)-x(2));',...
    'm1*L1*cos(x(1)-x(2)),m1*L2])*'...
    '[m2*L2*x(4)^2*sin(x(2)-x(1))-(m1+m2)*g*sin(x(1));',...
    'm2*L1*x(3)^2*sin(x(1)-x(2))-m2*g*sin(x(2))]]'],'t','x',...
    'flag','m1','m2','L1','L2','g');
set(gcf,'DoubleBuffer','on');
[t,x]=ode45(Da,[0,20],[r1,r2,0,0],[],m1,m2,L1,L2,g);
axis([-(L1+L2),(L1+L2),-(L1+L2)*1.8,1]);
axis square;hold on;
gh1=plot([0,L1*exp(i*(x(1)-pi/2))],'r-');
set(gh1,'linewidth',2,'markersize',6,'marker','o');
gh2=plot([L1*exp(i*(x(1)-pi/2)),L1*exp(i*(x(1)-pi/2))+L2*exp(i*(x(2)-pi/2))],'b-');
set(gh2,'linewidth',2,'markersize',6,'marker','o');
for k=2:size(x,1);
    C1=[0,L1*exp(i*(x(k,1)-pi/2))];
    C2=[L1*exp(i*(x(k,1)-pi/2)),L1*exp(i*(x(k,1)-pi/2))+L2*exp(i*(x(k,2)-pi/2))];
    set(gh1,'xdata',real(C1),'ydata',imag(C1));
    set(gh2,'xdata',real(C2),'ydata',imag(C2));
    title(['t=',num2str(t(k))],'fontsize',12);
    pause(0.1);
end
% figure;
% subplot(2 ,3 ,1);plot(t,x(:,1));title('t-\theta_1');
% xlabel('t');ylabel('\theta_1');
% subplot(2 ,3 ,2);plot(t,x(:,2));title('t-\theta_2');
% xlabel('t');ylabel('\theta_2');
% subplot(2 ,3 ,3);plot(t,x(:,3));title('t-\omega_1');
% xlabel('t');ylabel('\omega_1');
% subplot(2,3,4);plot(t,x(:,4));title('t-\omega_2');
% xlabel('t');ylabel('\omega_2');
% subplot(2,3,5);plot(x(:,1),x(:,3));title('\theta_1-\omega_1');
% xlabel('\theta_1');ylabel('\omega_1');
% subplot(2,3,6);plot(x(:,2),x(:,4));title('\theta_2-\omega_2');

  效果图和上图差不多,放一张截图

另外,科学网上也有对双摆的模拟程序

http://blog.sciencenet.cn/blog-292361-1038664.html

posted on 2018-12-29 20:45 hyb965149985 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/hyb965149985/p/10197879.html

含阻尼混沌双摆可以用 MATLAB 进行仿真。下面是一个简单的 MATLAB 代码示例,用于模拟含阻尼混沌双摆的运动: ```matlab % 定义常数 g = 9.81; % 重力加速度 l1 = 1; % 第一根杆子的长度 l2 = 1; % 第二根杆子的长度 m1 = 1; % 第一根杆子的质量 m2 = 1; % 第二根杆子的质量 b1 = 0.1; % 第一根杆子的阻尼系数 b2 = 0.1; % 第二根杆子的阻尼系数 % 定义初始条件 theta1 = pi/4; % 第一根杆子的初始角度 theta2 = pi/2; % 第二根杆子的初始角度 omega1 = 0; % 第一根杆子的初始角速度 omega2 = 0; % 第二根杆子的初始角速度 % 定义时间步长和时间范围 dt = 0.01; % 时间步长 t = 0:dt:100; % 时间范围 % 初始化数组 theta1_array = zeros(size(t)); theta2_array = zeros(size(t)); % 循环求解含阻尼混沌双摆的运动 for i = 1:length(t) % 计算角加速度 alpha1 = (-b1*omega1 - g*(2*m1+m2)*sin(theta1)-m2*g*sin(theta1-2*theta2)-2*sin(theta1-theta2)*m2*(omega2^2*l2+omega1^2*l1*cos(theta1-theta2)))/(l1*(2*m1+m2-m2*cos(2*theta1-2*theta2))); alpha2 = (-b2*omega2 + 2*sin(theta1-theta2)*(omega1^2*l1*(m1+m2)+g*(m1+m2)*cos(theta1)+omega2^2*l2*m2*cos(theta1-theta2)))/(l2*(2*m1+m2-m2*cos(2*theta1-2*theta2))); % 计算角速度 omega1 = omega1 + alpha1*dt; omega2 = omega2 + alpha2*dt; % 计算角度 theta1 = theta1 + omega1*dt; theta2 = theta2 + omega2*dt; % 保存角度到数组中 theta1_array(i) = theta1; theta2_array(i) = theta2; end % 绘制含阻尼混沌双摆的运动轨迹 x1 = l1*sin(theta1_array); y1 = -l1*cos(theta1_array); x2 = x1 + l2*sin(theta2_array); y2 = y1 - l2*cos(theta2_array); plot(x1,y1,'b',x2,y2,'r'); axis equal; xlabel('x'); ylabel('y'); title('含阻尼混沌双摆的运动轨迹'); legend('第一根杆子','第二根杆子'); ``` 这个代码将会模拟含阻尼混沌双摆的运动,并且绘制出双摆的运动轨迹。你可以根据自己的需要调整代码中的参数和初始条件,以便更好地理解含阻尼混沌双摆的运动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值