Решите дифференциальное уравнение второго порядка численно

Этот пример показывает вам, как преобразовать дифференциальное уравнение второго порядка в систему дифференциальных уравнений, которые могут быть решены с помощью числового решателя ode45 из MATLAB®.

Типичный подход к решению обыкновенных дифференциальных уравнений высшего порядка должен преобразовать их в системы дифференциальных уравнений первого порядка, и затем решить те системы. Пример использует Symbolic Math Toolbox™, чтобы преобразовать ОДУ второго порядка в систему ОДУ первого порядка. Затем это использует решатель MATLAB ode45 решить систему.

Перепишите ОДУ второго порядка как систему ОДУ первого порядка

Используйте odeToVectorField переписать это дифференциальное уравнение второго порядка

d2ydt2=(1-y2)dydt-y

использование замены переменных. Пусть y(t)=Y1и dydt=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 не принимают символьные выражения как вход. Поэтому, прежде чем можно использовать решатель ОДУ MATLAB, чтобы решить систему, необходимо преобразовать ту систему в функцию MATLAB. Сгенерируйте функцию MATLAB от этой системы дифференциальных уравнений первого порядка с помощью matlabFunction с V как вход.

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

Решите систему ОДУ первого порядка

Чтобы решить эту систему, вызовите ode45 MATLAB числовой решатель с помощью сгенерированной функции MATLAB в качестве входа.

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

Постройте решение

Постройте решение с помощью linspace сгенерировать 100 точек в интервале [0,20] и deval оценивать решение для каждой точки.

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

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

Смотрите также

| | |