使用符号数学工具箱为Simscape库创建一个基于方程的自定义组件。
这符号数学工具箱提供一种灵活的方法来开发任何空间尺寸的第一个工程原则的模型。您可以为稳态或瞬态物理学开发数学模型。
您可以开发和解决所需的方程,以代表您的组件所需的物理;并在输入之间执行您自己的降阶模型映射X和一定数量的兴趣f (x)。
这里F是定制组件,其可以表示以何种形式的管理方程式:
数学公式
ode和pde的数值模拟
本示例中的步骤如下
参数化SIMSCAPE组件使用symReadSSCVariables
使用以下方法为Simscape组件定义自定义方程差
用分析使用的稳态方程解决
和潜艇
利用MATLAB软件对时变方程进行数值求解matlabFunction
和数值
使用simscape组件使用symWriteSSC
要运行此示例,您必须拥有Simscape和Symbolic Math Toolbox的许可证。
直流电动机是一种把电能转换成机械能,反之亦然的装置。直流电机的原理图如下(左图)。模块模拟直流电机提供Simscape电气™(右图),这是一个可选产品simscape..
在本例中,我们将使用控制常微分方程(ode)推导直流电机的降阶模型表示。对于直流电动机,电压和电流由基尔霍夫定律导出,机械转矩的公式由牛顿定律导出。使用这些方程,我们可以实现自定义的参数化Simscape组件。
假设您有一个Simscape组件mymotortemplate.ssc.
在您的当前文件夹或在MATLAB的默认路径。这个分量还没有方程。模板记录了将用于开发我们的电机的参数和变量。您可以使用类型
以提供该模板的预览。
类型mymotortemplate.ssc.
这个块实现了一个自定义的直流电机节点p = foundation.electric .electrical;% +:left n = foundation.electric .electric;% -:left r = foundation.mechanical.rotation .rotation;% R:右c =基础。机械的。旋转的。旋转的;% C:右端参数R ={3.9, '欧姆'};%电枢电阻L = {0.000012, 'H'};%电枢电感J = {0.000001, 'kg*m^2'};%惯性Dr = {0.000003, '(N*m*s)/rad'};%转子阻尼Ki = {0.000072, '(N*m)/A'};%扭矩常数Kb = {0.000072, '(V*s)/rad'}; %Back-emf constant end variables torque = {0, 'N*m'}; %Total Torque tau = {0, 'N*m'}; %Electric Torque w = {0, 'rad/s'}; %Angular Velocity I = {0, 'A'}; %Current V = {0, 'V'}; %Applied voltage Vb = {0, 'V'}; %Counter electromotive force end function setup if(R<=0) error('Winding resistance must be greater than 0.'); end end branches torque : r.t -> c.t; % Through variable tau from r to c I : p.i -> n.i; % Through variable i from p to n end equations w == r.w -c.w; % Across variable w from r to c V == p.v -n.v; % Across variable v from p to n end end
从模板组件读取参数的名称,值和单位。
[帕扣,帕拉瓦,褶皱] = SymReadsScParameters(“MyMotorTemplate”);
以向量的形式显示参数、它们的值和相应的单位。
VPA([滞后;帕拉瓦斯;鹦鹉],10)
ans =.
将参数名称添加到MATLAB工作区中信谊
函数。参数在工作区中显示为符号变量。您可以使用WHO
在工作区中列出变量。
信谊(parNames)对称
你的符号变量是:Dr jkb Ki L R ans
读取并显示组件变量的名称。使用ReturnFunction
同时将这些变量转换为变量的函数T.
.
[varFuns, varValues, varUnits] = symReadSSCVariables(“MyMotorTemplate”那“ReturnFunction”,真正的);vpa ([varFuns;varValues;varUnits), 10)
ans =.
将变量名添加到MATLAB工作区中信谊
函数。变量在工作区中以符号函数的形式出现。使用。验证您已经声明了所有必需的符号变量和函数信谊
.
Syms(varfuns)syms
您的符号变量是:J Ki R VB T扭矩I kb l v ans tau w
机械扭矩的微分方程被定义为EQ1.
和EQ2.
.我(t)
表示当前和w(t)
角速度。
q =转矩+ J*diff(w(t)) = -Dr*w(t) + tau(t)
eq1(t)=
eq = tau(t) = Ki*I(t)
eq2 =
电压和电流的方程是EQ3.
和EQ4.
.v(t)和Vb (t)分别表示施加的电压和反电动势。
e3 = L*diff(I(t)) + R*I(t) = V(t) - Vb(t)
eq3 =
eq4 = Vb(t) == Kb*w(t)
eq4 =
我们可以一起列出它们。这里,假设电动机的扭矩与电流成比例。
方程式=公式([eq1;eq2;eq3;eq4])
方程式=
提取方程的左右两边。
操作数=孩子(方程式);operList =[操作数{:}];lh = operList(1:2:结束)
LHS =1×4个单元阵列{1x1 sym} {1x1 sym} {1x1 sym}
rhs = operList(2:2:结束)
rhs =1×4个单元阵列{1x1 sym} {1x1 sym} {1x1 sym}
第二和第四方程定义值tau(t)
和Vb (t)
.将四个方程的方程组简化为两个方程的方程组,将这些值代入第一个和第三个方程。
等式(1)=潜艇(EQS(1),LHS(2),RHS(2))
等式=
式(2)= subs(eqs(3), lhs(4), rhs(4))
等式=
方程”。
ans =.
在解决方程之前,用它们的数值替换参数。此外,使用v(t)= 1
.
= subs(equation, [parNames,V(t)], [parValues,1]);equation = subs(equation, torque, 0);vpa(方程。',10)
ans =.
为此,删除功能的时间依赖性w(t)
和我(t)
.例如,用符号变量替换它们ww
和2
.
信谊ww2arequations_steady = sumb(方程式,[w(t),i(t)],[ww,ii]);结果=解决(方程式,WW,II);seedionstatew = VPA(结果.ww,10)
steadyStateW =
stiefaedstatei = VPA(结果.II,10)
steadyStateI =
matlabFunction
和数值
.创建一个有效的输入数值
从符号方程。使用odeToVectorField
建立了描述动态系统的MATLAB程序
初始条件
.
[vequations, tVals] = odeToVectorField(equation)
vfequations =.
tVals =
M = matlabFunction (vfEquations'vars',{'T'那“Y”})
M =function_handle与价值:@ (t、Y) [Y(1)。* (-3.25 e + 5) - Y (2) * 6.0 + 8.333333333333333 e + 4; Y(1)。* 7.2 e + 1 Y(2) * 3.0]。
使用初始条件解决微分方程w (0) = 0
和我(0)= 0
.
解决方案= ode45(m,[0 3],[0 0])
解决方案=结构体字段:解决方案:'ode45' extdata: [1x1 struct] x: [1x293775 double] y: [2x293775 double] stats: [1x1 struct] data: [1x1 struct]
在以下时间点评估解决方案T.=(0.5, 0.75, 1)。第一个值是当前值我(t)
并且第二值是角速度w(t)
.我们看到角速度的解开始接近稳态耳段稳定
.
Deval(解决方案,0.5),Deval(解决方案,.75),Deval(解决方案,1)
ans =.2×10.2563 4.7795
ans =.2×10.2563 5.5034
ans =.2×10.2563 - 5.8453
耳段稳定
steadyStateW =
策划解决方案。
时间= linspace(0,2.5);Ivalues = Deval(解决方案,时间,1);wvalues = deval(解决方案,时间,2);stiewsedstatevaluesi = VPA(稳定STESI * ONE(1,100),10);stiewsedstatevaluesw = VPA(侧稳态* vpa(1,100),10);数字;plot1 =子图(2,1,1);plot2 =子图(2,1,2);情节(Plot1,Time,Wvalues,“蓝”、时间、steadyStateValuesW' - 红色的'那“线宽”,1)绘图(Plot2,时间,Ivalues,“绿色”,时间,稳定的valuesi,' - 红色的'那“线宽”,1)标题(Plot1,'直流电动机 - 角速度')标题(Plot2,'直流电机 - 电流') ylabel (plot1“角速度(rad / s)”) ylabel (plot2“当前的(一个)”)包含(plot1'时间[S]')包含(plot2'时间[S]')传说(plot1“w (t)”那“w (t):稳态”那“位置”那“东北朝”)传说(plot2“我(t)”那“我(t):稳态”那“位置”那“东北朝”)
使用原始方程生成Simscape代码方程式
.
Symwritessc(“MyMotor.ssc”那'mymotortemplate.ssc'方程式,...“H1Header”那'%自定义直流电机'那...“HelpText”,{'% This block implements a custom直流电机'})
控件显示生成的组件类型
命令。
类型MyMotor.ssc
这个模块实现了一个自定义的直流电机节点p = foundation.electric .electrical;% +:left n = foundation.electric .electric;% -:left r = foundation.mechanical.rotation .rotation;% R:右c =基础。机械的。旋转的。旋转的;% C:右端参数R ={3.9, '欧姆'};%电枢电阻L = {0.000012, 'H'};%电枢电感J = {0.000001, 'kg*m^2'};%惯性Dr = {0.000003, '(N*m*s)/rad'};%转子阻尼Ki = {0.000072, '(N*m)/A'};%扭矩常数Kb = {0.000072, '(V*s)/rad'}; %Back-emf constant end variables torque = {0, 'N*m'}; %Total Torque tau = {0, 'N*m'}; %Electric Torque w = {0, 'rad/s'}; %Angular Velocity I = {0, 'A'}; %Current V = {0, 'V'}; %Applied voltage Vb = {0, 'V'}; %Counter electromotive force end function setup if(R<=0) error('Winding resistance must be greater than 0.'); end end branches torque : r.t -> c.t; % Through variable tau from r to c I : p.i -> n.i; % Through variable i from p to n end equations w == r.w -c.w; % Across variable w from r to c V == p.v -n.v; % Across variable v from p to n torque+J*w.der == tau-Dr*w; tau == Ki*I; L*I.der+R*I == V-Vb; Vb == Kb*w; end end
从生成的组件构建Simscape库。
如果〜isdir('+ mylib'mkdir)+ MyLib;结尾复制文件MyMotor.ssc+ MyLib;SSC_Build.MyLib;
在当前目录'/ tmp金宝app / bdoc21a_1606923_192608 / tp4cf1fd6c / symbolic-ex98670381'中生成Simulink Library'MyLib_lib'。