找回密码
 注册
Simdroid-非首页
查看: 746|回复: 12

[资源共享] 多体动力学源程序[Matlab]

[复制链接]
发表于 2005-11-14 02:31:52 | 显示全部楼层 |阅读模式 来自 吉林大学南岭校区
多体动力学源程序[Matlab]
E.J.Haug <<机械系统的计算机辅助运动学和动力学>>  一书中的例题及习题主要用DADS完成。前段时间我学习该书,苦于没有DADS,所以只得自己硬着头皮尝试自己做程序。平面运动学及动力学部分已初步完成,正在整理,并进行空间运动学及动力学部分学习。现摘录部分源程序[Matlab]如下,欢迎各位不吝指教。

function [tout , yout] = SolverDyna(odefun , tspan , y0 ,SolverOpt)
%
% $ 动力学求解器 $
%     [q,q_dot,q_dotdot]=SolverDyna(FUN,TSPAN,X0,OPTIONS)
%
%     注意:求解前应当作装配分析,以选取适当的初值
% 参考书目 :
%       Book_A  <<机械系统的计算机辅助运动学和动力学>>  Version 1   E.J.Haug
%       Book_B  <<计算多提系统动力学>>                  Version 1   洪嘉振   
%       Book_C  <<数值计算方法>>                        Version 2   徐涛
%
% Supported by   
%       sunshengli@sohu.com,2005-10-31
%
% tspan 行向量初值
% y0    列向量初值
% 输出为行向量形式

% RK4
tout=[tspan];
for n=1:length(tspan)
    n
    t=tspan(n);
    if n==1
        yout=y0';
        continue;
    end
    hh=tspan(n)-tspan(n-1);
    k1=hh*feval(odefun,t,y0);
    k2=hh*feval(odefun ,t+hh/2,y0+0.5*k1);
    k3=hh*feval(odefun ,t+hh/2,y0+0.5*k2);
    k4=hh*feval(odefun ,t+hh,y0+k3);
    y0=y0+(k1+2*k2+2*k3+k4)/6;
    yout=[yout;y0'];
   
    % y0 is qdotdot
    % 求解逆向动力学
   
end

function [tout,yout] = odeAdamsPC(odefun,tspan,y0,SolverOpt)
%     
% [TOUT,YOUT] = ODEADAMSPC(ODEFUN,TSPAN,Y0) , 4th order Adams
%   Predictor-Corrector Method
%
% 参考书目  
%       Book_A  <<数值方法(MATLAB版)>>  Version 3   John H.Mathews
%       Book_B  <<数值计算方法>>          Version 2   徐涛
%
% Supported by   
%       sunshengli@sohu.com,2005-11-01
%

tout=[tspan];

% RK4起步
if length(tspan)<=4
    [tstart,ystart] = odeRK4(odefun,tspan,y0);  
    tout=[tstart];
else
    [tstart,ystart] = odeRK4(odefun,tspan(1:4),y0);
end
yout = [ystart];

% 4th order Adams Predictor-Correctot Methods
y0  = ystart(:,4);
for n=5:length(tspan)
    t   = tspan(n);
    h   = tspan(n)-tspan(n-1);
    F = feval( odefun,tspan(n-4:n-1),yout(:,n-4:n-1) );
    % Predictor
    p  = y0 + h/24*(55*F(:,4) - 59*F(:,3) + 37*F(:,2) - 9*F(:,1));
    F  = [F(:,2) F(:,3) F(:,4) feval(odefun,t,p)];
    % Corrector
    y0 = y0 + h/24*(9*F(:,4) + 19*F(:,3) - 5*F(:,2) + 1*F(:,1));
    F(:,4)   = feval(odefun,t,y0);
    yout=[yout,y0];
end

function [t , q , qdot  , qdotdot] = SolverKine(FunCstEq , tspan ,q0 ,SolverOpt)
%
% $ 运动学求解 $
%     [q,q_dot,q_dotdot]=SolverKine(FUN,TSPAN,X0,OPTIONS)
%
%     注意:求解前应当作装配分析,以选取适当的初值
% 参考书目 :
%       Book_A  <<机械系统的计算机辅助运动学和动力学>>  Version 1   E.J.Haug
%       Book_B  <<计算多体系统动力学>>                  Version 1   洪嘉振   
%       Book_C  <<数值计算方法>>                        Version 2   徐涛
%
% Supported by   
%       sunshengli@sohu.com,2005-10-31
%

q       = [];
qdot    = [];
qdotdot = [];

% ## Solver : 时间迭代求解(非线性)运动学方程 ##
for m=1:length(tspan)
    m   
    t(m) = tspan(m);   
    TrigerTimer(t(m));                                          % 保持系统时间同步更新
   
    if m == 1   
        % ## 初始化 ##
        [f,fq,v]   = feval(FunCstEq , 1 , q0 ,[] );       % 注意:Iswitch==1求解位姿及速度,不需要速度信息,可将q_dot置空
        qdot0      = fq\v;                                      % 求解速度
        [f,fq,v,y] = feval(FunCstEq , 2 , q0 ,qdot0 );    % 求加速度右项时用到速度信息
        qdotdot0   = fq\y;                                      % 求解加速度
        q1 = q0;   qdot1 = qdot0;   qdotdot1 = qdotdot0;        % 返回结果
    else
        % ## 牛顿-拉夫森法求解非线性代数方程 ##
        [q1,qdot1,qdotdot1] = SolverNR(FunCstEq , q0 , SolverOpt);

        % 确定下一步迭代初值  
        % 方法一 : q0 = q1;
        % 方法二  Book_B212 较好。如下:
        dt = t(m) - t(m-1);
        q0 = q1 + dt*qdot1 + 1/2*dt^2*qdotdot1;      
    end
   
    q       = [q,q1];
    qdot    = [qdot,qdot1];
    qdotdot = [qdotdot,qdotdot1];
end

function [q1,qdot1,qdotdot1] = SolverNR(FunCstEq , q0 , SolverOpt)
%
% $ Newton-Raphson法求解非线性代数方程 $
%     [q,q_dot,q_dotdot]=SOLVERNR(FUN,X0,OPTIONS)
%
% 参考书目 :
%       Book_A  <<机械系统的计算机辅助运动学和动力学>>  Version 1   E.J.Haug
%       Book_B  <<计算多提系统动力学>>                  Version 1   洪嘉振   
%       Book_C  <<数值计算方法>>                        Version 2   徐涛
%
% Supported by   
%       sunshengli@sohu.com,2005-10-31
%

% % ##for test##
% qArray     = [];
% fqErrArray = [];
% hErrArray  = [];

% 设置判敛控制参数
epsilon_e = SolverOpt.epsilon_e;
epsilon_s = SolverOpt.epsilon_s;

% 求解位姿
while(1)
    q = q0;
   
    % 给定构型初值,计算约束方程及Jacobian
    [f,fq,v] = feval(FunCstEq , 1 , q ,[] ); % 注意:Iswitch==1求解位姿及速度,不需要速度信息,可将q_dot置空
        
    % 计算步长。参见Book_C :P277 ,Book_A :P100
    h   = -fq\f;      
    % 判敛条件:||PHIq(q,t)||<epsilon_e 或者 ||qk1-qk||<epsilon_s
%     if ((norm(fq)<epsilon_e)| (norm(h)<epsilon_s) )
    if ((norm(f)<epsilon_e)| (norm(h)<epsilon_s) )
        q;break;
    end
   
    q0  = q+h;      % 确定下一点   
    drawnow;
   
%     % ##for test##
%     qArray     = [qArray,q]
%     fqErrArray = [fqErrArray,norm(fq)]
%     hErrArray  = [hErrArray,norm(h)]
end
q1 = q; % 位姿

% 求解速度
qdot1 = fq\v;

% 求解加速度
[f,fq,v,y] = feval(FunCstEq , 2 , q1 ,qdot1 ); % 注意:这里求加速度右项时用到速度信息
qdotdot1   = fq\y;

评分

1

查看全部评分

发表于 2007-5-22 21:18:04 | 显示全部楼层 来自 河南洛阳
Simdroid开发平台
你太牛了,佩服
回复 不支持

使用道具 举报

发表于 2007-5-23 13:42:45 | 显示全部楼层 来自 陕西西安
很好
回复 不支持

使用道具 举报

发表于 2007-5-23 13:43:06 | 显示全部楼层 来自 陕西西安
很好
回复 不支持

使用道具 举报

发表于 2007-5-28 14:00:26 | 显示全部楼层 来自 上海闵行区
请问楼主,有没有求解动力方程的中心差分法的程序啊,先谢了哈
回复 不支持

使用道具 举报

发表于 2007-6-21 13:36:42 | 显示全部楼层 来自 广东广州
多谢楼主分享
回复 不支持

使用道具 举报

发表于 2008-10-2 16:44:28 | 显示全部楼层 来自 陕西西安
感谢楼主
回复 不支持

使用道具 举报

 楼主| 发表于 2008-12-11 02:59:46 | 显示全部楼层 来自 吉林大学南岭校区

做过这类微分代数方程组求解的,

交流一下。
好久没有做这个了,还是想把它做完……
很希望有人合作……
回复 不支持

使用道具 举报

 楼主| 发表于 2008-12-11 03:01:57 | 显示全部楼层 来自 吉林大学南岭校区

很希望有人合作……

做过这类微分代数方程组求解的,交流一下。
好久没有做这个了,还是想把它做完……
很希望有人合作……
回复 不支持

使用道具 举报

发表于 2010-3-19 17:01:55 | 显示全部楼层 来自 北京海淀
这个要顶 lz不错哈
回复 不支持

使用道具 举报

发表于 2010-3-20 07:53:21 | 显示全部楼层 来自 河南郑州
强人,学习了
回复 不支持

使用道具 举报

发表于 2010-3-26 04:41:22 | 显示全部楼层 来自 德国
强人啊!赞一个!不得不!
回复 不支持

使用道具 举报

发表于 2010-4-17 21:14:46 | 显示全部楼层 来自 北京
我现在也做多体动力学的仿真,有问题还得多向牛人请教啊
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 23:23 , Processed in 0.067207 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表