matlab之常微分方程(ODE)求解

问题描述:已知理想全混釜的初始进料条件,并知道各物料的动力学,求解足够长时间后全混釜中各物质的浓度

常微分方程:只包含一个自变量的微分方程是常微分方程(Ordinary differential equations,ODE)

其求解分为初值问题和边值问题。

dsolve:以直观的方式求取解析解,便于理解

Y = dsolve(‘eq1,eq2,…’ , ’cond1,cond2,…’ , ’Name’)

采用dsolve表达理想全混釜反应器中的反应过程,其中一种物质的量关系如下:

-dC/dt=f(C,P01,P02,M1,M2) C=C0-∫Rc dt’

具体求解过程参考了:

关于求解微分方程——初学Matlab里的 ODE求解器_HFUTdumpling的博客-CSDN博客_matlab默认求解器

常微分方程

Y = dsolve(‘eq1,eq2,…’ , ’cond1,cond2,…’ , ’Name’)

其中,‘eq1,eq2,…’:表示微分方程或微分方程组;

        ’cond1,cond2,…’:表示初始条件或边界条件;

        ‘Name’:表示变量。没有指定变量时,matlab默认的变量为t;

dsolve 求解微分方程

求解微分方程:

在命令行输入: dsolve('Dy=3*x^2','x')

计算用例:自变量是t

-dC/dt=f(C,P01,P02,M1,M2) C=C0-∫Rc dt

描述第一个式子代码如下,第二个式子实际上包含在边界条件里

dsolve('DC = KC','C(0)=0.1','t')

常微分方程组1

https://img-blog.csdnimg.cn/20190122164452674.png

由于x,y均为t的导数,所以不需要在末尾添加’t’。

实际求解的是方程组,因此要改变代码为(不过这个代码有点问题)

[C,Al,M1,M2,P01,P02,P11,P12,P21,P22,D0,D1,D2]=dsolve(
'DC =……,
DAl =……,
……',
'C(0)=0.1,
Al(0)=0.1,
M1(0)=0.1,
M2(0)=0.1,
P01(0)=0,
P02(0)=0,
P11(0)=0,
P12(0)=0,
P21(0)=0,
P22(0)=0,
D0(0)=0,
D1(0)=0,
D2(0)=0')

常微分方程组2

syms C(t) Al(t) M1(t) M2(t) P01(t) P02(t) P11(t) P12(t) P21(t) P22(t) D0(t) D1(t) D2(t)
eqns = [diff(C,t) ==……,
diff(Al,t) ==……,
diff(M1,t) ==……,
diff(M2,t) ==……,
diff(P01,t) ==……;
S=dsolve(eqns)

为其加上初始条件,并转化为隐式表达解

当求解多个函数时,dsolve默认返回一个结构。或者,您可以通过显式地将输出指定为向量来直接为函数或变量分配解决方案。Dsolve使用symvar按字母顺序对输出进行排序。

解一个微分方程组并将其输出分配给函数。

syms C(t) Al(t) M1(t) M2(t) P01(t) P02(t) P11(t) P12(t) P21(t) P22(t) D0(t) D1(t) D2(t)
cond = [C(t)==0.1,Al(t)==0.1,M1(t)==0.1,M2(t)==0.1, P01(t)==0, P02(t)==0, P11(t)==0, P12(t)==0, P21(t)==0,P22(t)==0, D0(t)==0, D1(t)==0, D2(t)==0]
eqns = [diff(C,t) ==……,
diff(Al,t) ==……,
……;
[CSol(t) AlSol(t) M1Sol(t) M2Sol(t) P01Sol(t) P02Sol(t) P11Sol(t) P12Sol(t) P21Sol(t) P22Sol(t) D0Sol(t) D1Sol(t) D2Sol(t)]=dsolve(eqns,cond)

混沌求解

我理解就是将各种变量作为单一变量x中的矩阵

 

ODE:通过迭代的方法对高阶方程进行数值求解

常微分方程的MATLAB求解 - 知乎概要:常微分方程的MATLAB求解分为解析解、数值解解析解(只有少数微分方程组有解析解):dsolve函数数值解:solver函数,MATLAB内部自带了许多求解器(各种数值求解的方法,如 R-K法)常用函数文件构造微分方程组数…https://zhuanlan.zhihu.com/p/438752297

 

ODE 方程组

您可以指定需要解算的任意数量的 ODE 耦合方程,原则上,方程的数量仅受计算机可用内存的限制。如果方程组包含 n 个方程,

 则用于编写该方程组代码的函数将返回一个向量,其中包含 n 个元素,对应于 y′1, y′2,  … , y′n 值。例如,考虑以下包含两个方程的方程组

用命令行文件和函数文件进行计算

clear
clc
tspan=[0,1200];
y0=[2e-5,0.04,0.1524,1.0194,0,0,0,0,0,0,0,0,0];
[T,X] = ode23(@odefun,tspan,y0);
plot(T,X(:,1),'-',T,X(:,2),'-.',T,X(:,3),'.')
legend('x','y','z')
function dx = odefun(t,x)
dx = zeros(13,1);
dx(1) =……;
dx(2) =……;
dx(3) ……
end

Error using horzcat

请求的 13x51363500 (5.0GB)数组超过预设的最大数组大小(5.0GB)。这可能会导致 MATLAB 无响应。

出错 ode23 (第 416 行)

yout = [yout, zeros(neq,chunk,dataType)]; %#ok<AGROW>

出错 solver (第 5 行)

[T,X] = ode23(@odefun,tspan,y0);

Home菜单栏  Preferences -> WorkSpace -> MATLAB array size limit 调为100%

【Matlab 控制】微分方程 ode45() 求解并绘制曲线_Zhao-Jichao的博客-CSDN博客_matlab ode45函数

 ↑真的很不错的一篇文章,根据修改plot后

或许可以考虑更换ode方法

clear;
clc;

Tspan=[0,1200];
y0=[2e-5,0.04,0.1524,1.0194,0,0,0,0,0,0,0,0,0];
[T,X] = ode15s(@odefun,Tspan,y0);
plot(T,X(:,1), T,X(:,2), T,X(:,3), T,X(:,4), T,X(:,5), T,X(:,6), T,X(:,7), T,X(:,8), T,X(:,9), T,X(:,10), T,X(:,11), T,X(:,12), T,X(:,13))
grid

 点击工作区的x,就可以查看每一步的详细数值了

 

猜你喜欢

转载自blog.csdn.net/weixin_55334018/article/details/124580598