这个例子展示了如何使用符号数学工具箱™解决高微分指数的微分代数方程(DAEs)。gydF4y2Ba
工程师通常通过混合微分方程和代数方程来指定他们的物理对象(机械系统、电子设备等)的行为。MATLAB®提供特殊的数值求解器,如gydF4y2Baode15igydF4y2Ba
和gydF4y2Baode15sgydF4y2Ba
,能够集成这样的dae——只要它们的“微分索引”不超过1。gydF4y2Ba
这个例子展示了从建立一个带有代数约束的微分方程系统到数值模拟的工作流程。使用下列符号数学工具箱函数。gydF4y2Ba
daeFunctiongydF4y2Ba
findDecoupledBlocksgydF4y2Ba
incidenceMatrixgydF4y2Ba
isOfLowDAEIndexgydF4y2Ba
reduceDifferentialOrdergydF4y2Ba
massMatrixFormgydF4y2Ba
reduceDAEIndexgydF4y2Ba
reduceDAEToODEgydF4y2Ba
reduceRedundanciesgydF4y2Ba
信谊/ decicgydF4y2Ba
考虑一个由质量组成的二维物理摆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)^2 + y(t)^2 = r^2gydF4y2Ba
方程式=gydF4y2Ba
var = [x(t), y(t), F(t)]gydF4y2Ba
var =gydF4y2Ba
把这个DAE系统重写成一个一阶微分代数方程组。gydF4y2Ba
[eqs, vars, newVars] = reduceDifferentialOrder(eqs, vars)gydF4y2Ba
方程式=gydF4y2Ba
var =gydF4y2Ba
newVars =gydF4y2Ba
之前可以使用MATLAB数值求解器,如gydF4y2Baode15igydF4y2Ba
,你必须遵循这些步骤。gydF4y2Ba
将DAEs系统转换为MATLAB函数句柄。gydF4y2Ba
为系统的符号参数选择数值。gydF4y2Ba
设置一致的初始条件。gydF4y2Ba
将DAE系统转换为MATLAB函数句柄,使用gydF4y2BadaeFunctiongydF4y2Ba
.gydF4y2Ba
F = daeFunction(eqs, vars, [m, g, r])gydF4y2Ba
F =gydF4y2Bafunction_handle与价值: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 = 1公斤gydF4y2Ba
,gydF4y2Bag = 9.18 m / s ^ 2gydF4y2Ba
,gydF4y2Bar = 1米gydF4y2Ba
.gydF4y2Ba
f (t, y, yp) = @(t, y, yp)gydF4y2Ba
f =gydF4y2Bafunction_handle与价值:gydF4y2Ba@ (t, y, yp) F (t、y, yp, [1, 9.81, 1])gydF4y2Ba
函数处理gydF4y2BafgydF4y2Ba
是一个合适的输入为数值求解器gydF4y2Baode15igydF4y2Ba
.下一步是计算一致的初始条件。使用gydF4y2BaodesetgydF4y2Ba
设定数值公差。然后使用MATLABgydF4y2BadecicgydF4y2Ba
函数用于计算一致的初始条件gydF4y2Bay0, yp0gydF4y2Ba
对于位置和时刻的导数gydF4y2Bat0 = 0gydF4y2Ba
.gydF4y2Ba
选择= odeset (gydF4y2Ba“RelTol”gydF4y2Ba10.0 ^ (4),gydF4y2Ba“AbsTol”gydF4y2Ba10.0 ^ (4));t0 = 0;[y0,yp0] = decic(f, t0, [0.98;0 (3,1), [], 0 (5,1), [], opt)gydF4y2Ba
y0 =gydF4y2Ba5×1gydF4y2Ba0.9777 -0.2100 00gydF4y2Ba
yp0 =gydF4y2Ba5×1gydF4y2Ba00 0 -9.8100gydF4y2Ba
测试初始条件:gydF4y2Ba
f (t0, y0, yp0)gydF4y2Ba
ans =gydF4y2Ba5×1gydF4y2Ba10gydF4y2Ba-16gydF4y2Ba× 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
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] = reducerredundancy (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
生成一个MATLAB函数句柄,用数值替换符号参数。gydF4y2Ba
F = daeFunction(eqs, vars, [m, g, r])gydF4y2Ba
F =gydF4y2Bafunction_handle与价值: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) = @(t, y, yp)gydF4y2Ba
f =gydF4y2Bafunction_handle与价值: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 (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