当前位置:文档之家› matlab中S函数编辑流程

matlab中S函数编辑流程

matlab中S函数编辑流程
matlab中S函数编辑流程

S函数编辑流程及相关

1. S函数模板编辑环境进入:

在MATLAB主界面中直接输入:edit sfuntmpl

即可弹出S函数模板编辑的M文件环境,修改即可。

在MATLAB主界面中直接输入:sfundemos,即可调出S

函数的许多编程例子。

2. S函数模板的相关基础:

1)M文件S函数的引导语句为:

t

x

f

p

u

sys

Function

[p

x

str

ts

flag

,

,1

2

,...)

,

,

,0

,

]

,(

,

S函数默认的四个输入参数:t ,x ,u ,flag

S函数默认的四个输出函数:sys ,x0 ,str ,ts

各个参数的含义如下:

T :代表当前的仿真时间,该输入决定了下一个采样时间;

X :表示状态向量,行向量,引用格式:X(1),X(2)

U :表示输入向量;

Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值;

Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates 里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x.

X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ]

Str :空矩阵,无具体含义;

Ts :包含模块采样时间和偏差的矩阵。[period, offset]

当Ts为-1时,表示与输入信号同采样周期。

2)S函数工作方式:

Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件和Sizes 数组;

Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。

Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间和主时间步的要求;

Flag = 3时,调用mdlOutputs函数,计算S函数的输出;

Flag = 4时,调用mdlGetTimeOfNextVarHit函数,计算下一个采样点的绝对时间,这个方法仅仅是使用户在mdlInitializeSize 里说明一个可变的离散采样时间;

Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。

3)S函数仿真过程:

①初始化:mdlInitializeSizes,初始化S函数

●初始化SimStruct,包含了S函数的所有信息;

●设置输入、输出端口数;

●设置采样时间;

●分配存储空间。

②数值积分:mdlDerivatives

●用于连续状态的求解和非采样过零点;

●如果存在连续状态,调用mdlDerivatives和

mdlOutput两个子函数;

●如果存在非采样过零点,调用mdlOutput和

mdlZeroCrossings子函数,以定位过零点。

③更新离散状态:mdlUpdate

④计算输出:mdlOutputs,计算所有输出端口的输出值。

⑤计算下一个采样时间点:mdlGetTimeOfNextVarHit

⑥仿真结束:mdlTerminate,在仿真结束时调用。

3. S函数的编写:

1)参数初始设定:初始化sizes结构,再调用simsizes函数;

Sizes结构体:

NumContStates:连续状态的个数

NumDiscStates:离散状态的个数

NumOutputs:输出变量的个数

NumInputs:输入变量的个数

DirFeedthrough:有无直接馈入,值为1时表示输入直接传到输出口

NumSampleTimes:采样时间的个数,值为1时表示只有一个采样周期

Simsizes函数的调用:sys = simsizes (sizes) ,即将sizes结构

体中的信息传递给sys。

2)状态的动态更新:

连续模块的状态更新由mdlDerivatives函数来进行;

离散模块的状态更新由mdlUpdate函数来进行;

3)输出信号的计算:

计算出模块的输出信号,系统的输出仍然由sys变量返回。

4. M文件S函数的模块化:

在动态系统仿真设计,分析中,用户可以使用S-Function 模块来调用S-函数。

1)S-Function模块是一个单输入单输出的模块,如果有多个输入

与输出信号,可以使用Mux模块与Demux模块对信号进行组合和分离操作;

2)在S-Function模块的参数设置对话框中,包含了调用的S函

数名和用户输入的参数列表,如下图所示:

3)S-Function模块是以图形的方式提供给用户一个调用S函数

的接口,S函数中的源文件必须由用户自行编写;

4)S-Function模块中的S-函数名和参数值列表必须与用户填写

的S函数源文件的名称和参数列表完全一致,包括参数的顺序。

5. S-Function模块建立流程:

创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的s-function。1.新建sfunction的C语言文件

打开simulink,点击User-Defined Functions里面的S-Function Examples。这个里面有多个语言版本的模板,有C,C++,Ada,Fortran和M语言的版本,其实都大同小异,只要了解几个函数就很容易使用了。

选择C语言的版本:从S-function模块中选择C-file S-functions里面的Basic C-MEX template。打开后,另存为自己的模块名字,如test.c。

下面我们来分析代码:

#define S_FUNCTION_NAME test//这里把文件名sfuntmpl_basic修改为test

#define S_FUNCTION_LEVEL 2

#include "simstruc.h"

//程序里面要用到的头文件在这里引用,如“math.h”等。

float global_var; //定义全局变量

static void mdlInitializeSizes(SimStruct *S)

{

//这个函数用来设置输入、输出和参数的。

ssSetNumSFcnParams(S, 3); /*设置参数个数,这里为3 */

if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {

return;

}

ssSetNumContStates(S, 0);//设置连续状态的个数,缺省为0;

ssSetNumDiscStates(S, 0);//设置离散状态的个数,缺省为0;

if (!ssSetNumInputPorts(S, 1)) return;//设置输入变量的个数,这里为1

ssSetInputPortWidth(S, 0, 2); //设置输入变量0的维数为2 ssSetInputPortRequiredContiguous(S, 0, true); //设置input0的访问方式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了。ssSetInputPortDirectFeedThrough(S, 0, 1);// 设置输入端口的信号是否mdlOutputs 函数中使用,这儿设置为true。

if (!ssSetNumOutputPorts(S, 2)) return;//设置输出变量的个数ssSetOutputPortWidth(S, 0, 1);//设置输出变量0的维数为1维

ssSetOutputPortWidth(S, 1, 1);//设置输出变量1的维数为1维ssSetNumSampleTimes(S, 1); //设置采样时间,此处为1s。

ssSetNumRWork(S, 0);//不管

ssSetNumIWork(S, 0);

ssSetNumPWork(S, 0);

ssSetNumModes(S, 0);

ssSetNumNonsampledZCs(S, 0);

ssSetOptions(S, 0);

//下面可以写全局变量的初始化程序

global_var=1;

}

static void mdlInitializeSampleTimes(SimStruct *S)//暂时不管

{

ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);

ssSetOffsetTime(S, 0, 0.0);

}

#define MDL_INITIALIZE_CONDITIONS /* Change to #undef to remove function */

#if defined(MDL_INITIALIZE_CONDITIONS)

static void mdlInitializeConditions(SimStruct *S)//暂时不管

{

}

#endif /* MDL_INITIALIZE_CONDITIONS */

#define MDL_START /* Change to #undef to remove function */

#if defined(MDL_START)

static void mdlStart(SimStruct *S)//暂时不管

{

}

#endif /* MDL_START */

static void mdlOutputs(SimStruct *S, int_T tid)//这里填入相关的运算、算法等{

real_T *para1 = mxGetPr(ssGetSFcnParam(S,0));

real_T *para2 = mxGetPr(ssGetSFcnParam(S,1));

real_T *para3 = mxGetPr(ssGetSFcnParam(S,2));

const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);

real_T *y1 = ssGetOutputPortSignal(S,0);

real_T *y2 = ssGetOutputPortSignal(S,1);

y1[0]=u[0]*para1[0]+u[1]*para2[0];

y2[0]=u[1]*para3[0]+u[0]*para1[0];

}

#define MDL_UPDATE /* Change to #undef to remove function */

#if defined(MDL_UPDATE)

static void mdlUpdate(SimStruct *S, int_T tid)

{

}

#endif /* MDL_UPDATE */

#define MDL_DERIV ATIVES /* Change to #undef to remove function */

#if defined(MDL_DERIV ATIVES)

static void mdlDerivatives(SimStruct *S)

{

}

#endif /* MDL_DERIV ATIVES */

static void mdlTerminate(SimStruct *S)//这里需要把global变量全部初始化,否则

下次运行程序时,全局变量还是之前的值。

{

}

#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ #include "simulink.c" /* MEX-file interface mechanism */

#else

#include "cg_sfun.h" /* Code generation registration function */

#endif

2.编译

在matlab的command window 里面输入“mex test.c”,即可将test.c编译为mex 文件。

3.调用sfunction

在simulink空间里面拉入sfunction,在s-function name里面填入test,参数里面填入要设定的参数,然后仿真即可。

m-file模版编写

(完整版)MATLAB常用函数大全

一、MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度 angle(z):复数z的相角(Phase angle) sqrt(x):开平方 real(z):复数z的实部 imag(z):复数z的虚部 conj(z):复数z的共轭复数 round(x):四舍五入至最近整数 fix(x):无论正负,舍去小数至最近整数 floor(x):地板函数,即舍去正小数至最近整数ceil(x):天花板函数,即加入正小数至最近整数rat(x):将实数x化为分数表示 rats(x):将实数x化为多项分数展开 sign(x):符号函数(Signum function)。 当x<0时,sign(x)=-1; 当x=0时,sign(x)=0; 当x>0时,sign(x)=1。 rem(x,y):求x除以y的馀数 gcd(x,y):整数x和y的最大公因数 lcm(x,y):整数x和y的最小公倍数 exp(x):自然指数 pow2(x):2的指数 log(x):以e为底的对数,即自然对数或 log2(x):以2为底的对数 log10(x):以10为底的对数 二、MATLAB常用的三角函数 sin(x):正弦函数 cos(x):余弦函数

tan(x):正切函数 asin(x):反正弦函数 acos(x):反馀弦函数 atan(x):反正切函数 atan2(x,y):四象限的反正切函数 sinh(x):超越正弦函数 cosh(x):超越馀弦函数 tanh(x):超越正切函数 asinh(x):反超越正弦函数 acosh(x):反超越馀弦函数 atanh(x):反超越正切函数 三、适用於向量的常用函数有: min(x): 向量x的元素的最小值 max(x): 向量x的元素的最大值 mean(x): 向量x的元素的平均值 median(x): 向量x的元素的中位数 std(x): 向量x的元素的标准差 diff(x): 向量x的相邻元素的差 sort(x): 对向量x的元素进行排序(Sorting)length(x): 向量x的元素个数 norm(x): 向量x的欧氏(Euclidean)长度sum(x): 向量x的元素总和 prod(x): 向量x的元素总乘积 cumsum(x): 向量x的累计元素总和cumprod(x): 向量x的累计元素总乘积 dot(x, y): 向量x和y的内积 cross(x, y): 向量x和y的外积 四、MATLAB的永久常数

matlab中的自定义函数与调用

Matlab自定义函数 1、函数文件+调用命令文件:需单独定义一个自定义函数的M文件; 2、函数文件+子函数:定义一个具有多个自定义函数的M文件; 3、Inline:无需M文件,直接定义; 4、Syms+subs:无需M文件,直接定义; 5、字符串+subs:无需M文件,直接定义. 6、匿名函数 7、直接通过@符号定义. 1、函数文件+调用函数文件:定义多个M文件: %调用函数文件:myfile.m clear clc for t=1:10 y=mylfg(t);%调用函数时要注意实参与形参的匹配! fprintf(‘%4d^(1/3)=%6.4f\n’,t,y); end %自定义函数文件:mylfg.m function y=mylfg(x)%注意:函数名(mylfg)必须与文件名(mylfg.m)一致 Y=x^(1/3); 注:这种方法要求自定义函数必须单独写一个M文件,不能与调用的命令文件写在同一个M文件中。 2、函数文件+子函数:定义一个具有多个子函数的M文件 %函数文件:funtry2.m function[]=funtry2()%可以无自变量()或无因变量[] for t=1:10 y=lfg2(t); fprintf('%4d^(1/3)=%6.4f\n',t,y); end function y=lfg2(x)%%子函数 y=x^(1/3);

%注:自定义函数文件funtry2.m中可以定义多个子函数function。子函数lfg2只能被主函数和主函数中的其他子函数调用。 3、Inline:无需M文件,直接定义; %inline命令用来定义一个内联函数:f=inline(‘函数表达式’,‘变量1’,’变量2’,……)。 调用方式:y=f(数值列表)%注意:代入的数值列表顺序应与inline()定义的变量名顺序一致。 例如: f=inline(‘x^2+y’,’x’,’y’); z=f(2,3) Ans=7 注:这种函数定义方式是将它作为一个内部函数调用。特点是,它是基于Matlab的数值运算内核的,所以它的运算速度较快,程序效率更高。缺点是,该方法只能对数值进行代入,不支持符号代入,且对定义后的函数不能进行求导等符号运算。 内联函数定义方式是将f作为一个内部函数调用。其特点是:调用方式最接近于我们平时对函数的定义,使程序更具可读性。同时由于它是基于Matlab的数值计算内核的,所以它的运算速度较快,程序更有效率。 这种定义方式的缺点: 定义一个内联函数用去的内存空间比相同条件下其他的方法要大得多。 该方法只能对数值进行代入,不支持符号代入,并且对于定义后的函数不能进行求导等符号运算。 例:通过命令clear清除工作空间的所有变量后,执行如下指令 Clear Clc f=’x^2’; Syms x g; g=x^2; h=inline(‘x^2’,’x’); whos 4、Syms+subs:无需M文件,直接定义; 用syms定义一个符号表达式,用subs调用: Syms f x%定义符号 f=1/(1+x^2);%定义符号表达式也是符号

matlab各种函数的用法

1 Text函数的用法: 用法 text(x,y,'string')在图形中指定的位置(x,y)上显示字符串string text(x,y,z,'string') 在三维图形空间中的指定位置(x,y,z)上显示字符串string 2, plot([0,z1,z12],'-b','LineWidth',3)[ ]里面表示数组. 3, x,y均为矩阵,plot命令就是画出x,y矩阵对应的二维平面的点形成的曲线。y(:,1)中逗号前是行,逗号后是列,冒号表示从几到几。所以y(:,1)表示第一列的所有元素。如果是y(3:5,1)则表示第一列的第3到第5行对应的元素。只要你的y矩阵有100列,那你当然可以将1改成100。同理,x矩阵也可以这样。 4 sym的意思是symbol,就是后面括号里面是个代数式,要进行符号运算,class()判断对象是什么类型。 5 matlab控制运算精度用的是digits和vpa这两个函数 xs = vpa(x,n) 在n位相对精度下,给出x的数值型符号结果xs xs = vpa(x) 在digits指定的精度下,给出x的数值型符号结果xs

digits用于规定运算精度,比如: digits(20); 这个语句就规定了运算精度是20位有效数字。但并不是规定了就可以使用,因为实际编程中,我们可能有些运算需要控制精度,而有些不需要控制。vpa就用于解决这个问题,凡是用需要控制精度的,我们都对运算表达式使用vpa函数。例如: digits(5); a=vpa(sqrt(2)); 这样a的值就是1.4142,而不是准确的1.4880 又如: digits(5); a=vpa(sqrt(2)); b=sqrt(2); 这样a的值是1.4142,b没有用vpa函数,所以b是1.4880...... 6

matlab中s-function的参数设置,初始化设置,中文介绍,例子详细

s函数一下是s函数的介绍 函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada 等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的 先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。在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个,我们就只需改上面那一段代码为:

自动控制常见MATLAB函数的应用

自动控制常见MATLAB 函数的应用 1、在matlab 中采用roots 函数求解多项式的根,采用conv 函数实 现多项式的积,相互连接的模块的模型求解也相当简单(1)、串联连接命令G=G1*G2(2)、并联连接命令G=G 1±G2(3)、反馈连接命令G=feedback (G1,G2,Sign )(sign 用来表示系统是正反馈或负反馈,sign=-1为负反馈) 例如:① 程序如下: >>p=[1304]; >>roots(p) ans = -3.3553 0.1777+1.0773i 0.1777-1.0773i ②、用matlab 实现: 程序如下: >>p=[321];q=[14]; >>n=conv(p,q) n = 31494③、一个传递函数模型,可以由下面的命令输入:32()34p s s s =++2 ()(321)(4)n s s s s =+++325()345 s G s s s s +=+++

>>num=[15];den=[1345]; >>G=tf(num,den) Transfer function: s +5 --------------------- s^3+3s^2+4s +5 ④、如下图所示,前向传递函数为G (S ) ,反馈回路传递函数为H(S),利用feedback 计算系统的闭环传递函数 程序如下: >>numg=[1];deng=[50000]; >>numh=[11];denh=[12]; >>[num,den]=feedback(numg,deng,numb,denh,-1); >>[num,den]=feedback(numg,deng,numh,denh,-1); >>G=tf(num,den) () R S ???→

MATLAB中S函数编辑流程及相关

S函数编辑流程及相关 1. S函数模板编辑环境进入: 在MA TLAB主界面中直接输入:edit sfuntmpl 即可弹出S函数模板编辑的M文件环境,修改即可。 在MA TLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。 2. S函数模板的相关基础: 1)M文件S函数的引导语句为: t x f p u sys Function [p x str ts flag , ,1 2 ,...) , , ,0 , ] ,( , S函数默认的四个输入参数:t ,x ,u ,flag S函数默认的四个输出函数:sys ,x0 ,str ,ts 各个参数的含义如下: T :代表当前的仿真时间,该输入决定了下一个采样时间; X :表示状态向量,行向量,引用格式:X(1),X(2) U :表示输入向量; Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值; Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates 里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x. X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ]

Str :空矩阵,无具体含义; Ts :包含模块采样时间和偏差的矩阵。[period, offset] 当Ts为-1时,表示与输入信号同采样周期。 2)S函数工作方式: Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件和Sizes 数组; Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。 Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间和主时间步的要求; Flag = 3时,调用mdlOutputs函数,计算S函数的输出; Flag = 4时,调用mdlGetTimeOfNextV arHit函数,计算下一个采样点的绝对时间,这个方法仅仅是使用户在mdlInitializeSize 里说明一个可变的离散采样时间; Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。 3)S函数仿真过程: ①初始化:mdlInitializeSizes,初始化S函数 ●初始化SimStruct,包含了S函数的所有信息; ●设置输入、输出端口数; ●设置采样时间; ●分配存储空间。

MATLAB_M文件与M函数

M文件与M函数 Matlab输入命令的常用方式有两种:一种是直接在Matlab的命令窗门中逐条输入Matlab 命令;二是m文件工作方式。当命令行很简单时,使用逐条输入方式还是比较方便的。但当命令行很多时(比如说几十行乃至全成百上千行命令),显然再使用这种方式输入MATLAB 命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来了很大的麻烦。这时,建议采用Matlab命令的第二种输入形式m文件工作方式。 m文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序的修改与维护。m文件直接采用Matlab命令编写,就像在Matlab 的命令窗口直接输入命令一样,因此调试起来也十分方便,并且增强了程序的交互性。 m文件与其他文本文件一样,可以在任何文本编辑器中进打编辑、存储、修改和读取。利用m文件还可以根据白己的需要编写一些函数,这些函数也可以橡Matlab提供的函数一样进行调用。从某种意义上说,这也是对MATLAB的二次开发。 m文件有两种形式:一种是命令方式或称脚本方式;另一种就是函数文件形式。两种形式的文件扩展名均是.m。 1、M文件 当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。将所有要执行的命令按顺序放到一个扩展名为.m的文本文件中,每次运行时只需在MATLAB 的命令窗口输入m文件的文件名就可以了。需要注意的是,m文件最好直接放在Matlab 的默认搜索路径下(一般是Matlab安装目录的子目录work中),这样就不用设置m文件的路径了,否则应当用路径操作指令path重新设置路径。另外,m文件名不应该与Matlab的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。Matlab对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。命令文件可以访问Matlab工作空间里的任何变量及数据。命令文件运行过程中产生的所有变量都等价于从Matlab工作空间中创建这些变量。因此,任何其他命令文件和函数都可以自由地访问这些变量。这些变量一旦产生就一直保存在内存中,只有对它们重新赋值,它们的原有值才会变化。关机后,这里变量也就全部消失了。另外,在命令窗口中运行clear命令,也可以把这些变量从工作空间中删去。当然,在Matlab的工作空间窗口中也可以用鼠标选择想要删除的变量,从而将这些变量从工作空间中删除。 接下来,编写一个名为test.m的命令文件,用来计算矩阵1到100的和,并把它放到变量s中。 第一步创建新的M-文件。在Matlab主菜单上选择菜单命令File→New→M-File

利用matlab编写S函数求解微分方程

利用matlab编写S函数求解微分方程

自动化专业综合设计报告 设计题目:利用matlab编写S函数求解微分方程 所在实验室:自动化系统仿真实验室 指导教师:郭卫平 学生姓名律迪迪 班级文自0921 学号200990519114 成绩评定:

一、设计目的 了解使用simulink的扩展工具——S-函数,s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的,它的魅力在于完美结合了simulink框图简洁明快的特点和编程灵活方便的优点,提供了增强和扩展sinulink能力的强大机制,同时也是使用RTW实现实时仿真的关键。 二、设计要求 求解解微分方程 y’=y-2x/y

y(0)=1 要求利用matlab编写S函数求解 三、设计内容(可加附页) 【步骤1】获取状态空间表达式。 在matlab中输入 dsolve(‘Dy=y-2*x/y’,’y(0)=1’,’x’) 得到 y=(2*x+1).^(1/2); 【步骤2】建立s函数的m文件。 利用21·用S函数模板文件。 以下是修改之后的模板文件sfuntmpl.m的内容。function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag) %SFUNTMPL General M-file S-function template % With M-file S-functions, you can define you own ordinary differential % equations (ODEs), discrete system equations, and/or just about % any type of algorithm to be used within a Simulink block diagram. %

最新Matlab中常见数学函数的使用

给自己看的----Matlab的内部常数(转) 2008/06/19 14:01[Ctrl C/V--学校 ] MATLAB基本知识 Matlab的内部常数 pi 圆周率 exp(1) 自然对数的底数e i 或j 虚数单位 Inf或inf 无穷大 Matlab的常用内部数学函数

如何用matlab进行多项式运算 (1)合并同类项 syms 表达式中包含的变量 collect(表达式,指定的变量) (2)因式分解 syms 表达式中包含的变量factor(表达式) (3)展开 syms 表达式中包含的变量 expand(表达式) 我们也可在matlab中调用maple的命令进行多项式的运算,调用格式如下: maple(’maple中多项式的运算命令’) 如何用matlab进行分式运算 发现matlab只有一条处理分式问题的命令,其使用格式如下: [n,d]=numden(f)把符号表达式f化简为有理形式,其中分子和分母的系数为整数且分子分母不含公约项,返回结果n为分子,d为分母。注意:f必须为符号表达式 不过我们可以调用maple的命令,调用方法如下: maple(’denom(f)’)提取分式f的分母 maple(’numer(f)’)提取分式f的分子 maple(’normal(f)’ ) 把分式f的分子与分母约分成最简形式 maple(’expand(f)’) 把分式f的分子展开,分母不变且被看成单项。 maple(’factor(f)’) 把分式f的分母和分子因式分解,并进行约分。 如何用Matlab进行因式分解 syms 表达式中包含的变量factor(表达式) 如何用Matlab展开 syms 表达式中包含的变量expand(表达式) 如何用Matlab进行化简 syms 表达式中包含的变量simplify(表达式) 如何用Matlab合并同类项 syms 表达式中包含的变量collect(表达式,指定的变量) 如何用Matlab进行数学式的转换 调用Maple中数学式的转换命令,调用格式如下: maple(‘Maple的数学式转换命令’) 即:maple(‘convert(表达式,form)’)将表达式转换成form的表示方式 maple(‘convert(表达式,form, x)’)指定变量为x,将依赖于变量x的函数转换成form的表示方式(此指令仅对form为exp与sincos的转换式有用) 如何用Matlab进行变量替换 syms 表达式和代换式中包含的所有变量subs(表达式,要替换的变量或式子,代换式) 如何用matlab进行复数运算 a+b*i 或 a +b*j表示复数a+bi 或a+bj real(z)求复数z的实部 imag(z)求复数z的虚部 abs(z)求复数z的模 angle(z)求复数z的辐角, conj(z)求复数z的共轭复数 exp(z)复数的指数函数,表示e^z 如何在matlab中表示集合 [a, b, c,…] 表示由a, b, c,…组成的集合(注意:元素之间也可用空格隔开) unique(A) 表示集合A的最小等效集合(每个元素只出现一次) 也可调用maple的命令,格式如下: maple('{a, b, c,…}')表示由a, b, c,…组成的集合 下列命令可以生成特殊的集合: maple(‘{seq(f(i),i=n..m)}’)生成集合{f(n), f(n+1), f(n+2), … , f(m)} 如何用Matlab求集合的交集、并集、差集和补集

matlab中s函数编写心得(转)(最新整理)

matlab中s函数编写心得(转) Part I: 所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)< xmlnamespace prefix ="o" ns ="urn:schemas- microsoft-com:office:office" /> 先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等 先介绍一下simulink的仿真过程(以便理解s函数),simulink 的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束. 在matlab的workspace里输入edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构.

1. 函数的函数头 函数的第一行: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)是偏移量 2. 函数分析 下面结合sfuntmpl.m中的代码来讲具体的结构: switch flag, %判断flag,看当前处于哪个状态 case 0, [sys,x0,str,ts]=mdlInitializeSizes; // 解释说明 flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第149行定义. 其中的参数sys是一个结构体,它用来设置模块的一些参数,各个参 数详细说明如下 size = simsizes;%用于设置模块参数的结构体用simsizes来生

matlab中的S函数

S函数的简介及编写 摘自恒润科技S-function的编写 1. S函数模板编辑环境进入: 在MATLAB主界面中直接输入:edit sfuntmpl 即可弹出S函数模板编辑的M文件环境,修改即可。 在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。 2. S函数模板的相关基础: 1)M文件S函数的引导语句为: x t flag f u Function [p sys x str ts p , ,1 2 ,...) , , ,0 , ] ,( , S函数默认的四个输入参数:t ,x ,u ,flag S函数默认的四个输出函数:sys ,x0 ,str ,ts 各个参数的含义如下: T :代表当前的仿真时间,该输入决定了下一个采样时间; X :表示状态向量,行向量,引用格式:X(1),X(2) U :表示输入向量; Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值; Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x. X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ] Str :空矩阵,无具体含义;

Ts :包含模块采样时间和偏差的矩阵。[period, offset] 当Ts为-1时,表示与输入信号同采样周期。 2)S函数工作方式: Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件和Sizes数组; Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。 Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间和主时间步的要求; Flag = 3时,调用mdlOutputs函数,计算S函数的输出; Flag = 4时,调用mdlGetTimeOfNextVarHit函数,计算下一个采样点的绝对时间,这个方法仅仅是使用户在mdlInitializeSize 里说明一个可变的离散采样时间; Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。 3)S函数仿真过程: ①初始化:mdlInitializeSizes,初始化S函数 ●初始化SimStruct,包含了S函数的所有信息; ●设置输入、输出端口数; ●设置采样时间; ●分配存储空间。 ②数值积分:mdlDerivatives ●用于连续状态的求解和非采样过零点;

Matlab的常用函数及指令简单介绍

摘要本文从计算机语言、数学建模、网络控制系统仿真与结构化思维等方面阐述了半年来学习Matlab的心得体会与感想。由于个人知识有限在部分细节问题的理解上可能存有偏差还请老师批评指正不吝赐教。关键词Matlab语言数学建模软件网络控制系统仿真 结构化思维 - 1 - 学习Matlab快半个学期了虽然还有很多问题不是很清楚但通过实践学习我对于Matlab总算有个整体的理解而且每次上机操作都会有一定的收获和感想下面就谈谈我个人对于Matlab的一些看法。 Matlab语言 Matlab和其它语言不一样我这个学期学习的是C语言另外对于Action Script、HTML、php语言也接触过一些。C语言主要是面向过程的它的灵活性比较强可根据自己的意图编辑程序但所耗费的时间和精力比较大。例如定义变量就分为int、float、char等类型十分麻烦而Action Script与php就显得比较随意不必纠结于哪一种类型的变量比如定义Var number3Var playtrue即可。相对于前两者而言Matlab则显得更为灵活与快捷它是一门解释性语言能自动将高级语言翻译成机器语言。比如求tf2当t012345时tf的值。如果使用C语言则需要定义变量调用math函数还要应用for循环、输出函数而Matlab则不然只需输入t0:5f2.t然后回车即可。另外Matlab还配有许多常用公式操作起来十分方便例如想求出223tftftytyty在10y10y时的零输入响应应用dsolve 函数只需输入xdsolveD2y3Dy2y0y01Dy01 回车即得结果x3exp-t-2exp-2t。或许也正是Matlab语言简洁、优化的特点才使得它在学术界被广泛应用吧。 数学建模 对于数学建模而言Matlab是一款相当不错的建模辅助工具因为Matlab中有统计函数线性分析函数插值函数非线性分析函数等等这些数模必备的函数而且Matlab强大的绘图功能可使很多数学演算过程变得可视化。这些对于分析问题都很有帮助。虽然我们学习的Matlab是电子信息工程方向的但在下个学期班里的大部分同学都要参加数模竞赛

Matlab自定义函数的五种方法

Matlab自定义函数的五种方法 [转] n 1、函数文件+调用命令文件:需单独定义一个自定义函数的M文件; n 2、函数文件+子函数:定义一个具有多个自定义函数的M文件; n 3、Inline:无需M文件,直接定义; n 4、Syms+subs: 无需M文件,直接定义; n 5、字符串+subs:无需M文件,直接定义. 1、函数文件+调用函数文件:定义多个M文件: % 调用函数文件:myfile.m clear clc for t=1:10 y=mylfg(t); fprintf(‘%4d^(1/3)=%6.4f\n’,t,y); end %自定义函数文件: mylfg.m function y=mylfg(x) %注意:函数名(mylfg)必须与文件名(mylfg.m)一致 Y=x^(1/3); 注:这种方法要求自定义函数必须单独写一个M文件,不能与调用的命令文件写在同一个M文件中。 2、函数文件+子函数:定义一个具有多个子函数的M 文件

%命令文件:funtry2.m function []=funtry2() for t=1:10 y=lfg2(t) fprintf(‘%4d^(1/3)=%6.4f\n’); End function y=lfg2(x) Y= x^(1/3); %注:自定义函数文件funtry2.m中可以定义多个子函数function。子函数lfg2只能被主函数和主函数中的其他子函数调用。 3、Inline:无需M文件,直接定义; %inline命令用来定义一个内联函数:f=inline(‘函数表达式’, ‘变量1’,’变量2’,……)。 调用方式:y=f(数值列表) %注意:代入的数值列表顺序应与inline()定义的变量名顺序一致。 例如: f=inline(‘x^2+y’,’x’,’y’); z=f(2,3) Ans=7 注:这种函数定义方式是将它作为一个内部函数调用。特点是,它是基于Matlab 的数值运算内核的,所以它的运算速度较快,程序效率更高。缺点是,该方法只能对数值进行代入,不支持符号代入,且对定义后的函数不能进行求导等符号运算。 例: Clear Clc

MatLab在函数的求解方法

MatLab & 数学建模第四讲数值计算

一、方程求解 求解单个代数方程 MATLAB具有求解符号表达式的工具,如果表达式不是一个方程式(不含等号),则在求解之前函数solve将表达式置成等于0。 >> solve( ' a*x^2+b*x+c ' ) % solve for the roots of the eqution ans= [1/2/a*(-b+(b^2-4*a*c)^1/2)] [1/2/a*(-b-(b^2-4*a*c)^1/2)] 结果是符号向量,其元素是方程的2个解。如果想对非缺省x变量求解,solve 必须指定变量。 >> solve( ' a*x^2+b*x+c ' , ' b ' ) % solve for b ans= -(a*x^2+c)/x 带有等号的符号方程也可以求解。 >> f=solve( ' cos(x)=sin(x) ' ) % solve for x f= 1/4*pi >> t=solve( ' tan(2*x)=sin(x) ' ) t= [ 0] [acos(1/2+1/2*3^(1/2))] [acos(1/2=1/2*3^(1/2))] 并得到数值解。 >> numeric(f) ans=

0.7854 >> numeric(t) ans= 0 + 0.8314i 1.9455 注意在求解周期函数方程时,有无穷多的解。在这种情况下,solve对解的搜索范围限制在接近于零的有限范围,并返回非唯一的解的子集。 如果不能求得符号解,就计算可变精度解。 >> x=solve( ' exp(x)=tan(x) ' ) x= 1.306326940423079 代数方程组求解 可以同时求解若干代数方程,语句solve(s1,s2,.....,sn)对缺省变量求解n个方程,语句solve(s1,s2,...,sn,' v1,v2,...,vn ')对n个' v1,v2,...vn '的未知数求解n个方程。 solve(f) 解符号方程式f。 solve(f1,…,fn) 解由f1,…,fn组成的联立方程式。 我们先定义以下的方程式: >>eq1 = 'x-3=4'; % 注意也可写成'eq1=x-7' >>eq2 = 'x*2-x-6=0'; % 注意也可写成'eq2=x*2-x-6' >>eq3 = 'x2+2*x+4=0'; >>eq4 = '3*x+2*y-z=10'; >>eq5 = '-x+3*y+2*z=5'; >>eq6 = 'x-y-z=-1'; >>solve(eq1) ans=

matlab(Simulink)中S-function函数编写规则

matlab(Simulink)中S-function函数编写规则 s函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单) 先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的 先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。 在matlab的workspace里打edit sf untmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。它的第一行是这样的:f unction [sys,x0,str,ts]=sf untmpl(t,x,u,f lag) 先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),f lag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据f lag的不同而不同(下面将结合f l ag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。 下面结合sf untmpl.m中的代码来讲具体的结构: switch f lag, %判断f lag,看当前处于哪个状态 case 0, [sys,x0,str,ts]=mdlInitializeSizes; f l ag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sf untmpl.m的149行 我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下 size = simsizes;%用于设置模块参数的结构体用simsizes来生成 sizes.NumContStates = 0;%模块连续状态变量的个数 sizes.NumDiscStates = 0;%模块离散状态变量的个数 sizes.NumOutputs = 0;%模块输出变量的个数 sizes.NumInputs = 0;%模块输入变量的个数 sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能%直接控制输出) sizes.NumSample Times = 1;%模块的采样时间个数,至少是一个 sys = simsizes(sizes); %设置完后赋给sys输出 举个例子,考虑如下模型: dx/dt=f c(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 %TimeOfNextV arHit函数中具体介绍 嘻嘻,总算讲完了初始化,后面的应该快了 在sf untmpl的106行继续往下看: case 1, sys=mdlDerivatives(t,x,u); f l ag=1表示此时要计算连续状态的微分,即上面提到的dx/dt=f c(t,x,u)中的dx/dt,找到 mdlDerivatives函数(在193行)如果设置连续状态变量个数为0,此处只需sys=[]; 就可以了(如sf untmpl中一样),按我们上述讨论的那个模型,此处改成 sys=f c(t,x(1),u)或sys=A*x(1)+B*u %我们这儿x(1)是连续状态变量,而x(2)是离散的,这儿只用到连续的,此时的输出sys就是微分 继续,在sf untmpl的112行: case 2, sys=mdlU pdate(t,x,u);

MatLab常用函数大全

1、求组合数 C,则输入: 求k n nchoosek(n,k) 例:nchoosek(4,2) = 6. 2、求阶乘 求n!.则输入: Factorial(n). 例:factorial(5) = 120. 3、求全排列 perms(x). 例:求x = [1,2,3]; Perms(x),输出结果为: ans = 3 2 1 3 1 2 2 3 1 2 1 3 1 2 3 1 3 2 4、求指数 求a^b:Power(a,b) ; 例:求2^3 ; Ans = pow(2,3) ; 5、求行列式 求矩阵A的行列式:det(A); 例:A=[1 2;3 4] ; 则det(A) = -2 ; 6、求矩阵的转置 求矩阵A的转置矩阵:A’ 转置符号为单引号. 7、求向量的指数 求向量p=[1 2 3 4]'的三次方:p.^3 例: p=[1 2 3 4]' A=[p,p.^2,p.^3,p.^4] 结果为:

注意:在p 与符号”^”之间的”.”不可少. 8、求自然对数 求ln(x):Log(x) 例:log(2) = 0.6931 9、求矩阵的逆矩阵 求矩阵A 的逆矩阵:inv(A) 例:a= [1 2;3 4]; 则 10、多项式的乘法运算 函数conv(p1,p2)用于求多项式p1和p2的乘积。这里,p1、p2是两个多项式系数向量。 例2-2 求多项式43810x x +-和223x x -+的乘积。 命令如下: p1=[1,8,0,0,-10]; p2=[2,-1,3]; c=conv(p1,p2) 11、多项式除法 函数[q ,r]=deconv(p1,p2)用于多项式p1和p2作除法运算,其中q 返回多项式p1除以p2的商式,r 返回p1除以p2的余式。这里,q 和r 仍是多项式系数向量。 例2-3 求多项式43810x x +-除以多项式223x x -+的结果。 命令如下: p1=[1,8,0,0,-10]; p2=[2,-1,3]; [q,r]=deconv(p1,p2) 12、求一个向量的最大值 求一个向量x 的最大值的函数有两种调用格式,分别是:

相关主题
文本预览
相关文档 最新文档