分析和操作微分代数方程gydF4y2Ba
这个例子展示了如何使用符号数学工具箱™解决高微分指数的微分代数方程(DAEs)。gydF4y2Ba
工程师经常用微分方程和代数方程的混合来指定他们的物理对象(机械系统、电气设备等等)的行为。MATLAB®提供了特殊的数值求解器,例如gydF4y2Baode15igydF4y2Ba
而且gydF4y2Baode15sgydF4y2Ba
如果它们的“差异指数”不超过1,就可以对这些dae进行积分。gydF4y2Ba
本例展示了从将模型建立为带有代数约束的微分方程组到数值模拟的工作流程。使用以下符号数学工具箱函数。gydF4y2Ba
daeFunctiongydF4y2Ba
findDecoupledBlocksgydF4y2Ba
incidenceMatrixgydF4y2Ba
isOfLowDAEIndexgydF4y2Ba
reduceDifferentialOrdergydF4y2Ba
massMatrixFormgydF4y2Ba
reduceDAEIndexgydF4y2Ba
reduceDAEToODEgydF4y2Ba
reduceRedundanciesgydF4y2Ba
信谊/ decicgydF4y2Ba
定义模型的参数gydF4y2Ba
考虑一个由质量组成的二维物理摆gydF4y2Ba米gydF4y2Ba
用一根固定长度的弦连接到原点gydF4y2BargydF4y2Ba
.只有重力加速度gydF4y2BaG = 9.81 m/s^2gydF4y2Ba
作用于质点。该模型由位置二阶微分方程组成gydF4y2Ba(x (t), y (t))gydF4y2Ba
一个未知力的质量gydF4y2BaF (t)gydF4y2Ba
在弦里面用来保持物体在圆上。力是沿着弦的方向。gydF4y2Ba
信谊gydF4y2Bax (t)gydF4y2Bay (t)gydF4y2BaF (t)gydF4y2Ba米gydF4y2BaggydF4y2BargydF4y2Ba= [m*diff(x(t), t, t) == F(t)/r*x(t);m*diff(y(t), t, t) == F(t)/r*y(t) - m*g;X (t)²+ y(t)²== r²]gydF4y2Ba
方程式=gydF4y2Ba
vars = [x(t), y(t), F(t)]gydF4y2Ba
var =gydF4y2Ba
将DAE方程组改写为一阶微分代数方程组。gydF4y2Ba
[eqs, vars, newVars] = reducedifferalorder (eqs, vars)gydF4y2Ba
方程式=gydF4y2Ba
var =gydF4y2Ba
newVars =gydF4y2Ba
尝试解决高指标DAE系统gydF4y2Ba
在此之前可以使用MATLAB数值求解器,如gydF4y2Baode15igydF4y2Ba
,你必须遵循这些步骤。gydF4y2Ba
将DAEs系统转换为MATLAB函数句柄。gydF4y2Ba
为系统的符号参数选择数值。gydF4y2Ba
设置一致的初始条件。gydF4y2Ba
要将DAE系统转换为MATLAB函数句柄,请使用gydF4y2BadaeFunctiongydF4y2Ba
.gydF4y2Ba
F = daeFunction(eqs, vars, [m, g, r])gydF4y2Ba
F =gydF4y2BaFunction_handle with value:gydF4y2Ba@ (t, in2 in3 in4) [in3(4:)。* in4(: 1)——(in2(3:)。* in2(: 1))。/ in4 (:, 3); in3(5:)。* in4 (: 1) + in4(: 1)。* in4(:, 2)——(in2(3:)。* in2(2:))。/ in4 (:, 3); -in4(:, 3)。^ 2 + in2(1:)。^ 2 + in2(2:)。^ 2;in2 (4:) in3 (1:); in2 (5:) in3 (2:)gydF4y2Ba
将数值赋给系统的符号参数:gydF4y2BaM = 1kggydF4y2Ba
,gydF4y2BaG = 9.18m/s^2gydF4y2Ba
,gydF4y2BaR = 1mgydF4y2Ba
.gydF4y2Ba
f = @(t, y, yp) f (t, y, yp, [1,9.81, 1])gydF4y2Ba
f =gydF4y2BaFunction_handle with value:gydF4y2Ba@ (t, y, yp) F (t、y, yp, [1, 9.81, 1])gydF4y2Ba
函数句柄gydF4y2BafgydF4y2Ba
一个适合数值求解器的输入gydF4y2Baode15igydF4y2Ba
.下一步是计算一致的初始条件。使用gydF4y2BaodesetgydF4y2Ba
设置数值公差。然后使用MATLABgydF4y2BadecicgydF4y2Ba
函数计算一致的初始条件gydF4y2Bay0, yp0gydF4y2Ba
对于位置和时刻的导数gydF4y2BaT0 = 0gydF4y2Ba
.gydF4y2Ba
Opt = odeset(gydF4y2Ba“RelTol”gydF4y2Ba10.0 ^ (4),gydF4y2Ba“AbsTol”gydF4y2Ba10.0 ^ (4));T0 = 0;[y0,yp0] = decic(f, t0, [0.98;-0.21;0 (3,1)], [], 0 (5,1), [], opt)gydF4y2Ba
y0 =gydF4y2Ba5×1gydF4y2Ba0.9777 -0.2100 00 0gydF4y2Ba
yp0 =gydF4y2Ba5×1gydF4y2Ba00 00 -9.8100gydF4y2Ba
测试初始条件:gydF4y2Ba
F (t0, y0, yp0)gydF4y2Ba
ans =gydF4y2Ba5×1gydF4y2Ba10gydF4y2Ba-16年gydF4y2Ba× 0 0 -0.3469 0 0gydF4y2Ba
现在你可以使用gydF4y2Baode15igydF4y2Ba
试着解方程组。当你打电话时gydF4y2Baode15igydF4y2Ba
时,集成立即停止,并发出以下警告。gydF4y2Ba
警告:矩阵是奇异的,接近奇异的或比例不好。gydF4y2Ba
结果可能不准确。RCOND = NaN。gydF4y2Ba
警告:t=0.000000e+00时失效。gydF4y2Ba
在不减小步长的情况下无法满足集成公差gydF4y2Ba
小于t时刻允许的最小值(0.000000e+00)的大小。gydF4y2Ba
在这个例子中,gydF4y2Baode15igydF4y2Ba
多次发出这些警告。为了可读性,使用禁用警告gydF4y2Ba警告(‘了’,‘都’)gydF4y2Ba
在调用之前gydF4y2Baode15igydF4y2Ba
然后再次启用它们。gydF4y2Ba
Tfinal = 0.5;S =警告(gydF4y2Ba“关闭”gydF4y2Ba,gydF4y2Ba“所有”gydF4y2Ba);Ode15i (f, [t0, tfinal], y0, yp0, opt);gydF4y2Ba
警告(s)gydF4y2Ba
分析和调整DAE系统gydF4y2Ba
检查DAE系统的差动指标。gydF4y2Ba
isLowIndexDAE(方程式一样,var)gydF4y2Ba
ans =gydF4y2Ba逻辑gydF4y2Ba0gydF4y2Ba
这个结果解释了为什么gydF4y2Baode15igydF4y2Ba
不能解这个方程组。该函数要求输入DAE系统的微分索引为0或1。通过将模型扩展到包含一些隐藏代数约束的等效较大DAE系统来降低微分指标。gydF4y2Ba
[eqs, vars, newVars, index] = reduceDAEIndex(eqs, vars)gydF4y2Ba
方程式=gydF4y2Ba
var =gydF4y2Ba
newVars =gydF4y2Ba
指数= 3gydF4y2Ba
第四个输出表明,原模型的微分指标为3。简化新系统。gydF4y2Ba
[eqs, vars, S] =减少冗余(eqs, vars)gydF4y2Ba
方程式=gydF4y2Ba
var =gydF4y2Ba
S =gydF4y2Ba带字段的结构:gydF4y2BasolvedEquations: [3x1 sym] constantVariables: [0x2 sym] replacedVariables: [3x2 sym] otherEquations: [0x1 sym]gydF4y2Ba
检查新系统是否具有较低的差异索引(0或1)。gydF4y2Ba
isLowIndexDAE(方程式一样,var)gydF4y2Ba
ans =gydF4y2Ba逻辑gydF4y2Ba1gydF4y2Ba
解决低指标DAE系统gydF4y2Ba
生成一个MATLAB函数句柄,将符号参数替换为数值。gydF4y2Ba
F = daeFunction(eqs, vars, [m, g, r])gydF4y2Ba
F =gydF4y2BaFunction_handle with value:gydF4y2Ba@ (t, in2 in3 in4) (- (in2(3:)。* in2 (: 1) in2(7:)。* in4(: 1)。* in4(:, 3))。/ in4 (:, 3); (in2(3:)。* in2 (2:) + in2(6:)。* in4(: 1)。* in4 (:, 3) + in4(: 1)。* in4(:, 2)。* in4(:, 3))。/ in4 (:, 3); -in4(:, 3)。^ 2 + in2(1:)。^ 2 + in2(2:)。^ 2;in2(4:)。* in2(1:)。* 2.0 + in2(5:)。* in2(2:)。* 2.0;in2(7:)。* in2(1:)。* 2.0 + in2(6:)。* in2(2:)。* 2.0 + in2(4:) ^ 2。* 2.0 + in2(5:)。^ 2 * 2.0;in2 (6:) in3 (5:); in2 (5:) in3 (2:)gydF4y2Ba
f = @(t, y, yp) f (t, y, yp, [1,9.81, 1])gydF4y2Ba
f =gydF4y2BaFunction_handle with value:gydF4y2Ba@ (t, y, yp) F (t、y, yp, [1, 9.81, 1])gydF4y2Ba
计算由MATLAB化简的指标的一致初始条件gydF4y2BadecicgydF4y2Ba
函数。在这里,gydF4y2Ba选择gydF4y2Ba
是设置数值公差的选项结构。你已经计算过了gydF4y2BaodesetgydF4y2Ba
.gydF4y2Ba
[y0,yp0] = decic(f, t0, [0.98;-0.21;0 (5,1)], [], 0 (7,1), [], opt)gydF4y2Ba
y0 =gydF4y2Ba7×1gydF4y2Ba0.9779 -0.2093 -2.0528 -0.0000 0 -9.3804 -2.0074gydF4y2Ba
yp0 =gydF4y2Ba7×1gydF4y2Ba0 0 0 0 -9.3804 0 0gydF4y2Ba
解方程组,画出解。gydF4y2Ba
Ode15i (f, [t0, tfinal], y0, yp0, opt)gydF4y2Ba