主要内容

以数值方式求解二阶微分方程

此示例说明如何将二阶微分方程转换为可以使用 MATLAB® 的数值求解器 ode45 求解的微分方程组。

求解高阶常微分方程的典型方法是将其转化为一阶微分方程组,然后求解这些方程组。此示例使用 Symbolic Math Toolbox™ 将二阶 ODE 转换为一阶 ODE 方程组。然后使用 MATLAB 求解器 ode45 来求解方程组。

将二阶 ODE 重写为一阶 ODE 方程组

使用 odeToVectorField 重写下面的二阶微分方程

d2ydt2=(1-y2)dydt-y

(通过变量替换实现)。令 y(t)=Y1dydt=Y2,对这两个方程进行微分,得到一个一阶微分方程组。

dY1dt=Y2dY2dt=-(Y12-1)Y2-Y1

syms y(t)
[V] = odeToVectorField(diff(y, 2) == (1 - y^2)*diff(y) - y)
V = 

(Y2-Y12-1Y2-Y1)

生成 MATLAB 函数

MATLAB ODE 求解器不接受符号表达式作为输入。因此,在使用 MATLAB ODE 求解器求解方程组之前,必须将该方程组转换为 MATLAB 函数。使用 matlabFunction,并以 V 作为输入,从这个一阶微分方程组生成 MATLAB 函数。

M = matlabFunction(V,'vars', {'t','Y'})
M = function_handle with value:
    @(t,Y)[Y(2);-(Y(1).^2-1.0).*Y(2)-Y(1)]

求解一阶 ODE 方程组

要求解该方程组,请调用 MATLAB ode45 数值求解器,并使用生成的 MATLAB 函数作为输入。

sol = ode45(M,[0 20],[2 0]);

绘制解

使用 linspace 在区间 [0,20] 内生成 100 个点,并使用 deval 对每个点求解,从而绘制解。

fplot(@(x)deval(sol,x,1), [0, 20])

Figure contains an axes object. The axes object contains an object of type functionline.

另请参阅

| | |