使用MATLAB中可用的质量矩阵求解器之一求解微分代数方程®. 要使用此工作流,请首先完成中的步骤1、2和3求解微分代数方程(DAE). 然后,使用质量矩阵解算器而不是ode15i
.
此示例演示了ode15s
或ode23t
. 有关其他解算器的详细信息,请参见选择一个ODE解算器并调整此页面上的工作流。
从还原指数
,你有一个方程向量代数微分方程
和一个变量向量代瓦尔斯
. 使用ode15s
或ode23t
,需要两个函数句柄:一个表示DAE系统的质量矩阵,另一个表示质量矩阵方程的右侧。这些函数句柄构成ODE系统的等效质量矩阵表示,其中M(T,Y(T))Y’(T) =F(T,Y(T)).
通过使用查找这些函数句柄质量矩阵变换
得到质量矩阵M
右边呢F
.
[M,f]=massMatrixForm(DAE,DAEVAR)
0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0(T)-2*Dxtt(T)*x(T)-2*Dytt(T)*y(T)-2*Dxtt(T)^2-2*Dyt(T)^2-Dytt(t)-Dyt(t)
中的方程代数微分方程
可以包含变量向量中未指定的符号参数代瓦尔斯
. 通过使用查找这些参数塞迪夫
关于赛姆瓦尔
从…起代数微分方程
和代瓦尔斯
.
pDAEs=symvar(DAEs);pDAEvars=symvar(DAEvars);extraParams=setdiff(pDAEs,pDAEvars)
外部参数=[g,m,r]
质量矩阵M
没有这些额外的参数。因此,转换M
通过使用奥德函数
.
M=函数(M,DAEVAR);
转换F
将附加参数指定为函数句柄的附加输入奥德函数
.
f=odeFunction(f,DAEvars,g,m,r);
工作流的其余部分纯粹是数字。设置参数值并创建函数句柄。
g=9.81;m=1;r=1;F=@(t,Y)F(t,Y,g,m,r);
解算器需要函数句柄中所有变量的初始值。使用MATLAB找到满足方程的初始值分贝
功能分贝
接受对初始条件的猜测(可能不满足方程式),并尝试使用这些猜测找到令人满意的初始条件。分贝
可能会失败,在这种情况下,必须手动为问题提供一致的初始值。
首先,检查中的变量代瓦尔斯
.
代瓦尔斯
DAEvars=x(t)y(t)t(t)Dxt(t)Dytt(t)Dytt(t)Dxtt(t)
在这里Dxt(t)
是的一阶导数x(t)
,戴特(t)
是的二阶导数y(t)
等等a中有7个变量7.
-借-1.
因此,对变量及其导数的初始值的猜测也必须是7.
-借-1.
向量。
假设摆锤的初始角位移为30°或pi/6
,坐标原点位于摆锤的悬挂点。考虑到我们使用了半径R
属于1.
,初始水平位置x(t)
是r*sin(pi/6)
.初始垂直位置y(t)
是-r*cos(pi/6)
. 指定向量中变量的这些初始值y0est
.
任意将剩余变量及其导数的初始值设置为0
.这些不是很好的猜测。但是,它们足以解决我们的问题。在您的问题中,如果分贝
错误,然后提供更好的猜测并参考分贝
页
y0est=[r*sin(pi/6);-r*cos(pi/6);0;0;0;0;0;0];yp0est=零(7,1);
创建包含质量矩阵的选项集M
以及初步猜测yp0est
,并指定数值搜索的数值公差。
opt=odeset('Mass',M,'InitialSlope',yp0est,'RelTol',10.0^(-7),'absol',10.0^(-7));
使用MATLAB为变量及其导数找到一致的初始值分贝
作用第一个论点分贝
必须是将DAE描述为的函数句柄f(t,y,yp)=f(t,y,y')=0
. 依据M
和F
,这意味着f(t,y,yp)=M(t,y)*yp-f(t,y)
.
隐式数据集=@(t,y,yp)M(t,y)*yp-F(t,y);[y0,yp0]=decic(隐式数据集,0,y0est,[],y0est,[],opt)
y0=0.4771-0.8788-8.62140.0000-2.2333-4.1135 yp0=0.0000-2.23330
现在创建一个包含质量矩阵的选项集M
系统与向量的关系yp0
导数的一致初始值。求解系统时将使用此选项集。
opt=odeset(opt,‘初始斜率’,yp0);
解决系统在时间跨度内的集成问题0
≤T
≤0.5
. 将网格线和图例添加到绘图中。代码使用ode15s
.相反,您可以使用ode23s
通过替换ode15s
具有ode23s
.
[tSol,ySol]=ode15s(F[0,0.5],y0,opt);绘图(tSol,ySol(:,1:origVars),“-o”)对于k=1:origVars S{k}=char(DAEvars(k));终止图例,“位置”,“最好的”)网格在…上
通过设置新值并重新生成函数句柄和初始条件,解决系统中不同参数值的问题。
设置R
到2.
并重新生成函数句柄和初始条件。
r=2;F=@(t,Y)F(t,Y,g,m,r);y0est=[r*sin(pi/6);-r*cos(pi/6);0;0;0;0;0;0;0;0];隐式数据集=@(t,Y,yp)m(t,Y)*yp-F(t,Y);[y0,y0]=decic(隐式数据集,0,y0est,[],yp0est,[],yp0est,[],opt opt=odeset(opt,'InitialSlope',,'yp0);
为新参数值求解系统。
[tSol,ySol]=ode15s(F[0,0.5],y0,opt);绘图(tSol,ySol(:,1:origVars),“-o”)对于k=1:origVars S{k}=char(DAEvars(k));终止图例,“位置”,“最好的”)网格在…上