matlab问题 高手进

连续系统状态变量分析的例子
有的话那个大哥给我 高分

在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。 它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)
先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sfuntmpl.m中的代码来讲具体的结构:
switch flag, %判断flag,看当前处于哪个状态
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在 sfuntmpl.m的149行
我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下
size = simsizes;%用于设置模块参数的结构体用simsizes来生成
sizes.NumContStates = 0;%模块连续状态变量的个数
sizes.NumDiscStates = 0;%模块离散状态变量的个数
sizes.NumOutputs = 0;%模块输出变量的个数
sizes.NumInputs = 0;%模块输入变量的个数
sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能 %直接控制输出)
sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个
sys = simsizes(sizes); %设置完后赋给sys输出
举个例子,考虑如下模型:
dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*u
x(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)
y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u
设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为:
(一般连续状态与离散状态不会一块用,我这儿是为了方便说明)
sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInpu
ts=1;
其他的可以不变。继续在mdlInitializeSizes函数中往下看:
x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改 %为x0=[0,0](离散和连续的状态变量我们都设它初值为0)
str = []; %这个就不用说了,保留参数嘛,置[]就可以了,反正没什么用,可 %能7.0会给它一些意义
ts = [0 0]; %采样周期设为0表示是连续系统,如果是离散系统在下面的mdlGet %TimeOfNextVarHit函数中具体介绍
嘻嘻,总算讲完了初始化,后面的应该快了
在sfuntmpl的106行继续往下看:
case 1,
sys=mdlDerivatives(t,x,u);
flag=1表示此时要计算连续状态的微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到 mdlDerivatives函数(在193行)如果设置连续状态变量个数为0,此处只需sys=[]; 就可以了(如sfuntmpl中一样),按我们上述讨论的那个模型,此处改成 sys=fc(t,x(1),u)或sys=A*x(1)+B*u %我们这儿x(1)是连续状态变量,而x(2)是离散的,这儿只用到连续的,此时的输出sys就是微分
继续,在sfuntmpl的112行:
case 2,
sys=mdlUpdate(t,x,u);
flag=2表示此时要计算下一个离散状态,即上面提到的x(k+1)=fd(t,x,u),找到mdlUpd ate函数(在206行)它这儿sys=[];表示没有离散状态,我们这而可以改成 sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)

看来后面几个一两句话就可了,呵呵,在sfuntmpl的118行
case 3,
sys=mdlOutputs(t,x,u);
flag=3表示此时要计算输出,即y=fo(t,x,u),找到mdlOutputs函数(在218行),如上,如果sys=[]表示没有输出,我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出y
好像快完了,嘻嘻,在sfuntmpl的124行
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
flag=4表示此时要计算下一次采样的时间,只在离散采样系统中有用(即上文的mdlInit ializeSizes中提到的ts设置ts(1)不为0)
连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[];这个函数主要用于变步长的设置,具体实现大家可以用edit vsfunc看vsfunc.m这个例子
最后一个,在sfuntmpl的130行
case 9,
sys=mdlTerminate(t,x,u);
flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可,如果你在结束时还要设置什么,就在此函数中写
关于sfuntmpl这个s函数的模板讲完了。
s函数还可以带用户参数,下面给个例子,和simulink下的gain模块功能一样,大伙自己看吧,我睡觉去了,累了
function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)
switch flag,
case 0,
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0=[];
str=[];
ts=[0,0];
case 3,
sys=gain*u;
case {1,2,4,9},
sys = [];
end

参考资料:http://hi.baidu.com/summerytyj/blog/item/0012a84533c00c23cefca322.html

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-06-06
solve('-2*v1+v2=-0.3649e-6','v1-2*v2+v3=-0.6239e-6','v2-2*v3+v4=-0.9358e-6','v3-2*v4+v5=-1.248e-6','v4-2*v5+v6=-1.821e-6','v5-2*v6+v7=-0.9805e-6','v6-2*v7+v8=-1.215e-6','v7-2*v8+v9=-1.45e-6','v8-2*v9+v10=-1.685e-6','v9-2*v10+v11=-1.92e-6','v10-2*v11=-2.968e-6','v11+v13=-3.292e-6','-2*v13+v14=-4.375e-6','v13-2*v14+v15=-2.917e-6','v14-2*v15+v16=-1.458e-6')
ans
=
v1:
[1x1
sym]
v10:
[1x1
sym]
v11:
[1x1
sym]
v13:
[1x1
sym]
v14:
[1x1
sym]
v15:
[1x1
sym]
v16:
[1x1
sym]
v2:
[1x1
sym]
v3:
[1x1
sym]
v4:
[1x1
sym]
v5:
[1x1
sym]
v6:
[1x1
sym]
v7:
[1x1
sym]
v8:
[1x1
sym]
v9:
[1x1
sym]
这样对应一下吧,更好的我也不知道,其实也可以当成矩阵来求解
第2个回答  2008-11-05

有关matlab中xlsread函数的问题,高手进
"xlsread函数是Matlab中用于读取Excel文件的函数之一。使用xlsread函数时需要注意以下几点:首先确保Excel文件没有损坏且路径正确无误;其次要确保文件的格式与Matlab兼容以避免乱码或不完整数据的问题;同时需注意读取数据时可能需要关注特定格式的数据处理方法比如日期和时间等。在使用xlsread函数的过程中遇到速...

有关matlab中xlsread函数的问题,高手进
例如,使用代码[a, b, c] = xlsread('D:\\temp.xls', 'sheet1', 'A1:D5'); 要获取所需内容时,c变量应该包含你需要的信息。如果问题仅在您的电脑上出现,尝试在另一台电脑上运行,以排除MATLAB本身的问题。据报告,MATLAB 7.01版本存在对xls文件处理的bug,但这个在7.04版本后已得到修复。

MATLAB里一个函数表示不出来,高手进下
如令x=(pi\/4),则y=四分之根号二+1.5除以(1+pi\/16)运用matlab 计算得 y=1.2813

MATLAB里一个函数表示不出来,高手进下
y=cos(x)*0.5+1.5*sin(2*x).\/(1+x.^2)十之八九是点乘方的问题!(x是向量)

MATLAB高手进,删除某几行数据
这里用4阶魔方阵示范:a=magic(4);b=~(a>9.0);a=a.*b 那么所有的大于9.0的都被换成0了 把a=magic(4)改成a=你的数据就行了

用matlab编程,求解一个数学模型的最优解,有点复杂,高手进,可以加qq
以下Matlab程序:f=[5;4]; %这个是你的目标函数是系数 A=[-1,-4;-2,-1]; %这里是约束的左边系数,注意这里是A*x<=b,所以你的条件中要化为小于等于,所以这里只选了第1和第2个条件 b=[-12;-36]; %约束的右边系数 Aeq=[2,9]; %这个是等式约束,上式中的条件3 beq...

MATLAB生成随机数(高手进)
===第一种=== >> n=500; %散点的个数 >> R=5; %圆的半径 >> Seta=0:0.01:2*pi;>> X=R.*cos(Seta);>> Y=R.*sin(Seta);>> plot(X,Y) %画出圆 >> axis square >> r=R*rand(1,n);>> seta=2*pi*rand(1,n);>> x=r.*sin(seta);>> y=r.*cos(set...

MatLab运输问题高手进
(1)问题分析:运输费=运输单价*运输量。这里要求是总运输费最低,也就是说规划的目标函数是使得运输费最小。约束条件有:a.ABC三个工厂生产能力存在上限,当然也存在下限(产量为0)b.至少应甲乙丙丁四个市场的需求量。(2)符号说明:xij代表i工厂给j市场的箱数,当然这里i=1,2,3分别代表ABC;j=1...

mathematica问题?高手进。
普通停止(原因):在这个计算(过程)中,更进一步的\\!\\(Graphics :: \\"gptn\\"\\) 输出将会被禁止 这个是字面意思,你什么软件产生的?Matlab?还是什么?

matlab高手进!求程序在循环中求方差
i=1;while(marks>=0 &marks<=100)x(i)=marks; i=i+1; %保存每个分数 ……在disp前面输入:aver=sum\/people; %平均分 var=0; %方差 for j=1:len(x)var=var+(x(i)-aver)^2;end 后面加上disp var(方差)

相似回答