使用符号数学工具箱为Simscape库创建一个基于方程的自定义组件。
这符号数学工具箱提供一种灵活的方法来开发任何空间尺寸的第一个工程原则的模型。您可以为稳态或瞬态物理学开发数学模型。
您可以开发和解决所需的方程,以代表您的组件所需的物理;并在输入之间执行您自己的降阶模型映射X和感兴趣的数量f(x)。
这里F是自定义分量,它可以以如下形式表示控制方程:
数学公式
ode和pde的数值模拟
本示例中的步骤是
参数化使用的Simscape部件symreadsscvariables.
使用以下方法为Simscape组件定义自定义方程差
解决解析使用稳态方程解决
和潜艇
利用MATLAB软件对时变方程进行数值求解matlabfunction.
和数值
创建使用的Simscape组件symWriteSSC
要运行此示例,您必须为Simscape和符号数学工具箱具有许可证。
直流电动机是用于将电能转换成机械能的装置,反之亦然。DC电动机的示意图如下所示(左图)。模拟DC电机的块Simscape电™(右图),这是一个可选的产品Simscape.
在该示例中,我们将使用控制常微分方程(ODES)导出DC电动机的减少的模型表示。对于直流电动机,电压和电流来自Kirchhoff的定律,并且机械扭矩的公式来自牛顿的法律。使用这些方程,我们可以实现自定义和参数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
念,价值观,以及从模板组件的参数的单位。
[parNames, parValues, parUnits] = symReadSSCParameters('mymotortemplate');
显示参数,值和相应的单元作为向量。
VPA([parNames; parValues; parUnits],10)
ans =.
通过使用使用该参数名称将参数名称添加到MATLAB工作区Syms.
功能。参数在工作区中显示为符号变量。您可以使用谁
列出工作区中的变量。
syms(滞后)syms
您的符号变量是:J KB KI L r ANS博士
读取并显示组件变量的名称。用ReturnFunction
同时这些变量转换成变量的函数T.
.
[varfuns,varvalues,amarunits] = symreadsscvariables('mymotortemplate'那'返回功能', 真的);VPA([varfuns; varvalues; amarkunits],10)
ans =.
通过使用使用的将变量名添加到MATLAB工作区Syms.
功能。变量显示为工作区中的符号函数。验证您已声明所有必需的符号变量和功能Syms.
.
信谊(varFuns)对称
您的符号变量是:斯基博士řVb的吨扭矩我KB L V ANS的tau瓦特
用于机械扭矩的微分方程被定义为EQ1.
和EQ2.
.它)
代表当前和值w(t)
角速度。
eq1 =扭矩+ j * diff(w(t))== -dr * w(t)+ tau(t)
EQ1(T)=
eq = tau(t) = Ki*I(t)
EQ2 =
电压和电流的方程是EQ3.
和EQ4.
.V(t)的和vb(t)分别表示施加的电压和反电动势。
eq3 = l * diff(i(t))+ r * i(t)== v(t) - vb(t)
EQ3 =
eq4 = vb(t)== kb * w(t)
EQ4 =
我们可以一起列出。这里,电机的转矩与电流成正比。
EQS =公式([EQ1; EQ2; EQ3; EQ4])
eqs =.
提取方程的左侧和右侧。
操作数=儿童(EQS);operlist = [操作数{:}];LHS = Operlist(1:2:结束)
LHS =1×4单元阵列{1x1 sym} {1x1 sym} {1x1 sym} {1x1 sym}
rhs = operList(2:2:结束)
RHS =1×4单元阵列{1x1 sym} {1x1 sym} {1x1 sym} {1x1 sym}
第二和第四方程定义的值tau蛋白(t)的
和vb(t)
.将四个方程的方程组简化为两个方程的方程组,将这些值代入第一个和第三个方程。
等式(1)=潜艇(方程(1),左轴(2),右轴(2))
公式=
等式(2)=潜艇(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)
和它)
.例如,用符号变量替换它们WW.
和2
.
Syms.WW.2equations_steady =潜艇(方程,[W(T),I(T)],[WW,II]);导致=解决(equations_steady,WW,ⅱ);steadyStateW = VPA(result.ww,10)
stignedstatew =
steadyStateI = VPA(result.ii,10)
stiefaseStatei =
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结构] x:[1x293775双] y:[2x293775双]统计:[1x1 struct] iData:[1x1 struct]
评估以下几点的解决方案T.=(0.5, 0.75, 1)。第一个值是当前值它)
和所述第二值是角速度值w(t)
.我们看到角速度的解决方案开始接近稳定状态steadyStateW
.
德瓦尔(溶液,0.5),德瓦尔(溶液,0.75),德瓦尔(溶液,1)
ans =.2×10.2563 4.7795
ans =.2×10.2563 - 5.5034
ans =.2×10.2563 5.8453
steadyStateW
stignedstatew =
绘制解决方案。
时间= linspace(0,2.5);iValues =德瓦尔(溶液,时间,1);wValues =德瓦尔(溶液,时间,2);steadyStateValuesI = VPA(steadyStateI *酮(1100),10);steadyStateValuesW = VPA(steadyStateW *酮(1100),10);数字;plot1 =副区(2,1,1);plot2 =副区(2,1,2);图(plot1,时间,wValues,'蓝色',时间,steedstaltevaluesw,' - 红色的'那'行宽',1)情节(plot2,时间,iValues,“绿色”,时间,steadyStateValuesI,' - 红色的'那'行宽',1)标题(plot1,“直流电机-角速度”)标题(plot2,“直流电动机 - 当前”) ylabel (plot1“角速度(rad / s)”)Ylabel(Plot2,'当前[a]')包含(plot1“时间[s]”)Xlabel(Plot2,“时间[s]”)传奇(Plot1,“w (t)”那“w (t):稳态”那“位置”那'northeastoutside')传奇(Plot2,“我(t)”那'我(t):稳态'那“位置”那'northeastoutside')
使用原始方程生成Simscape码方程式
.
symWriteSSC(“MyMotor.ssc”那“MyMotorTemplate.ssc”,eqs,......'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_buildMyLib;
生成的Simulink万博1manbetx库 'MyLib_lib' 当前目录 '的/ tmp / Bdoc21a_1606923_192608 / tp4cf1fd6c /符号,ex98670381' ...