使用质量矩阵求解器求解dae
用MATLAB中可用的质量矩阵求解器之一求解微分代数方程®.要使用此工作流,首先完成步骤1、2和3解微分代数方程(DAEs).然后,使用质量矩阵求解器代替ode15i
.
的使用ode15s
或ode23t
.有关其他求解器的详细信息,请参见选择一个ODE求解器并调整本页的工作流程。
步骤1。将dae转换为函数句柄
从的输出reduceDAEIndex
就得到了一个由方程组成的向量个标志性
还有一个变量向量DAEvars
.使用ode15s
或ode23t
,则需要两个函数句柄:一个表示DAE系统的质量矩阵,另一个表示质量矩阵方程的右侧。这些函数句柄形成ODE系统的等效质量矩阵表示,其中米(t,y(t))y”(t) =f(t,y(t)).
通过使用找到这些函数句柄massMatrixForm
得到质量矩阵米
右边是F
.
[M,f] = massMatrixForm(DAEs,DAEvars)
M = [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, 1, 0, 0] [0, 1, 0, 0, 0, 0, 0) f = (T (T) * x (T) - M * r * Dxtt (T) / r - M (g * * r - T (T) * y (T) + M * r *迪特(T)) / r r ^ 2 - y (T) ^ 2 - x (T) ^ 2 - 2 * Dxt (T) * x (T) - 2 * Dyt (T) * y (T) - 2 * Dxtt (T) * x (T) - 2 *迪特(T) * y (T) - 2 * Dxt (T) ^ 2 - 2 * Dyt (T) ^ 2迪特(T) -Dyt (T)
中的方程个标志性
可以包含没有在变量向量中指定的符号参数吗DAEvars
.通过使用找到这些参数setdiff
的输出symvar
从个标志性
而且DAEvars
.
pDAEs = symvar(DAEs);pDAEvars = symvar(DAEvars);extraParams = setdiff(pDAEs, pDAEvars)
extraParams = [g, m, r]
质量矩阵米
没有这些额外的参数。因此,转换米
直接使用函数句柄odeFunction
.
M = odeFunction(M, DAEvars);
转换f
函数句柄。指定额外的参数作为的额外输入odeFunction
.
f = odeFunction(f, DAEvars, g, m, r);
工作流的其余部分是纯数值的。设置参数值并创建函数句柄。
G = 9.81;M = 1;R = 1;F = @(t, Y) F (t, Y, g, m, r);
步骤2。求初始条件
解算器需要函数句柄中所有变量的初始值。利用MATLAB求得满足方程的初值decic
函数。的decic
接受对初始条件的猜测(可能不满足方程),并尝试使用这些猜测找到令人满意的初始条件。decic
可能会失败,在这种情况下,您必须手动为您的问题提供一致的初始值。
首先,签入变量DAEvars
.
DAEvars
DAEvars = x(t) y(t) t(t) Dxt(t) Dyt(t) Dytt(t) Dxtt(t)
在这里,Dxt (t)
的一阶导数是多少x (t)
,迪特(t)
的二阶导数是多少y (t)
等等。a中有7个变量7
——- - - - - -1
向量。因此,对变量的初值及其导数的猜测也必须是7
——- - - - - -1
向量。
假设摆的初始角位移为30°或π/ 6
,坐标原点在摆的悬浮点。假设我们用了半径r
的1
,初始水平位置x (t)
是r * sin(π/ 6)
.初始垂直位置y (t)
是- r * cos(π/ 6)
.指定向量中变量的这些初值y0
.
任意设置其余变量的初始值及其导数为0
.这些都不是很好的猜测。然而,它们足以解决我们的问题。在你的问题中,如果decic
错误,然后提供更好的猜测,并参考decic
页面。
Y0est = [r*sin(pi/6);- r * cos(π/ 6);0;0;0;0;0);Yp0est = 0 (7,1);
创建一个包含质量矩阵的选项集米
初步的猜测yp0est
,并指定数值搜索的数值公差。
opt = odeset('Mass', M, 'InitialSlope', yp0est,…'RelTol', 10.0^(-7), 'AbsTol', 10.0^(-7));
用MATLAB求得变量及其导数的一致初值decic
函数。的第一个参数decic
必须是一个函数句柄,描述DAE为F (t,y,yp) = F (t,y,y') = 0
.在这方面米
而且F
,这意味着f(t,y,yp) = M(t,y)*yp - f(t,y)
.
implicitDAE = @(t,y,yp) M(t,y)*yp - F(t,y);[y0, yp0] = decic(implicitDAE, 0, y0est, [], yp0est, [], opt)
Y0 = 0.4771 -0.8788 -8.6214 0 0.0000 -2.2333 -4.1135 yp0 = 0 0.0000 00 -2.2333 00
现在创建一个包含质量矩阵的选项集米
系统和向量的yp0
导数的初值一致。您将在求解系统时使用此选项集。
opt = odeset(opt, 'InitialSlope', yp0);
步骤3。解决DAE系统
求解时间范围内的系统积分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(π/ 6);0;0;0;0;0);implicitDAE = @(t,y,yp) M(t,y)*yp - F(t,y); [y0, yp0] = decic(implicitDAE, 0, y0est, [], 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));结束传奇(年代,“位置”,“最佳”网格)在