当前位置:服务支持 >  软件文章 >  Matlab多自由度瞬态动力学强迫响应计算程序

Matlab多自由度瞬态动力学强迫响应计算程序

阅读数 6
点赞 0
article_banner

 

%% 多自由度系统瞬态响应分析,New-mark Beta,适用于非比例阻尼,非线性刚度,非线性阻尼;
%% Inputs:
% K Stiff matrix
% C Damping matrix, Structural Damping will be transformed to viscous
% damping.
% M Mass matrix
% fi_set Force excitation DOFs.
% Force Force matrix for every i_set
% R_set Output DOFs, Disp, Velo,Acc output in cell format.

%% mxl.2015-5-24
% 单位制不做规定;默认自由度序号为从1到N
% 在本程序中没有考虑非线性刚度 K=K(t),非线性阻尼C=C(t)这类问题,后续可以添加;
% 输入默认为:x(0)=0,x'(0)=1;t 表示时间;
% 强迫位移,强迫速度和强迫加速度功能没有考虑;
% 结构阻尼输入的时候,转换为等效粘性阻尼的功能还没有添加;
% 输出请求为位移,速度和加速度,不含应力;
clear
clc


dt=0.0001;
t=[0:dt:10]';% 延迟计算时间到15秒,可以看到明显的数值阻尼
method='Newmark';% Runge-Kutta,Runge-Kutta
% M=0.2533;
% K0=10;
% C=0.592;
m1=2e2;m2=5e3;
k1=2e6;k2=1.5e6;
c1=1000;c2=2000;

M=diag([m1,m2]);
C=[
c1+c2,-c2;
-c2,c2;
];
K0=[
k1+k2,-k2;
-k2,k2;
];


fi_set=1;
Force=5*sin(pi*t/0.6);


N=size(M,1);

initial_disp=zeros(N,1);% You may change it.
initial_velo=[0;1];% You may change it.
initial_acc=[];% You may change it.

R_set=[1]';
% %---------------------------------------------------------------------%
% (1)Input check
% %---------------------------------------------------------------------%

if max(fi_set)>N
error('fi_set is wrongly set.');
end

if numel(fi_set)-size(Force,2)
error('Input force must keep in consistence.');
end

if isempty(dt)
error('You must specify or calculate time step.');
end

if strcmp(method,'Newmark')
if isempty(initial_disp)||isempty(initial_velo)
error('You must specify the initial states.');
end
end
if max(R_set)>N||isempty(R_set)
error('Response DOFs are badly set.')
end


%-----初始化输出-----%
Nsteps=numel(t);
disp=zeros(Nsteps,numel(R_set));% 这是用来保存R_set 位移结果的;
velo=zeros(Nsteps,numel(R_set));% 这是用来保存R_set 速度结果的;
acc=zeros(Nsteps,numel(R_set));% 这是用来保存R_set 加速度结果的;
Fi=zeros(N,1);

update_disp=zeros(N,1);% 这是用来保存运算中全局位移结果的;
update_velo=zeros(N,1);% 这是用来保存运算中全局速度结果的;
update_acc=zeros(N,1);% 这是用来保存运算中全局加速度结果的;

Inv_M=inv(M);
% %---------------------------------------------------------------------%
% (2)New-Mark Beta
% gama=0.5;0.1667<=beta<=0.25,beta=0.25 is suggested.
% %---------------------------------------------------------------------%
gama=0.5;beta=0.25;
disp(['Gama= ',num2str(gama),'Beta= ',num2str(beta)]);
a2=1/beta/dt;a0=a2/dt;a1=a2*gama;
a3=1/2/beta-1;a4=gama/beta-1;a5=dt/2*(a4-1);

% if strcmp(method,'Newmark')
for loop=1:Nsteps
if loop>1


disp(loop,:)=initial_disp(R_set,1)';% 保存请求的计算结果
velo(loop,:)=initial_velo(R_set,1)';
acc(loop,:)=initial_acc(R_set,1)';
if loop==Nsteps
break;
end
%---we may update the K in the line in nonlinear problem----%
% K=Ki+a0*M+a1*C;

Fi=zeros(N,1);
for loopf=1:numel(fi_set)
Fi(fi_set(loopf),1)=Force(loop,loopf);
end
Fi=Fi+M*(a0*initial_disp+a2*initial_velo+a3*initial_acc)+...
C*(a1*initial_disp+a4*initial_velo+a5*initial_acc);


update_disp=K\Fi;
update_velo=a1*(update_disp-initial_disp)-a4*initial_velo-a5*initial_acc;
update_acc =a0*(update_disp-initial_disp)-a2*initial_velo-a3*initial_acc;


initial_disp=update_disp;% 将本次结果保存,下一次迭代时作为初值
initial_velo=update_velo;
initial_acc =update_acc;
else
for loopf=1:numel(fi_set)
Fi(fi_set(loopf),1)=Force(loop,loopf);
end

disp(loop,:)=initial_disp(R_set,1)';
velo(loop,:)=initial_velo(R_set,1)';
if isempty(initial_acc)
initial_acc=Inv_M*(Fi-C*initial_velo-K0*initial_disp);
acc(loop,:)=initial_acc(R_set,1)';
else
acc(loop,:)=initial_acc(R_set,1)';
end


K=K0+a0*M+a1*C;% 对于线性系统,以后K都不会变


Fi=Fi+M*(a0*initial_disp+a2*initial_velo+a3*initial_acc)+...
C*(a1*initial_disp+a4*initial_velo+a5*initial_acc);

update_disp=K\Fi;
update_velo=a1*(update_disp-initial_disp)-a4*initial_velo-a5*initial_acc;
update_acc =a0*(update_disp-initial_disp)-a2*initial_velo-a3*initial_acc;

initial_disp=update_disp;% 将本次结果保存,下一次迭代时作为初值
initial_velo=update_velo;
initial_acc =update_acc;
end


end % end of for
% end % end of if
subplot(2,1,1)
plot(t,disp)
hold on
plot(t,velo(:,1),'r')
hold off
legend('disp','velo')
title('Newmark')
% axis(gca,[0,max(t),-2e-5, 4e-5])
% %---------------------------------------------------------------------%
% (3)Runge-Kutta,注意R-K 可以应用于一般非线性的求解,因此很厉害的;
% 请参考盛宏玉书上308页内容。
% %---------------------------------------------------------------------%
% R-K 方法要求 输入刚度,质量,阻尼,载荷,以及非线性方程的形式;
% 初始条件只需给定初始位移和初始速度,初始加速度可以由此计算得到
disp=zeros(Nsteps,numel(R_set));% 这是用来保存R_set 位移结果的;
velo=zeros(Nsteps,numel(R_set));% 这是用来保存R_set 速度结果的;
acc=zeros(Nsteps,numel(R_set));% 这是用来保存R_set 加速度结果的;
% if strcmp(method,'Runge-Kutta')

% A=[
% zeros(size(M)),eye(N);
% -Inv_M*K,-inv_M*C;
% ];
initial_disp=zeros(N,1);% You may change it.
initial_velo=[0;1];% You may change it.
initial_acc=[];% You may change it.

for loop=1:Nsteps
if loop>1

if loop==Nsteps
break;
end

Fn1=zeros(N,1);
for loopf=1:numel(fi_set)
Fn1(fi_set(loopf),1)=Force(loop,loopf);
end


Kd1=Inv_M*(-K0*initial_disp-C*initial_velo+Fn1);% 这就是一般非线性的表达式,可以另外写为一个函数单独调用
Kd2=Inv_M*(-K0*(initial_disp+0.5*dt*initial_velo)-C*(initial_velo+0.5*dt*Kd1)+0.5*(Fn1+Fn0));
Kd3=Inv_M*(-K0*(initial_disp+0.5*dt*initial_velo+0.25*dt^2*Kd1)-C*(initial_velo+0.5*dt*Kd2)+0.5*(Fn0+Fn1));
Kd4=Inv_M*(-K0*(initial_disp+dt*initial_velo+0.5*dt^2*Kd2)-C*(initial_velo+dt*Kd3)+Fn1);

Fn0=Fn1;% 保存上一次的载荷,两个时间步之间的就用平均值

update_disp=initial_disp+dt*initial_velo+(dt^2)/6*(Kd1+Kd2+Kd3); % Kdi是第二组R-K法系数
update_velo=initial_velo+dt/6*(Kd1+2*Kd2+2*Kd3+Kd4);
update_acc =Kd1;


initial_disp=update_disp;% 将本次结果保存,下一次迭代时作为初值
initial_velo=update_velo;
initial_acc=update_acc;

disp(loop,:)=initial_disp(R_set,1)';% 保存输出
velo(loop,:)=initial_velo(R_set,1)';
acc(loop,:)=initial_acc(R_set,1)';

else


disp(loop,:)=initial_disp(R_set,1)';
velo(loop,:)=initial_velo(R_set,1)';
if isempty(initial_acc)
Fn0=zeros(N,1);
for loopf=1:numel(fi_set)
Fn0(fi_set(loopf),1)=Force(loop,loopf);
end


initial_acc=Inv_M*(Fn0-C*initial_velo-K0*initial_disp);
acc(loop,:)=initial_acc(R_set,1)';
else
acc(loop,:)=initial_acc(R_set,1)';
end


end


end

% end


subplot(2,1,2)
plot(t,disp)
hold on
plot(t,velo(:,1),'r')
hold off
legend('disp','velo')
title('Runge-Kutta')
% axis(gca,[0,max(t),-2e-5, 4e-5])
% %---------------------------------------------------------------------%
% (4)Post-Processing
% %---------------------------------------------------------------------%


% %---------------------------------------------------------------------%
% (5)
% %---------------------------------------------------------------------%


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空