使用符号数学工具箱为Simscape库创建一个基于方程的自定义组件。
的符号数学工具箱提供了一种灵活的方法,可以从任何空间维度的第一工程原理开发模型。您可以为稳态或瞬态物理开发数学模型。
您可以开发和解决所需的方程,以代表您的组件所需的物理;并在输入之间执行您自己的降阶模型映射x和一定数量的利息f (x)。
在这里f是可表示以下形式的控制方程的自定义组件:
数学公式
ode和pde的数值模拟
本示例中的步骤如下
使用参数化Simscape组件symreadscs变量
使用以下方法为Simscape组件定义自定义方程diff
用解析的方法求解稳态方程解决
和潜艇
利用MATLAB软件对时变方程进行数值求解matlabFunction
和数值
使用symWriteSSC
要运行此示例,您必须拥有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
从模板组件中读取参数的名称、值和单元。
[parNames,parValues,parUnits]=symreadscscparameters(“MyMotorTemplate”);
以向量的形式显示参数、它们的值和相应的单位。
vpa ([parNames;parValues;parUnits), 10)
ans =
通过使用符号
作用参数在工作空间中显示为符号变量。你可以用谁
在工作区中列出变量。
syms(parNames)syms
您的符号变量是:Dr J Kb Ki L R ans
读取并显示组件变量的名称。使用ReturnFunction
同时将这些变量转换为该变量的函数t
.
[varFuns,varValues,varUnits]=symReadSSCVariables(“MyMotorTemplate”,“返回函数”,真正的);vpa ([varFuns;varValues;varUnits), 10)
ans =
使用符号
函数。变量在工作区中以符号函数的形式出现。使用。验证您已经声明了所有必需的符号变量和函数符号
.
syms(varFuns)syms
符号变量是Dr J Ki R Vb t扭矩I Kb lv和w
机械转矩的微分方程定义为eq1
和eq2
.I(t)
表示当前和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)分别表示施加的电压和反电动势。
e3 = L*diff(I(t)) + R*I(t) = V(t) - Vb(t)
eq3=
eq4=Vb(t)=Kb*w(t)
eq4=
我们可以把它们列在一起。这里,假设电机的转矩与电流成正比。
方程式=公式([eq1;eq2;eq3;eq4])
方程式=
提取方程式的左侧和右侧。
操作数=子对象(eq);operList=[操作数{:}];lhs=操作列表(1:2:结束)
lh =1×4单元阵列{[J*diff(w(t),t..]}{[tau(t)]}{[L*diff(I(t),t..]}{[Vb(t)]}
rhs = operList(2:2:结束)
rhs=1×4单元阵列{[tau(t)-Dr*w(t)]}{[Ki*I(t)]}{[V(t)-Vb(t)]}{[Kb*w(t)]}
第二个和第四个方程定义值τ(t)
和Vb(t)
.将四个方程的方程组简化为两个方程的方程组,将这些值代入第一个和第三个方程。
式(1)= subs(eqs(1), lhs(2), rhs(2))
公式=
方程(2)=子方程(方程(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)
和I(t)
。例如,用符号变量替换它们栈单
和2
.
符号栈单2equations_steady = subs(equation, [w(t),I(t)], [ww,ii]);结果=解决(ww, equations_steady ii);steadyStateW = vpa (result.ww, 10)
稳定状态=
steadyStateI = vpa (result.ii, 10)
稳定状态=
matlabFunction
和数值
.创建一个有效的输入数值
从符号方程出发。使用odeToVectorField
建立了描述动态系统的MATLAB程序
在初始条件下
.
[vequations, tVals] = odeToVectorField(equation)
vfEquations =
tVals =
M = matlabFunction (vfEquations“var”, {“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: [0 2.414e -09 1.4468e-08 7.4754e-08 3.7618e-07 1.8833e-06…y: [2x293775 double] stats: [1x1 struct] data: [1x1 struct]
在以下时间点评估解决方案t=(0.5, 0.75, 1)。第一个值是当前值I(t)
第二个值是角速度w (t)
. 我们看到角速度的解开始接近稳定状态steadyStateW
.
德瓦尔(解决方案,0.5),德瓦尔(解决方案,综合成绩),德瓦尔(解决方案,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(solution, time, 1);wValues = deval(解,时间,2);steadyStateValuesI = vpa (steadyStateI * (1100), 10);steadyStateValuesW = vpa (steadyStateW * (1100), 10);图;plot1 =次要情节(2,1,1);plot2 =次要情节(2,1,2);情节(wValues plot1,时间,“蓝色”,时间,稳定状态值SW,“——红”,“线宽”, 1) plot(plot2, time, iValues,“绿色”、时间、steadyStateValuesI“——红”,“线宽”1)标题(plot1“直流电机-角速度”)标题(plot2“直流电机-电流”) ylabel (plot1“角速度(rad / s)”) ylabel (plot2“当前[A]”)包含(plot1‘时间’)包含(plot2‘时间’)图例(图1,“w (t)”,“w (t):稳态”,“位置”,“northeastoutside”)图例(图2,“我(t)”,‘I(t):稳态’,“位置”,“northeastoutside”)
使用原始方程生成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_buildMyLib;
在/tmp/Bdoc2金宝app1b_1757077_234318/tp238e4c8b/symbolic-ex98670381'目录下生成Simulink库'MyLib_lib'…