I. 一个常规微分方程系统包括一些微分方程,这些方程依赖于其他的方程,例如:
这是个相当简单的例子,它可能通过解析解法或者数值解法求解。通常情况下,解析方法对很多系统都是不可用的。对于线性系统,将这些方程以矩阵的形式改写,如下所示:
具体内容请参阅Gilber Strang的“Introduction to Linear Algebra and Its Application"一书获得详细的信息。
本技术手册着重在于常规微分方程的数值解法。为了用数值解法解决上面方程系统,建立函数定义改变向量y的比率。
function dy=exampleode(t,y)
% function to be integrated
dy=zeros(2,1);
dy(1)=y(1)+y(2);
dy(2)=y(1); % 选择(?Alternatively)
% A=[1 1;1 0]; dy=A*y;
利用MATLAB提供的数值求解器函数,先采用ODE45:
xspan = [0 10];
ynot = [1 0];
[X,Y]=ode45(@exampleode,xspan,ynot);
这建立了一个时间向量X(或者X的表达式)以及相应的Y向量,简单地说就是在时间X取得Y。在上面的例子中,Y的第一列为u,第二列是v。plot(X,Y):
II. 考虑这个二阶系统
第一步:通过引入向量将这个二阶ODEs变成一阶系统
第二步:将上面的那个方程系统改写成如下
将这在MATLAB中写成如下的形式:
function dy = secondode(x,y)
% function to be integrated
dy = zeros(4,1);
dy(1) = y(2);
dy(2) = -3*y(1)- exp(x)*y(4) + exp(2*x);
dy(3) = y(4);
dy(4) = -y(1) – cos(x)*y(2)+ sin(x);
注意:记得将变量x改成t(它是简单独立变量)。
好,现在用ODE45解这个系统,初始状态 u(0) = 1; u'(0) = 2; v(0) = 3; v'(0) = 4;从x = 0 开始迭代到x = 3 。你需要用到下面的命令:
xspan = [0 3];
y0 = [1;2;3;4];
[x,y] ode45(@secondode,xpan,y0); % y的第一列是关于x的u的值,y的第二列
%是u'的值,如此类推
plot(x,y); legend('u','u’','v','v’'):
III. 考虑下面的方程系统
其中,A,B,C与D是矩阵,y是向量。例如:
你可以降低方程的阶次,采用数值求解。首先定义
这样就可以将(1)式改写为
http://foto.yculblog.com/genial/ode9.JPG.jpg
注意:对于隐含(?implicit)求解器,例如ODE15S,ODE23T和ODE23TB,你可以将A表示成质量矩阵(?mass matrix),这是微分代数方程经常做的。
你可以写成 如下形式。
http://foto.yculblog.com/genial/ode10.JPG.jpg
你可以通过这些来链接ODE45或者另外的ODE求解器来求取数值解。例如,假设矩阵A,B,C,D如下:
可以用ODE45解这个系统如下:
function dy = matrixode(t,y)
% function to be integrated
dy = zeros(4,1);
dy(1) = y(3);
dy(2) = y(4);
dy(3) = -0.5*y(1)-y(2)+0.5*y(3)+y(4); % 原文此处有小错
dy(4) = -0.5*y(1)+0.5*y(3)+1;
带有初识条件 x1(0) = 9, x2(0)=7,x1'(0)=5,x2'(0)=3,时间范围是 t=0到t=5,解决这个系统的命令如下:
tspan = [0 5];
x_init = [ 9; 7; 5; 3];
[t,x] = ode45(@matrixode,tspan,x_init);
将x(2)的值用红色画出,x2'(t)的值用绿色画出,采用的命令如下:
plot(t,x(:,2),'r-',t,x(:,4),'g-');
绘出图形如下页所示。
补充实例:
%------------------------------------------------------------------------
% 根据方程组写微分方程如下:
%
function dudt=changode(t,u)
dudt=zeros(6,1);
dudt(1)=u(4);
dudt(2)=u(5);
dudt(3)=u(6);
dudt(4)=-2*u(1)-u(2)-u(4)+3*sin(t);
dudt(5)=0.5*u(1)-u(2)+0.5*u(4)-0.5*u(6)+sin(t);
dudt(6)=(1/3)*(-4*u(3)-u(5))+2*sin(t);
dudt=dudt(
;
%――――――――――――――――――――――――――――――――――
调用ode45求解该方程组,并画出结果图:
function changpingpin
u0=[-1;-3;-2;1;2;3];
tspan=[0 20];
[t,u]=ode45(@changode,tspan,u0);
plot(t,u(:,1),t,u(:,2),t,u(:,3));
legend('u(1)','u(2)','u(3)');
xlabel('t');
ylabel('u');
结果图:


