基于MATLAB的微分代数方程解法(附完整代码)

您所在的位置:网站首页 matlab如何求微分方程的解 基于MATLAB的微分代数方程解法(附完整代码)

基于MATLAB的微分代数方程解法(附完整代码)

2023-12-11 12:50| 来源: 网络整理| 查看: 265

目录

一. 微分代数方程求解

例题1

二. 全隐式微分方程

三. 延迟微分方程求解

 例题2

一. 微分代数方程求解 例题1

初始条件:

x_1(0)=0.8,x_2(0)=x_3(0)=0.1

求数值解:

\begin{cases}\dot x_1=-0.2x_1+x_2x_3+0.3x_1x_2\\ \dot x_2=2x_1x_2-5x_2x_3-2x_2^2\\x_1+x_2+x_3-1=0 \end{}

解:

①方法1求解

矩阵形式表示该微分代数方程:

(1)函数文件 

function dx=c7eqdae(t,x) dx=[-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)*x(2);x(1)+x(2)+x(3)-1];

(2)主运行文件

clc;clear; M=[1 0 0;0 1 0; 0 0 0]; options=odeset; options.Mass=M; %Mass微分代数方程中的质量矩阵(控制参数) x0=[0.8;0.1;0.1]; [t,x]=ode15s(@c7eqdae,[0,20],x0,options); plot(t,x)

运行结果:

②方法2:转换成常微分方程求解

从约束式子可得:

x_3(t)=1-x_1(t)-x_2(t)

代入原式子可得:

 (1)函数文件

function dx=c7eqdae1(t,x) dx=[-0.2*x(1)+x(2)*(1-x(1)-x(2))+0.3*x(1)*x(2);... 2*x(1)*x(2)-5*x(2)*(1-x(1)-x(2))-2*x(2)*x(2)];

(2)主运行文件

clc;clear; x0=[0.8;0.1]; [t1,x1]=ode45('c7eqdae1',[0,20],x0); plot(t1,x1,t1,1-sum(x1'))

 运行结果:

二. 全隐式微分方程

ode15i可解算全隐式微风方程。格式:

%格式1 [t,y]=ode15i(odefun,tspan,y0,yp0,options) %格式2 [y0_new,yp0_new]=decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0,options) %decic 为ode15i计算一致的初始条件

可以使用以下命令看具体函数细节:

edit hbldae.m edit ihbldae.m 三. 延迟微分方程求解

延迟微分方程组的一般形式如下:

隐式Runge-Kutta算法dde23()格式如下:

sol=dde23(f1,τ,f2,[t0,tf]) %sol为结构体数据,sol.x为时间向量,sol.y为状态向量 %f1为延迟微分方程 %τ=[τ1,···,τn] %f2为t≤t0时的状态变量值函数  例题2

求延迟微分方程组的数值解:

解:

选择状态变量:

x_1(t)=x(t),x_2(t)=y(t),x_3(t)=\dot y(t)

得出一阶微分方程组:

定义两个时间常数:

\tau_1=1,\tau_2=0.5

(1)编写函数

function dx=c7exdde(t,x,z) xlag1=z(:,1); %第一列表示提取x(τ1) xlag2=z(:,2); dx=[1-3*x(1)-xlag1(2)-0.2*xlag2(1)^3-xlag2(1);... x(3);4*x(1)-2*x(2)-3*x(3)];

(2)主运行文件

clc;clear; lags=[1 0.5]; tx=dde23('c7exdde',lags,zeros(3,1),[0,10]); plot(tx.x,tx.y(2,:)) %与ode45()等返回的x矩阵不一样,这是按行排列的

运行结果:

也可以调用以下命令来查看函数的具体信息:

edit ddex1 %具体的例子,编辑器的代码

另外边值问题的也可以利用计算机来求解

二阶微分方程的边值问题的数学描述如下:

y''(x)=F(x,y,y')

给定区间[a;b]上研究该方程的解,且在这两个边界条件下,满足:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3