分析和操纵差分代数方程GydF4y2Ba
此示例显示了如何使用Symbolic Math Toolbox™求解高差异索引的差分代数方程(DAE)。GydF4y2Ba
工程师通常通过微分方程和代数方程的混合物来指定其物理对象(机械系统,电气设备等)的行为。MATLAB®提供特殊的数值求解器,例如GydF4y2BaOde15iGydF4y2Ba
和GydF4y2BaODE15SGydF4y2Ba
,能够整合此类大事 - 规定其“差异指数”不超过1。GydF4y2Ba
此示例显示了将模型设置为具有代数限制的微分方程系统的工作流程。使用以下符号数学工具箱功能。GydF4y2Ba
不良功能GydF4y2Ba
FinddecoupledblocksGydF4y2Ba
IncidencematrixGydF4y2Ba
异源GydF4y2Ba
减少差异排列GydF4y2Ba
MassmatrixformGydF4y2Ba
还原活性GydF4y2Ba
还原GydF4y2Ba
还原品GydF4y2Ba
sym/decicGydF4y2Ba
定义模型的参数GydF4y2Ba
考虑由质量组成的2D物理摆GydF4y2BamGydF4y2Ba
通过恒定长度连接到原点GydF4y2BarGydF4y2Ba
。仅重力加速GydF4y2Bag = 9.81 m/s^2GydF4y2Ba
作用于弥撒。该模型由位置的二阶差分方程组成GydF4y2Ba(x(t),y(t))GydF4y2Ba
质量不明的力量GydF4y2Baf(t)GydF4y2Ba
在字符串内部,可将质量保持在圆上。力是沿着弦的。GydF4y2Ba
符号GydF4y2Bax(t)GydF4y2Bay(t)GydF4y2Baf(t)GydF4y2BamGydF4y2BaGGydF4y2BarGydF4y2Baeqs = [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^2]GydF4y2Ba
等式=GydF4y2Ba
vars = [x(t),y(t),f(t)]GydF4y2Ba
vars =GydF4y2Ba
将此DAE系统重写为一阶差分代数方程的系统。GydF4y2Ba
[eqs,vars,newvars] =降低差异(eqs,vars)GydF4y2Ba
等式=GydF4y2Ba
vars =GydF4y2Ba
newvars =GydF4y2Ba
尝试求解高指数DAE系统GydF4y2Ba
在使用数值MATLAB求解器之前,例如GydF4y2BaOde15iGydF4y2Ba
,您必须遵循以下步骤。GydF4y2Ba
将DAE的系统转换为MATLAB功能手柄。GydF4y2Ba
选择系统符号参数的数值。GydF4y2Ba
设置一致的初始条件。GydF4y2Ba
要将DAE系统转换为MATLAB功能句柄,请使用GydF4y2Ba不良功能GydF4y2Ba
。GydF4y2Ba
f = daefunction(eqs,vars,[m,g,r])GydF4y2Ba
f =GydF4y2Ba函数_handle具有值:GydF4y2Ba@(t,in2,in3,in4)[in3(4,:)。*in4(:,1) - (in2(3,:)。; in3(5,:)。*in4(:,1)+in4(:,1)。(:,3); - in4(:,3)。^2+in2(1,:)。^2+in2(2,:)。; 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 =GydF4y2Ba函数_handle具有值:GydF4y2Ba@(t,y,yp)f(t,y,yp,[1,9.81,1])GydF4y2Ba
功能句柄GydF4y2BaFGydF4y2Ba
是数值求解器的合适输入GydF4y2BaOde15iGydF4y2Ba
。下一步是计算一致的初始条件。利用GydF4y2BaODESETGydF4y2Ba
设置数值公差。然后使用MATLABGydF4y2Ba迪克GydF4y2Ba
功能以计算一致的初始条件GydF4y2BaY0,YP0GydF4y2Ba
对于时间和衍生物的时间GydF4y2BaT0 = 0GydF4y2Ba
。GydF4y2Ba
opt = odeset(GydF4y2Ba“ reltol'GydF4y2Ba,10.0^(-4),GydF4y2Ba'abstol'GydF4y2Ba,10.0^(-4));T0 = 0;[y0,yp0] = decic(f,t0,[0.98; -0.21; zeros(3,1)],[],零(5,1),[],[],opt)GydF4y2Ba
y0 =GydF4y2Ba5×1GydF4y2Ba0.9777 -0.2100 0 0 0 0GydF4y2Ba
yp0 =GydF4y2Ba5×1GydF4y2Ba0 0 0 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警告('Off',“ all”)GydF4y2Ba
打电话之前GydF4y2BaOde15iGydF4y2Ba
然后再次启用它们。GydF4y2Ba
tfinal = 0.5;s =警告(GydF4y2Ba'离开'GydF4y2Ba,,,,GydF4y2Ba'全部'GydF4y2Ba);ode15i(f,[t0,tfinal],y0,yp0,opt);GydF4y2Ba
警告GydF4y2Ba
分析和调整DAE系统GydF4y2Ba
检查DAE系统的差异索引。GydF4y2Ba
islowindexdae(eqs,vars)GydF4y2Ba
ans =GydF4y2Ba逻辑GydF4y2Ba0GydF4y2Ba
这个结果解释了为什么GydF4y2BaOde15iGydF4y2Ba
无法解决此系统。此功能要求输入DAE系统为差异索引0或1。通过将模型扩展到等效的较大DAE系统,该系统包括一些隐藏的代数约束。GydF4y2Ba
[eqs,vars,newvars,index] = yousedaeIndex(eqs,vars)GydF4y2Ba
等式=GydF4y2Ba
vars =GydF4y2Ba
newvars =GydF4y2Ba
索引= 3GydF4y2Ba
第四个输出表明原始模型的差异索引是三个。简化新系统。GydF4y2Ba
[eqs,vars,s] =还原(eqs,vars)GydF4y2Ba
等式=GydF4y2Ba
vars =GydF4y2Ba
s =GydF4y2Ba带有字段的结构:GydF4y2Basolvedequations:[3x1 sym] constantVariables:[0x2 sym]替换变量:[3x2 sym] otherequations:[0x1 sym]GydF4y2Ba
检查新系统是否具有较低的差异索引(0或1)。GydF4y2Ba
islowindexdae(eqs,vars)GydF4y2Ba
ans =GydF4y2Ba逻辑GydF4y2Ba1GydF4y2Ba
解决低指数DAE系统GydF4y2Ba
生成一个MATLAB函数句柄,该函数将符号参数替换为数值。GydF4y2Ba
f = daefunction(eqs,vars,[m,g,r])GydF4y2Ba
f =GydF4y2Ba函数_handle具有值:GydF4y2Ba@(t,in2,in3,in4)[ - (in2(3,:)。*in2(1,:) - in2(7,:)。)./ in4(:3);( - ( - in2(3,:)。*in2(2,:)+in2(6,:)。in4(:,1)。*in4(:,2)。*in4(:,3))./ in4(:3); - in4(:3)。^2+in2(1,::)。^2+in2(2,:)。^2; in2(4,:)。(7,:)。*in2(1,:)。*2.0+in2(6,:)。5,:)。GydF4y2Ba
f = @(t,y,yp)f(t,y,yp,[1,9.81,1])GydF4y2Ba
f =GydF4y2Ba函数_handle具有值:GydF4y2Ba@(t,y,yp)f(t,y,yp,[1,9.81,1])GydF4y2Ba
计算MATLAB降低的索引的一致初始条件GydF4y2Ba迪克GydF4y2Ba
功能。这里,GydF4y2Ba选择GydF4y2Ba
是设置数值公差的选项结构。您已经使用GydF4y2BaODESETGydF4y2Ba
。GydF4y2Ba
[y0,yp0] = decic(f,t0,[0.98; -0.21; zeros(5,1)],[],零(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