|
楼主 |
发表于 2010-11-24 17:42
|
显示全部楼层
本帖最后由 greatchina 于 2010-11-24 17:44 编辑
回复 4 # hustxyon
你好,这是我已经编好的程序,可以解决问题,但是计算的步数太多了,希望可以修改一下步长。请多多指教,谢谢
clc;
clear all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%碰撞接触刚度计算
r2=0.02; %球半径;
r3=0.04; %假设地面也为一球面
v2=0.3; %泊松比
v3=0.3; %泊松比
E2=207000000000;%弹性模量
E3=207000000000;%弹性模量
sg2=(1-v2^2)/E2;
sg3=(1-v3^2)/E3;
k=4/(3*(sg2+sg3))*(r2*r3/(-r2+r3))^0.5;%接触刚度。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=1.5;
e=0.9; %e恢复系数;
m=10; %球质量kg
g=9.8; %重力加速度
h=1; %自由落体初始高度m
vvcc=[];
q=[];
FF=[];
VVn=[];
dd=[];
y0=[h;0]; %初值(位置/速度)
tt=0:0.00001:4; %计算时间,注意步长选取很小,否则计算的反弹力会很大,以至球反弹的高度比自由落体前的高度还要高,不符合实际(问题所在)。
for j=1:400000 %(按时间划分为100000个计算周期)
d=y0(1)+r2; %球最下端位置
Vn=y0(2); %接触相对速度
if d<=0
dd=[dd,d]; %记录球最下端位置
vvcc=[vvcc,Vn]; %同时,记录球的速度
vcc=vvcc(1); %取出碰撞接触开始时刻速度;
F=k*(abs(d))^n*(1+3*(1-e^2)/4*Vn/vcc); %计算接触反弹力,与前期计算的刚度K和接触深度abs(d)及速度有关。
FF=[FF,F]; %记录反弹力的变化
else
F=0; %没有发生接触,所以接触力为零
vvcc=[]; %清空速度记录
end
Fn=F; %取出反弹力,用于以下微分方程求解
t0=tt(j);tf=tt(j+1);%开始计算
tspan=linspace(t0,tf);
[t,y]=ode45(@fangcheng,tspan,y0,[],m,Fn,g);
y0=y(size(y,1),:); %y的最后一行所有列付给y0。也就是将本次计算结果,作为下次计算的初值。
q=[q;y0];%收集结果
end
plot(tt(1:400000),q(:,1));%绘制球自由落体运动
function Dydt=fangcheng(t,y,m,Fn,g);
Dydt=[y(2);
(-m*g+Fn)/m];
%问题描述:为了保证接触反弹力计算结果的正确性,计算中步长选取很小,导致计算时间很长。
%程序修改方向:在接触之前采用大步长计算,在即将发生接触之前,步长马上调整为小步长。(问题所在)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
-
|