查看: 107|回复: 0|关注: 0

[未答复] simulink s-function,Output returned by S-function问题

[复制链接]

新手

10 麦片

财富积分


050


1

主题

3

帖子

0

最佳答案
发表于 2019-10-9 16:15:24 | 显示全部楼层 |阅读模式
function[sys,x0,str,ts]=RLS_sfunction(t,x,u,flag,lambda)
%输入参数
%    t、x、u、分别对应时间、状态、输入信号
%    flag为标志位,其,取值不同,s函数执行的任务和返回的数据也是不同的
%输出参数
%    sys为一个通用的返回参数值,其数值根据flag的不同而不同
%    x0位状态初始数值
%    str在目前为止的MATLAB版本中并没有什么作用,一般str=[]即可
%    ts为一个两列的矩阵,包含采样时间和偏移量两个参数
switch flag
    case 0  % 系统进行初始化,调用mdlInitializeSizes函数
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 1  % 计算连续状态变量的导数,调用mdlDerivatives函数
        sys=mdlDerivatives(t,x,u);
    case 2  % 更新离散状态变量,调用mdlUpdate函数
        sys=mdlUpdate(t,x,u,lambda);
    case 3  % 计算s函数的输出,调用mdlOutputs
        sys=mdlOutputs(t,x,u);
    case 4  % 计算下一仿真时刻
        sys=mdlGetTimeOfNextVarHit(t,x,u);
    case 9  % 仿真结束,调用mdlTerminate函数
        sys=mdlTerminate(t,x,u);
    otherwise  % 其他未知情况处理,用户可以自定义
        error(['Unhandled flag=',num2str(flag)]);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%1. 系统初始化子函数
function[sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates  =0;
sizes.NumDiscStates  =3;
sizes.NumOutputs     =3;
sizes.NumInputs      =4;
sizes.DirFeedthrough =1;    %output里sys有多少与输入向量u相关
sizes.NumSampleTimes =1;    %至少需要的采样时间
sys=simsizes(sizes);
x0=[0 0 0];                 %初始条件
str=[];                     %str总是设置为空
ts=[-1,0];                  %表示该模块采样时间继承其他的模块采样时间设置
global phi
phi=zeros(1,3);
global K
K=zeros(3,1);
global P
P=10^3*eye(3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2.  进行连续状态变量的更新
function sys=mdlDerivatives(t,x,u)
sys=[];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%3.  进行离散状态变量的更新
function sys=mdlUpdate(t,x,u,lambda)
global phi
global K
global P
phi=[u(1)-u(2),u(3),u(4)]; %数据变量phi矩阵
K=P*phi'./(phi*P*phi'+lambda);%增益矩阵K=P*phi'./(phi*P*phi'+lambda);
x=x+K*(u(1)-phi*x);%参数矩阵thita=thita+K*(u(1)-phi*thita);
P=(P-K*phi*P)./lambda;
% 将计算的结果返回给主函数
sys=x;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%4.  求取系统的输出信号
function sys=mdlOutputs(t,x,u)
% sys(1)=-x(2);
% sys(2)=(x(3)+x(1)*x(2))./(x(1)-1);
% sys(3)=-1./(sys(2)*log(x(1)));% 把算得的模块输出向量赋给sys
sys=[-x(2);((x(3)+x(1)*x(2))./(x(1)-1));-1./(((x(3)+x(1)*x(2))./(x(1)-1))*log(x(1)))];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%5.  计算下一刻仿真时刻,由sys返回
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime=1;  % 此处设置下一仿真时刻为1s以后
sys=t+sampleTime;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%6.  结束仿真子函数
function sys=mdlTerminate(t,x,u)
sys=[];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


想用s-function做RLS的参数识别,运行时提示
  • Output returned by S-function 'RLS_sfunction' in 'RLS_EKF2SOC_estimation/SOC_core/S-Function' during flag=3 call must be a real vector of length 3
  • 但是sys我定义成三维矩阵的了呀,不知道是哪里出问题了



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

本版积分规则

关闭

站长推荐上一条 /3 下一条

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