2021-01-13 Matlab求解微分代数方程 (DAE)

Matlab求解微分代数方程 (DAE)

什么是微分代数方程?

微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着不能将这些方程记为显式形式 y′=f(t,y)。

ode15s 和 ode23t 求解器可以使用奇异质量矩阵 M(t,y)y′=f(t,y) 来解算微分指数为1的线性隐式问题,包括以下形式的半显式 DAE

y′0=f(t,y,z)

0 =g(t,y,z) 

在此形式中,由于主对角线存在一个或多个零值,因此代数变量的存在会产生奇异质量矩阵。

图片

 

默认情况下,求解器会自动检验质量矩阵的奇异性,以检测 DAE 方程组。如果提前知道奇异性,则可将 odeset 的 MassSingular 选项设为 'yes'。对于 DAE,还可以使用 odeset 的 InitialSlope 属性为求解器提供 y′(0) 的初始条件估计值。

举个例子

图片

其中x1(0)=0.8;x2(0)=x3(0)=0.1;

1)方程写成DAE形式

图片

2)编程求解

 

%% clcclearclose allodefun = @(t,x)[-0.2*x(1)+x(2)*x(3)+0.3*x(1)*x(2);                2*x(1)*x(2)-5*x(2)*x(3)-2*x(2)^2;                x(1)+x(2)+x(3)-1]; %微分方程M = [1 0 0;0 1 0;0 0 0]; % 质量矩阵options=odeset('mass',M); % 定义mass属性x0=[0.8;0.1;0.1];[t,x]=ode15s(odefun,[0 10],x0,options);figureplot(t,x(:,1),t,x(:,2),t,x(:,3))grid onlegend('x1','x2','x3')

图片

 

### 如何使用Matlab求解微分代数方程 Matlab提供了多种用于解决微分代数方程DAE)的内置函数,其中`ode15i`, `ode15s`, 和 `ode15t` 是常用的几种方法[^1]。 对于隐式的微分代数方程,推荐采用`ode15i`来处理完全隐式形式的一阶微分方程\[F(t,y,\dot{y})=0\]。为了展示具体的应用场景,这里给出一段利用`ode15i`求解简单线性微分代数方程的例子: ```matlab function dae_example_implicit() % 定义时间区间和初始条件 tspan = [0 1]; y0 = [1; 0]; yp0 = [0; -1]; % 调整选项设置 options = odeset('RelTol',1e-4,'AbsTol',[1e-6 1e-8]); % 求解并绘图 [t, y] = ode15i(@mydae,tspan,y0,yp0,options); plot(t,y(:,1),'-',t,y(:,2),'-.'); end % 微分代数方程定义 function F = mydae(t, y, yp) F = [yp(1)-y(2); ... yp(2)+9*y(1)]; end ``` 当面对显式或半显式的微分代数方程时,则可以选择更通用的`ode15s`来进行数值积分计算。下面是一段基于质量矩阵的形式化表达方式下的例子代码片段: ```matlab function dae_example_explicit_mass_matrix() % 时间范围设定 tspan = [0 4]; % 初始状态向量 y0 = [1; 0]; % 构建质量矩阵M M = @(t,y)[1 0; 0 exp(-t)]; % ODE参数配置 opts = odeset('Mass',M); % 执行ODE求解器 [t,y] = ode15s(@(t,y) [-2*y(1)+y(2)^2 ;... -exp(-t)*y(2)], tspan ,y0,opts); % 结果可视化 subplot(2,1,1),plot(t,y(:,1)); title('Solution Component Y_1') xlabel('Time'),ylabel('Y_1') subplot(2,1,2),plot(t,y(:,2)); title('Solution Component Y_2') xlabel('Time'),ylabel('Y_2') end ``` 上述两个实例分别展示了针对不同类型的微分代数系统的解决方案——一个是纯粹隐式的案例,另一个则是具有特定结构的质量矩阵情况下的应用示例。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值