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估计
flag = 1 (derivatives), at time 0.0.索引超出数组元素的数目(2)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- m0_72237648 2022-07-17 21:00关注
你的输入参数填的是什么啊?x,t,u,flag都填的是啥?光给了个函数脚本怎么看额
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报无用 1
悬赏问题
- ¥15 微信会员卡等级和折扣规则
- ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
- ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
- ¥15 gdf格式的脑电数据如何处理matlab
- ¥20 重新写的代码替换了之后运行hbuliderx就这样了
- ¥100 监控抖音用户作品更新可以微信公众号提醒
- ¥15 UE5 如何可以不渲染HDRIBackdrop背景
- ¥70 2048小游戏毕设项目
- ¥20 mysql架构,按照姓名分表
- ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分