qq_43418154 2022-07-17 18:52 采纳率: 50%
浏览 100
已结题

flag = 1 (derivatives), at time 0.0.索引超出数组元素的数目(2)


function [sys,x0,str,ts]= NDO(t,x,u,flag)
switch flag,
case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
case 1,
    sys=mdlDerivatives(t,x,u);
case 3,
    sys=mdlOutputs(t,x,u);
case {2, 4, 9 }
    sys = [];
otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 6;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 6;          %输出6个观测值;
sizes.NumInputs      = 6;            %输入2个控制输入+4个实际q1、q2及其导数输出;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[0 0 0 0 0 0];       %观测器初始值;
str=[];
ts=[];
function sys=mdlDerivatives(t,x,u)
tol=[u(1);u(2)];     %%控制力矩
th=[u(3);u(5)];      %%实际位置;
dth=[u(4);u(6)];      %%实际速度;

wzgj_1=x(1);    %%q1位置估计
sdgj_1=x(2);    %%q1速度估计
f1=x(3);        %%扰动1
wzgj_2=x(4);    %%q2位置估计
sdgj_2=x(5);    %%q2速度估计
f2=x(6);        %%扰动2


H1=0.4;W2=0.2;    %动力学方程;
J1=5;J2=5;
m1=1;m2=1;
g=9.8;

a11=(m1+m2)*H1^2+m2*W2^2+2*m2*H1*W2*cos(th(2))+J1;
a12=m2*W2^2+m2*H1*W2*cos(th(2));
a22=m2*W2^2+J2;
b12=m2*H1*W2*sin(th(2));

gama1=(m1*W2+m2*H1)*cos(th(1))+m2*W2*cos(th(1)+th(2));
gama2=m2*W2*cos(th(1)+th(2));

M0=[a11 a12;a12 a22];
C0=[-b12*dth(2) -b12*(dth(1)+dth(2));-b12*dth(1) 0];
g0=[gama1*g;gama2*g];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FXESO参数
Ep_1=[4 0;0 4];Ep_2=[15 0;0 15];Ep_3=[40 0;0 40];
phi_1=[15 0;0 15];phi_2=[25 0;0 25];phi_3=[60 0;0 60];
h_1=0.8;h_2=0.6;h_3=0.4;
lam_1=1.2;lam_2=1.4;lam_3=1.6;
k=[1 0;0 1];

%%%%%%观测器误差1%%%%%%观测器误差2
e1=th(1)-wzgj_1;
e2=th(4)-wzgj_2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%fal循环
 delta1=0.6;delta2=0.01;            
 alfa1=0.02;alfa2=0.5;
 if abs(e1)>delta1
       fal1=abs(e1)^alfa1*sign(e1);
 else
     fal1=e1/(delta1^(1-alfa1));
 end
 %%%%%%%%%%%%%%%%%%%
 if abs(e2)>delta2
       fal2=abs(e2)^alfa2*sign(e2);
 else
     fal2=e2/(delta2^(1-alfa2));
 end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%控制器涉及的矩阵
z11_1=(abs(e1))^(0.8)*sign(e1);  
z12_1=(abs(e1))^(1.2)*sign(e1); 
z21_1=(abs(e1))^(0.6)*sign(e1);  
z22_1=(abs(e1))^(1.4)*sign(e1);
z31_1=(abs(e1))^(0.4)*sign(e1);  
z32_1=(abs(e1))^(1.6)*sign(e1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%第二组
z11_2=(abs(e2))^(0.8)*sign(e2);  
z12_2=(abs(e2))^(1.2)*sign(e2); 
z21_2=(abs(e2))^(0.6)*sign(e2);  
z22_2=(abs(e2))^(1.4)*sign(e2);
z31_2=(abs(e2))^(0.4)*sign(e2);  
z32_2=(abs(e2))^(1.6)*sign(e2);

tao0=inv(M0)*(tol-C0*dth-g0);

sys(1)=sdgj_1+Ep_1*z11_1+phi_1*z12_1;  %%%观测q1位置
sys(2)=f1+Ep_2*z21_1+phi_2*z22_1+tao0;   %%%%观测q1速度
sys(3)=Ep_3*z31_1+phi_3*z32_1+1*fal1(e1);  %%%%观测f1扰动

sys(4)=sdgj_2+Ep_1*z11_2+phi_1*z12_2;      %%%%观测q2位置
sys(5)=f2+Ep_2*z21_2+phi_2*z22_2+tao0;     %%%%%观测q2速度
sys(6)=Ep_3*z31_2+phi_3*z32_2+k*fal2(e2);   %%%%观测f2扰动 
function sys=mdlOutputs(t,x,u)
sys(1)=x(1);              %q1位置估计
sys(2)=x(2);              %q1速度估计
sys(3)=x(3);              %f1估计

sys(4)=x(4);              %q2位置估计
sys(5)=x(5);              %q2速度估计
sys(6)=x(6);              %f2估计
  • 写回答

1条回答 默认 最新

  • m0_72237648 2022-07-17 21:00
    关注

    你的输入参数填的是什么啊?x,t,u,flag都填的是啥?光给了个函数脚本怎么看额

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月18日
  • 已采纳回答 7月17日
  • 创建了问题 7月17日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分