刚性微分方程与非刚性的大概区分(自看,求指点)
(这里的内容是作为自己的一个粗略的总结,不确定是否正确,希望有大佬能够更明确的指出其中的错误,作出指导)
对于刚性和非刚性微分方程的区分,可以简单的转变为在将原方程转换为常微分方程组后,进行一个简单的系数判断:
例如:
y''' - 3y'' - y'y = 0, y(0) = 0, y'(0) = 0, y''(0) = -1;
在这里可以设 y1 = y, y2 = y', y3 = y'', 有
y1' = y2, y1(0) = 0,
y2' = y3, y2(0) = 1,
y3' = 3y3 + y2y1, y3(0) = -1,
这里可以简单判断出方程组的右侧系数矩阵值差异不大,得到的特征值差异随之也不大,可以简单判断为非刚性微分方程。
MATLAB中解非刚性微分方程常用 ode45 ;
又例如:
y'' - 1000(1 - y^2)y' + y = 0, y(0) = 2, y'(0) = 0;
在这里可以设y1 = y, y2 = y', 有
y1' = y2, y1(0) = 2,
y2' = 1000(1 - y1^2)y2 - y1, y2(0) = 0,
这里可以简单判断出方程组的右侧系数矩阵值差异较大,得到的特征值差异随之较大,可以简单判断为刚性微分方程。
MATLAB中解刚性微分方程常用 ode15s , ode23s , ode23t , ode23tb ;
对于所有的初值问题解方程方法均有 solver( 'f( t, y )' , [t0 tend], y0 ) :
--solver : 指代所有的方法调用;
--f( t, y ) : 为M文件定义的微分方程 y' = f(x, y) 右端的函数, 即使用不到两个参数,也要保留两个参数,且返回的结果应是列向量;
--[t0 tend] : 为参数中变量 x / t 的取值范围;
--y0 : 为参数中 y 的初始值,要求为列向量