主要内容

使用质量矩阵求解器求解dae

用MATLAB中可用的质量矩阵求解器之一求解微分代数方程®.要使用此工作流,首先完成步骤1、2和3解微分代数方程(DAEs).然后,使用质量矩阵求解器代替ode15i

的使用ode15sode23t.有关其他求解器的详细信息,请参见选择一个ODE求解器并调整本页的工作流程。

步骤1。将dae转换为函数句柄

从的输出reduceDAEIndex就得到了一个由方程组成的向量个标志性还有一个变量向量DAEvars.使用ode15sode23t,则需要两个函数句柄:一个表示DAE系统的质量矩阵,另一个表示质量矩阵方程的右侧。这些函数句柄形成ODE系统的等效质量矩阵表示,其中tyt))y”(t) =ftyt))

通过使用找到这些函数句柄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,坐标原点在摆的悬浮点。假设我们用了半径r1,初始水平位置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系统

求解时间范围内的系统积分0t0.5.将网格线和图例添加到情节中。代码使用ode15s.相反,您可以使用ode23s通过替换ode15sode23s

[tSol,ySol] = ode15s(F, [0,0.5], y0, opt);情节(tSol ySol (: 1: origVars),“o”k = 1:origVars S{k} = char(DAEvars(k));结束传奇(年代,“位置”“最佳”网格)

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象表示x(t) y(t) t (t)

通过设置新值并重新生成函数句柄和初始条件来求解不同参数值的系统。

r2并重新生成函数句柄和初始条件。

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));结束传奇(年代,“位置”“最佳”网格)

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象表示x(t) y(t) t (t)

相关的话题