![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
В MATLAB имеется целый ряд встроенных функций, предназначенных для решения задачи Коши для обыкновенных дифференциальных уравнений. Это такие функции, как ode45, ode23, odell3, odel5s, ode23s, ode23t и ode23tb. Их еще называют солверами (от англ. слова solver, которое переводится как "решатель").
В перечисленных функциях реализованы различные методы решения дифференциальных уравнений, поэтому выбор той или иной функции зависит от характеристик решаемой задачи.
Понятие: Система называется жёсткой если возможна потеря точности в процессе численного решения, т.к. на разных отрезках изменения независимых переменных решения ведут себя по-разному: в одних местах наблюдается очень быстрое изменение независимых переменных, в то время как в других местах очень медленное.
Решатели реализуют следующие методы решения систем дифференциальных уравнений, причем для решения жестких систем уравнений рекомендуется использовать только специальные решатели ode 15s, ode23s, ode23t. ode23tb:
· ode45 — одношаговые явные методы Рунге-Кутта 4-го и 5-го порядка. Это классический метод, рекомендуемый для начальной пробы решения. Во многих случаях он дает хорошие результаты;
· ode23 — одношаговые явные методы Рунге-Кутта 2-го и 4-го порядка. При умеренной жесткости системы ОДУ и низких требованиях к точности этот метод;. может дать выигрыш в скорости решения;
· ode113 — многошаговый метод Адамса-Башворта-Мултона переменного порядка Это адаптивный метод, который может обеспечить высокую точность решения
· ode23tb — неявный метод Рунге-Кутта в начале решения и метод, использующий формулы обратного дифференцирования 2-го порядка в последующем.Несмотря на сравнительно низкую точность, этот метод может оказаться более эффективным, чем ode15s;
· ode15s — многошаговый метод переменного порядка (от 1 до 5, по умолчанию 5), использующий формулы численного дифференцирования. Это адаптивный метод, его стоит применять, если решатель ode45 не обеспечивает решения;
· ode23s — одношаговый метод, использующий модифицированную формулу Розенброка 2-го порядка. Может обеспечить высокую скорость вычислений при низкой точности решения жесткой системы дифференциальных уравнений;
· ode23t — метод трапеций с интерполяцией. Этот метод дает хорошие результаты при решении задач, описывающих колебательные системы с почти гармоническим выходным сигналом;
В самом простом случае синтаксис вызова перечисленных выше функций один и тот же.
[t, Y]=solver(@F,tspan,yO)
Здесь solver— название соответствующего солвера (например, ode45 или ode23), t — вектор-столбец, содержащий значения независимой переменной (обычно это значения времени), Y— массив решений, каждая строка которого соответствует определенному элементу вектора t. Аргумент @F — это указатель на функцию, которая вычисляет правые части системы дифференциальных уравнений (в частности, имя файл-функции в одинарных кавычках), tspan — вектор, определяющий интервал интегрирования (можно задать и промежуточные значения), а уО — скаляр или вектор-столбец, в котором задаются начальные условия; относительная погрешность RelTol (по умолчанию le-З), абсолютная погрешность AbsTol (все компоненты по умолчанию равны 1е-6);
Пример: Решить уравнение в интервале
с начальным условием
.
Решение:
1.Создаём m-файл
function f=pr1(t,x)
f=t*exp(-t);
2.Сохраняем под именем pr1.
3. Вызываем в командной строке
>> [T,X]=ode45('pr1',[0, 0.5], [1]);
% [0, 0,5 ] – интервал на котором необходимо получить решение.
% [1] – начальное значение решения
>> plot(T,X)
>>[T X] % выводим значения Т и Х
Пример: Получить аналитическое и численное решение дифференциального уравнения:
На графике общего решения указать частное.
Решение:
>> y=dsolve('Dy=(1+y^2)/(x*y)','x')
y =
[ (-1+x^2*C1)^(1/2)] % общее решение
[ -(-1+x^2*C1)^(1/2)]
>> syms x C1,y=(-1+x^2*C1)^(1/2); % построение общего решения
>> for C1=1:2:9
y=(-1+x^2*C1)^(1/2);
ezplot(y), hold on
end
>> y1=dsolve('Dy=(1+y^2)/(x*y)','y(2)=1','x')
y1 = (-1+1/2*x^2)^(1/2) % частное решение
>> x=-6:0.1:6;
>> y1=(-1+1/2*x.^2).^(1/2);
>> h=plot(x,y1,'r')
>> set(h,'LineWidth',4)
>> gtext('y(x)')
% нахождение численного решения
function dydx=F(x,y)
dydx=zeros(1,1);
dydx(1)=(1+y^2)/(x*y);
>> [x y]=ode45(@F,[0.5 2],[1]);
% дескриптор @ обеспечивает связь с файл-функцией правой части.
>> plot(x,y,'g')
>> hold on; gtext('y1(x)')
% нанесение надписи
>> [x y ]
Дата публикования: 2014-12-08; Прочитано: 3639 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!