本帖最后由 black1man 于 2018-11-29 23:57 编辑

我先说下我的仿真:

是对一个船舶系统进行反步滑模控制,其中simulink仿真中的闭环控制可以完美收敛,可是同样用m文件来做,却是彻底的发散。

(需要说一下,开环的情况下,simulink和m文件的仿真结果完全一致,只有在闭环情况下,一个收敛,一个发散)

请问:是我的m文件哪里编的不对吗?为什么会出现这种情况。程序和simulink都传到了附件里。

研究了一个晚上,完全没有发现问题所在,脑子都懵了,不知道哪里犯了错误,希望有朋友指点迷津。谢谢!

我把m文件贴了出来贴出来:(附件里有simulink和m程序,可以下载后直接运行)

clear;clc;format long;

T = 0.5; count = 200; step_T = 2;    %周期,周期数,周期步数

h = T/step_T;

%% 船体数据

M = 1e9* [ 0.0068 0 0; 0 0.0113 -0.0340 ; 0 -0.0340 4.4524];

D =  1e8* [0.0008 0 0 ; 0 0.0025 -0.0203 ; 0 -0.0203 3.8481];

L1=diag([0.22;0.22;22]); L2=diag([4e6;10e6;900e6]);   % 反步法的增益

omega_bar=[5e6;5e6;5e6];                                              % 干扰的上限

%% 变量初始化

eta=[10;10;1];

eta = J_func(eta);      %弧度转换到[-pi,pi]之间

nu= [0;0;0];

omega=[0;0;0];         %干扰

tau=[0;0;0];               %控制力

etad=[0;0;0];             %期望值

detad=[0;0;0];           %期望值的一次导

ddetad=[0;0;0];         %期望值的二次导

%% 画图

t_draw = zeros(1,count);

eta_draw = zeros(3,count);

omega_draw=zeros(3,count);

%% 主循环

for i = 1:1:count                      %主循环

t = (i-1)*T;

t_draw(i)    = t;              %       eta = J_func(eta);      %弧度转换到[-pi,pi]之间

eta_draw(:,i) = eta;

%% 干扰

omega = 4.85e6*[1+0.01*sin(0.01*t)+0.02*cos(0.2*t)*sin(0.01*t);

1+0.01*sin(0.01*t)+0.02*cos(0.2*t)*sin(0.01*t);

1+0.01*sin(0.01*t)+0.02*cos(0.2*t)*sin(0.01*t)];

omega_draw(:,i)=omega;

%% 控制

tau= tau_func(L1,L2,eta,nu,etad,detad,ddetad,M,D,omega_bar);

%% 船模

for j = 1:1:step_T                 %次循环 四阶龙格库塔

keta1= deta(eta,nu);

knu1 = dnu(M,D,nu,omega,tau);

keta2= deta(eta+h/2*keta1,nu+h/2*knu1);

knu2 = dnu(M,D,nu+h/2*knu1,omega,tau);

keta3= deta(eta+h/2*keta2,nu+h/2*knu2);

knu3 = dnu(M,D,nu+h/2*knu2,omega,tau);

keta4= deta(eta+h*keta3,nu+h*knu3);

knu4 = dnu(M,D,nu+h*knu3,omega,tau);

eta = eta + h/6*(keta1 + 2*keta2 + 2*keta3 + keta4);

nu  = nu +  h/6*(knu1 + 2*knu2 + 2*knu3 + knu4);

end

end

%% 画图

figure(1)

subplot(3,1,1)

plot(t_draw,eta_draw(1,:),'LineWidth',2);

subplot(3,1,2)

plot(t_draw,eta_draw(2,:),'LineWidth',2);

subplot(3,1,3)

plot(t_draw,eta_draw(3,:),'LineWidth',2);

figure(3)

plot(eta_draw(1,:),eta_draw(2,:),'LineWidth',2);

figure(2)             % 干扰

subplot(3,1,1)

plot(t_draw,omega_draw(1,:),'LineWidth',2);

subplot(3,1,2)

plot(t_draw,omega_draw(2,:),'LineWidth',2);

subplot(3,1,3)

plot(t_draw,omega_draw(3,:),'LineWidth',2);

%——————————————————————————

%以下是子函数

%——————————————————————————

function A = J_func(eta)%将[pi,3pi]和[-3pi,-pi]之间的转到-pi到pi之间

if eta(3)>pi

eta(3) = eta(3)-2*pi;

else if eta(3)

eta(3) = eta(3)+2*pi;

end

end

A = eta;

%————————————————————

function A =dnu(M,D,nu,omega,tau)

A = M\tau - M\D*nu + M\omega;

%————————————————————

function A = deta(eta,nu)

psi=eta(3);

J=[cos(psi),-sin(psi),0;

sin(psi),cos(psi),0;

0,0,1];

A=J*nu;

%————————————————————

function A =  tau_func(L1,L2,eta,nu,etad,detad,ddetad,M,D,omega_bar)

psi=eta(3);

J=[cos(psi),-sin(psi),0;

sin(psi),cos(psi),0;

0,0,1];

dJT= [-sin(psi), cos(psi),0;

-cos(psi),-sin(psi),0;

0,0,0];

z1=eta-etad;

dz1=J*nu-detad;

nud=J'*(detad-L1*z1);

dnud= dJT*(detad-L1*z1)+J'*(ddetad-L1*dz1);

z2=nu-nud;

s=z2;

A= D*nu +M*dnud-diag(sign(s))*omega_bar-L2*s-J'*z1;

untitled.jpg

(46.38 KB, 下载次数: 0)

2018-11-29 23:30 上传

simulink仿真闭环系统

untitled1.jpg

(50.65 KB, 下载次数: 0)

2018-11-29 23:33 上传

m文件闭环仿真

untitled2.jpg

(57.09 KB, 下载次数: 0)

2018-11-29 23:34 上传

m文件开环仿真

untitled3.jpg

(64.61 KB, 下载次数: 0)

2018-11-29 23:36 上传

simulink的开环仿真

2018-11-29 23:27 上传

点击文件名下载附件

2.21 KB, 下载次数: 17

2018-11-29 23:27 上传

点击文件名下载附件

1.38 MB, 下载次数: 26

matlab仿真限幅发散,simulink仿真收敛,但用m文件实现却是发散的,是怎么回事?...相关推荐

  1. matlab示波器模拟,[转载]利用MATLAB命令窗口绘制Simulink仿真示波器波形的方法

    利用MATLAB命令窗口绘制Simulink仿真示波器波形的方法 最近写了一篇有关步进电机控制仿真分析的文章,需要将一部分仿真波形图贴到WORD里面去.但贴图时发现,如果直接将simulink中示波器 ...

  2. 电力电子Matlab仿真电力电子Simulink仿真 高频电电 力电子仿真Simulink

    电力电子Matlab仿真电力电子Simulink仿真 高频电电 力电子仿真Simulink (1)DC-DC仿真,buck,boost,Cuk,交错并联,PFC,APFC,LLC谐振双向,CLLC谐振 ...

  3. 如何用matlab进行工作空间分析,[转载]MATLAB的工作空间输出simulink仿真结果(摘改)...

    当我们用Simulink模块计算出系统动态分析结果时,常用示波器(Scope)显示结果.如何将示波器中的波形导出到word中呢?有些人将示波器图标窗口(连同结果)一同复制并且贴到word中,因为示波器 ...

  4. matlab仿真图片png,Simulink仿真入门到精通(六) Simulink模型保存为图片

    6.1 截图保存方式 Ctrl+Alt+A 6.2 拷贝试图方式 Edit→Copy Current View to Clipboard 6.3 saveas函数 用于保存figure或者simuli ...

  5. 带滤波器的PID控制仿真-3(Simulink仿真)

    在带滤波器的PID控制仿真-2的基础上对算例进行Simulink仿真. 控制器采用积分分离PI控制,即当误差的绝对值小于等于0.80时,加入积分控制,仿真结果如图1和2所示. 图1 加入滤波器时PID ...

  6. matlab通信工具comm,matlab无线通信例程及simulink仿真

    Matlab Wireless Communications 各种应用例程 802.11b PHY MATLAB Code Description.doc IEEE80211b_PHY_DBPSK.m ...

  7. matlab摩擦阵子,用simulink仿真lugre摩擦模型时出现错误该如何解决。

    本帖最后由 Austin_uFe47 于 2017-6-9 09:09 编辑 程序如图 s函数为 function [sys,x0;str,ts]=ccc(t,x,u,flag) switch fla ...

  8. PID仿真(含Simulink仿真图,文末附实验报告免费下载)

    本文主要解决的是利用Matlab中的Simulink工具对PID进行仿真,用一张图对PID的概念简单做一下介绍,有兴趣的朋友可以自行了解. PID分别指偏差的比例(P).积分(I).微分(D),是一种 ...

  9. 解决MATLAB的simulink仿真Scop窗口曲线显示不全只显示部分曲线的问题

    Matlab中,用simulink仿真的时候,总会出现只显示部分数据的情况, 很是烦恼. 版本为matlab2016,解决方案如下: 1.双击打开simulink里面的scope 2.点击设置中的lo ...

最新文章

  1. python打开后的界面-Python - tkinter:打开和关闭对话框窗口
  2. html5怎么设置勾选,word文档怎么设置输入勾选框
  3. 准确率 召回率_机器学习tips(四):精确率(precision)和召回率(recall)
  4. 大数据数据收集数据困难_工厂质量成本数据收集流程、方案
  5. Python使用struct处理二进制(转)
  6. 程序员下厨房入门---好好照顾自己
  7. EasyDrawin流媒体服务器搭建与测试
  8. 微信公众号发送模板通知
  9. LeetCode | 0665. Non-decreasing Array非递减数列【Python】
  10. 关于双击此电脑、回收站、控制面板等提示找不到应用程序解决方案
  11. vb计算机清除菜单代码,用VB编写简单的程序来清空文档菜单 (转)
  12. linux下删除以 - 开头的文件
  13. 低功耗电流波形分析仪mPower1203之Esight用户手册
  14. 一文读懂闪电网络工作原理
  15. 阿里矢量图标(字体图标)使用
  16. 台式计算机系统错误,台式电脑开机蓝屏,代码是0×0000006B,怎么修复?
  17. 叶小天的功课忙了许多
  18. Android手游SDK那点事(一)简述
  19. 【leetcode】LCP51. 烹饪料理
  20. 【vagrant虚拟机扩容】 vagrant扩容硬盘时克隆失败--未关闭虚拟机导致

热门文章

  1. VRChat简易教程1-开发环境准备(SDK)
  2. 网上的音乐怎么下载成mp3格式歌曲?这3种一键下载的方法亲测好用!
  3. Linux 4.x MTD源码分析-cfi-flash设备probe过程分析
  4. Google开源的Deep-Learning项目word2vec处理中文
  5. python机器人编程——四轴UARM机械臂的运动控制(逆解)原理及python实现(下)
  6. 当滑雪这项世界最古老的运动遇上AI
  7. LSTM中对time step的理解
  8. k1658停运_最新通知!福州这些列车停运!出行请注意
  9. 安装pyinstaller出错的解决办法及刷csdn访客数工具打包
  10. 5·12特别纪念 | 数据防“灾”,有“备”而来