第3-1章 连续系统数值积分法仿真matlab编程.pptVIP

  • 4
  • 0
  • 约7.52千字
  • 约 32页
  • 2016-12-26 发布于贵州
  • 举报

第3-1章 连续系统数值积分法仿真matlab编程.ppt

* * 第三章 Matlab编程(数值积分法仿真) 3.1 连续系统数值积分法仿真编程思路 目的:针对下面的系统编写通用的数值积分法仿真程序 (3.1-1) 对这样的系统进行仿真,实际上涉及到控制的计算、状态的数值积分计算和输出的计算。3个函数g,f,h确定后,就可以完整地描述一个系统。 给定初值:u0,y0,系统中的向量都采用列向量表示 function [t,y]=w_DigiInteSimu(tstart,tstop,h,x0,u0,cnty,InteMethod,StateModel,OutputFile, ControlFile) % 函数功能:用数值积分法仿真 % 输入参数:tstart, tstop,h 分别是起始时间、结束时间和仿真步长,是标量 % x0,u0是状态、输入的初值,都是列向量 % cnty是输出变量的个数 % InteMethod时数值积分方法,可以是EUL ,RK2,RK4 % StateModel是状态模型的文件名 % ControlFile是控制作用的文件名 % OutputFile是系统输出的文件名 % 输出参数:t是仿真结果的时间序列 % y是仿真结果系统的输出序列 (1)数值积分法仿真框架函数 function [t,y]=w_DigiInteSimu(tstart,tstop,h,x0,u0,cnty,InteMethod,StateModel,OutputFile,ControlFile) t=[tstart:h:tstop];%t数一个行序列 cntt=size(t,2);%返回列数 y=zeros(cnty,cntt);%构造一个空矩阵,用来存储结果 y0=eval([OutputFile,(tstart,x0,u0)]);%计算初始输出 y(:,1)=y0’;%将cury作为输出的第1列 curx=x0; %当前一步的x curu=u0; %当前一步的u cury=y0; %当前一步的y for i=1:1:cntt-1 curu=eval([ControlFile,(t(i),h,curx,curu,cury)]);%计算控制时传递的参数:当前时间,步长,当前状态和输出 curx=w_StepIntegral(t(i),h,curx,curu,InteMethod,StateModel);%单步积分运算 cury=eval([OutputFile,(t(i),curx,curu)]);%计算输出 y(:,i+1)=cury‘;%将输出加入到输出序列里 end function NewX=w_StepIntegral(curt,h,curx,curu,InteMethod,StateModel) %函数功能:单步积分运算,与模型方程有关 % 输入参数:curt是当前时间,h是数值积分步长 % curx,curu分别是当前的状态和控制向量 % InteMethod是积分算法,字符串类型,可以取EUL,RK2,RK4 % StateModel是状态模型文件名称,字符串类型 % 输出参数:NewX是这一步计算的新的状态向量 (2)单步数值积分法函数 单步数值积分函数只是对微分方程组StateModel进行一步的计算,计算法由InteMethod参数指定,可以上欧拉法,RK2或RK4。 function NewX=w_StepIntegral(curt,h,curx,curu,InteMethod,StateModel); if InteMethod == RK4 k1=eval([StateModel,(curt,curx,curu)]); k2=eval([StateModel,(curt+0.5*h,curx+0.5*h*k1,curu)]); k3=eval([StateModel,(curt+0.5*h,curx+0.5*h*k2,curu)]); k4=eval([StateModel,(curt+h,curx+h*k3,curu)]); NewX=curx+h*(k1+2*k2+2*k3+k4)/6; elseif InteMethod == RK2 k1=eval([StateModel,(curt,curx,curu)]); k2=eval([StateModel,(curt+h,curx+h*k1,curu)]); NewX=curx+0.5

文档评论(0)

1亿VIP精品文档

相关文档