创建自定义公式使用符号数学工具箱中的Simscape库基于组件。
的符号数学工具箱提供了开发从第一工程原理模型中的任何空间维度的灵活方式。您可以开发用于稳态或瞬态物理数学模型。
你可以开发和求解方程来表示所需要的物理为您的组件需要;并执行输入之间你自己的降阶模型映射x以及一些有趣的东西F(X)。
在这里f是可以表示的形式控制方程定制组件:
数学公式
常微分方程和偏微分方程的数值模拟
在这个例子中的步骤
使用Simscape组件参数化symReadSSCVariables
定义自定义公式使用您的Simscape组件diff
用解析法求解稳态方程解决
和潜艇
通过使用数值求解与时间相关的等式在MATLABmatlabFunction
和ODE45
使用以下命令创建一个Simscape组件symWriteSSC
要运行这个例子,你必须拥有的Simscape和符号数学工具箱许可证。
一种直流电动机为将电能转换为机械能,并且反之亦然的装置。DC电机的示意图如下所示(左图)。在所提供的模拟直流电动机块的Simscape电气™(右图),这是一个可选产品的Simscape。
在这个例子中,我们将使用管理常微分方程(常微分方程)推导出直流电动机的降阶模型表示。用于DC马达,所述电压和电流从基尔霍夫定律导出和机械转矩的公式从牛顿定律的。使用这些公式,我们可以实现自定义和参数的Simscape组件。
假设你有一个的Simscape组件MyMotorTemplate.ssc
在当前文件夹或默认的MATLAB的路径。该组件没有公式呢。模板记录将被用于开发我们的电机参数和变量。您可以使用类型
提供该模板的预览。
类型MyMotorTemplate.ssc
部件MyMotorTemplate%定制直流电动机%该块实现一个定制的DC马达的节点P = foundation.electrical.electrical;% +:左n = foundation.electric .electrical;% -:左r =基础。机械。旋转。转动;% R:右c =基础。机械。旋转。转动;% C:右端参数R = {3.9, 'Ohm'};电枢电阻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
功能。参数显示为工作区中的符号变量。您可以使用WHO
在工作区列表的变量。
SYMS(parNames)SYMS
你象征性的变量是:J-博士KB文L R ANS
读取和显示组件变量的名称。利用ReturnFunction
同时把这些变量转换成变量的函数t
。
[varFuns,varValues,varUnits] = symReadSSCVariables('MyMotorTemplate','ReturnFunction',真正的);VPA([varFuns; varValues; varUnits],10)
ans =
通过使用添加变量名到MATLAB工作区SYMS
功能。变量出现在工作区中的符号的功能。确认您已声明使用所有必需的符号变量和函数SYMS
。
SYMS(varFuns)SYMS
你的符号变量是:Dr J Ki R Vb t torque I Kb lv ans tau w
将机械转矩的微分方程定义为eq1
和eq2
。它)
代表当前和w (t)
角速度。
EQ1 =扭矩+ J *的diff(值w(t))== -Dr *值w(t)+ tau蛋白(t)的
eq1 (t) =
eq2 = tau(t) == Ki*I(t)
EQ2 =
用于电电压和电流的方程是eq3
和eq4
。V (t)和VB(t)的分别表示施加的电压和反电动势。
EQ3 = L *的diff(I(t))的+ R * I(t)的== V(吨) - VB(t)的
EQ3 =
EQ4 = VB(吨)== KB *值w(t)
EQ4 =
我们可以列出他们在一起。在这里,电机的扭矩被认为是成正比的电流。
方程=式([EQ1; EQ2; EQ3; EQ4])
公式=
解方程的左右两边。
操作数=儿童(方程);operList = [操作数{:}];LHS = operList(1:2:结束)
LHS =
rhs = operList(2:2:结束)
RHS =
第二个和第四个方程定义了这些值τ(t)
和VB(t)的
。为了将四个方程的方程组简化为两个方程的方程组,将这些值代入第一个和第三个方程。
方程(1)= subs(eqs(1), lhs(2), rhs(2))
公式=
等式(2)=潜艇(方程(3),左轴(4),右轴(4))
公式=
方程“。
ans =
在求解方程之前,先用数值代替参数。此外,使用V (t) = 1
。
方程=潜艇(方程,[parNames,V(T)],[parValues,1]);方程=潜艇(方程,扭矩,0);VPA(方程。',10)
ans =
为此,删除函数的时间依赖性w (t)
和它)
。例如,替换它们与符号变量WW
和二世
。
SYMSWW二世方程s_steady =子式(方程,[w(t),I(t)], [ww,ii]);结果=解决(ww, equations_steady ii);steadyStateW = vpa (result.ww, 10)
steadyStateW =
steadyStateI = vpa (result.ii, 10)
steadyStateI =
matlabFunction
和ODE45
。创建一个有效的输入ODE45
从符号方程。利用odeToVectorField
创建表示动态系统的MATLAB程序
在初始条件下
。
[vfEquations, tVals] = odeToVectorField(方程式)
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' 扩展数据:[1x1的结构]×:[1x293775双] Y:[2x293775双]统计:[1x1的结构] IDATA:[1x1的结构]
评估解决方案在该时间点之后t= (0.5,0.75,1)。第一个值是当前值它)
第二个值是角速度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
steadyStateW =
画出的解决方案。
时间= linspace (0, - 2.5);iValues = deval(solution, time, 1);wValues = deval(solution, time, 2);steadyStateValuesI = vpa (steadyStateI * (1100), 10);steadyStateValuesW = vpa (steadyStateW * (1100), 10);图;plot1 =次要情节(2,1,1);plot2 =次要情节(2,1,2);情节(wValues plot1,时间,'蓝色',时间,steadyStateValuesW,“——红”,'行宽'(1) plot(plot2,时间,iValues,“绿色”、时间、steadyStateValuesI“——红”,'行宽'1)标题(plot1“直流电动机 - 角速度”)标题(plot2“直流电机-电流”)ylabel(plot1,“角速度[弧度/秒]”)ylabel(plot2,'电流[A]')xlabel(plot1,'时间[s]')xlabel(plot2,'时间[s]')图例(plot1,'值w(t)','值w(t):稳定状态','位置',“northeastoutside”)图例(plot2,'它)','I(t)为稳定状态','位置',“northeastoutside”)
使用原来的公式产生的Simscape代码方程式
。
symWriteSSC ('MyMotor.ssc','MyMotorTemplate.ssc',均衡器,...'H1Header',“%定制直流电动机,...“帮助文件”{“%此块实现了定制的DC马达”})
方法来显示生成的组件类型
命令。
类型MyMotor.ssc
组件MyMotor %自定义直流电机%此块实现自定义直流电机节点p = foundation.electric .electrical;% +:左n = foundation.electric .electrical;% -:左r =基础。机械。旋转。转动;% R:右c =基础。机械。旋转。转动;% C:右端参数R = {3.9, 'Ohm'};电枢电阻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中;
在当前目录 '的/ t金宝appmp / Bdoc20a_1326390_83879 / tp12bdb807 /符号,ex98670381' 生成的Simulink库 'MyLib_lib' ...