
- •Операции со степенными полиномами
- •Аппроксимация табличных функций Общие понятия об аппроксимации и интерполяции
- •Аппроксимация табличных функций
- •Интерполирование табличных функций с помощью степенных полиномов
- •Численное интегрирование
- •Тригонометрическая интерполяция периодических функций. Гармонический анализ и синтез периодических функций
- •Нелинейный парный регрессионный анализ
- •Численное решение обыкновенных дифференциальных уравнений Общие понятия
- •Обзор численных методов решения ду
- •Методы Рунге-Кутта
- •Алгоритмы решения систем ду
- •Непосредственное численное решение систем ду с помощью стандартных функций программного пакета Matlab
- •Численное решение систем ду с помощью приложения Simulink
Непосредственное численное решение систем ду с помощью стандартных функций программного пакета Matlab
Ход решения
Решение любой системы ДУ, записанной в нормальной форме Коши, следует начинать с создания функции вычисления правых частей ДУ в соответствии с алгоритмом, рассмотренным раннее. Шаблон для составления функции рассмотрим ниже.
function dy=fright(t,y) % Заголовок функции (имена переменных и
% функции определяет программист)
global … % Описание глобальных переменных, если необходимо
… % Запись уравнений связи, если необходимо
dy(1) = …
dy(2) = … % Вычисление правых частей ДУ
…
dy(n) = …
dy = dy(:); % Вытягивание вектора производных в столбец
Последний оператор (вытягивание в столбец) является обязательным, начиная с версии Matlab 5.0, если в качестве функций решения ДУ используются стандартные функции Matlab (о них ниже).
Уравнения связи могут представлять собой какие-л. зависимости t и y от других переменных.
Пример создания функции правых частей (из Matlab demo, описывает зависимость между числом хищников и числом жертв):
function dy=lot(t,y)
dy(1)=(1-0.01*y(2))*y(1);
dy(2)=(-1+0.02*y(1))*y(2);
dy=dy(:);
Следующий шаг – воспользоваться стандартной функцией Matlab для решения системы ДУ либо создать собственную. В качестве примера ниже представлен листинг функции, реализующей решение системы ДУ методом Эйлера.
function [t,y]=ejl(fr,tt,y0,h) % fr – имя функции правых частей,
% которое пока неизвестно
t0=tt(1); tk=tt(end);
n=length(y0); k=ceil((tk-t0)/h);
t=zeros(k,1); y=zeros(k,n);
t(1)=t0; y(1,:)=y0(:)';
for i=1:(k-1)
dy=feval(fr,t(i),y(i,:)); dy=dy(:)'; % Один шаг
y(i+1,:)=y(i,:)+h*dy; % численного интегрирования
t(i+1)=t(i)+h; % методом Эйлера
end
Функция возвращает вектор-столбец t значений моментов времени, в которых определены решения (размерностью k*1), и матрицу y размерностью k*n решений. Оператор dy=dy(:)' после вызова функции решения предназначен для нейтрализации оператора dy=dy(:) в конце функции правых частей.
Фрагмент функции (внутренность цикла), соответствующий одному шагу численного интегрирования методом Эйлера-Коши, имеет вид:
% Один шаг численного интегрирования методом Эйлера-Коши
f1=feval(fr,t(i),y(i,:); f1=f1(:)';
t(i+1)=t(i)+h;
f2=feval(fr,t(i+1),y(i,:)+h*f1); f2=f2(:)';
y(i+1,:)=y(i,:)+h/2*(f1+f2);
Фрагмент функции (внутренность цикла), соответствующий одному шагу численного интегрирования методом Рунге-Кутта 4-го порядка, имеет вид:
% Один шаг численного интегрирования методом Рунге-Кутта 4-го порядка
k1=feval(fr,t(i),y(i,:); k1=k1(:)';
tp=t(i)+h/2;
k2=feval(fr,tp,y(i,:)+h/2*k1); k2=k2(:)';
k3=feval(fr,tp,y(i,:)+h/2*k2); k3=k3(:)';
t(i+1)=t(i)+h;
k4=feval(fr,t(i+1),y(i,:)+h*k3); k4=k4(:)';
y(i+1,:)=y(i,:)+h/6*(k1+2*k2+2*k3+k4);
Последний этап – написание и отладка основной программы (в отдельном script-файле), в которой выполняется вызов созданной функции решения системы ДУ применительно к конкретной задаче. Пример содержимого такого файла приведен ниже:
% RungeDemo
y0=[20;20];
clear t y
t0=0; tk=15; h=5e-3;
[t,y]=ejl('lot',[t0 tk],y0,h);
figure, subplot(1,2,1), plot(t,y), grid on,
title('Переходные процессы'); pause
subplot(122), plot(y(:,1),y(:,2)), grid on,
title('Фазовый портрет')
Результат работы такой программы представлен на рисунке ниже.
При постоянном шаге интегрирования выбор его величины должны осуществляться, исходя из минимальной постоянной времени (исходя из наибольшей скорости затухания какой-л. переменной). Так, в методе Эйлера величина шага должна быть по крайней мере в 10 раз меньше минимальной постоянной времени, в методе Эйлера-Коши – в 5 раз, в методе Рунге-Кутта 4-го порядка – в 2 раза.
Основанием для выбора шага интегрирования является многократное решение одной и той же системы ДУ при последовательном двукратном снижении шага интегрирования. Шаг, снижение которого в 2 раза не приводит к изменению решения, является достаточным.
Стандартные функции Matlab для решения систем ДУ
Прежде всего, в Matlab существует две функции с одинаковыми синтаксисом заголовка и форматом обращения, предназначенные для решения нежестких ДУ: ode23 (модифицированный метод Рунге-Кутта 2-3-го порядков) и ode45 (метод Рунге-Кутта-Мейсона 4-5-го порядка). Основные форматы вызова:
[t, y] = ode23('f', TSPAN, y0)
[t, y] = ode23('f', TSPAN, y0, OPTIONS, p1, p2, ...)
[t, y] = ode45('f', TSPAN, y0)
[t, y] = ode45('f', TSPAN, y0, OPTIONS, p1, p2, ...)
– численное
решение системы ДУ
n-го
порядка (это определяет размерность
векторов y
и y0),
правые части которых вычисляются
функцией f
(это имя совпадает с именем соответствующего
m-файла)
при начальных условиях, заданных вектором
(строкой или столбцом) y0,
в
точках на интервале изменения аргумента,
заданного вектором TSPAN,
с АВШ и контролем погрешности.
Возможные значения TSPAN:
TSPAN = [t0 tk] – задание начала и конца интервала изменения аргумента;
TSPAN = tk – задание конца интервала (t0 принимается равным нулю);
TSPAN = [t0 t1 t2 … tk] – явное задание точек, в которых следует найти решение.
OPTIONS – специальные опции, определяющие точность вычисления;
p1, p2, … – дополнительные параметры (если функция f нуждается в параметрах, кроме t и y, которые по какой-л. причине нельзя объявлять как глобальные).
Функция
возвращает векторы-столбцы t
(размерностью
)
и y
(размерностью
)
значений аргумента и решения, определяющих
найденное решение.
Пример использования функции ode45 в рассмотренном выше примере вместо функции ejl (файл RungeDemo) имеет вид:
[t,y]=ode45('lot',[t0 tk],y0);
Возможные опции (значения параметра OPTIONS) и их значения по умолчанию можно узнать с помощью команды
odeset
» odeset
AbsTol: [ positive scalar or vector {1e-6} ]
BDF: [ on | {off} ]
Events: [ on | {off} ]
InitialStep: [ positive scalar ]
Jacobian: [ on | {off} ]
JConstant: [ on | {off} ]
JPattern: [ on | {off} ]
Mass: [ {none} | M | M(t) | M(t,y) ]
MassSingular: [ yes | no | {maybe} ]
MaxOrder: [ 1 | 2 | 3 | 4 | {5} ]
MaxStep: [ positive scalar ]
NormControl: [ on | {off} ]
OutputFcn: [ string ]
OutputSel: [ vector of integers ]
Refine: [ positive integer ]
RelTol: [ positive scalar {1e-3} ]
Stats: [ on | {off} ]
Vectorized: [ on | {off} ]
Значения опций по умолчанию указаны в фигурных скобках. Наибольший интерес представляют параметры AbsTol (абсолютная погрешность), InitialStep (начальный шаг), MaxStep (максимальный шаг), RelTol (относительная погрешность).
Изменить значения опций можно, предварительно использовав вызов функции odeget, например, в виде:
opt = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
с последующим вызовом функции решения ДУ, например,
ode23('diffurav',[0 12],[0 1 1],opt);
В этом примере допустимая абсолютная погрешность установлена отдельно по каждой из переменных.
Информацию о текущих значениях опций после их изменения можно узнать с помощью команды odeget, например:
» odeget(opt,'RelTol')
ans =
0.0001
Кроме того, в Matlab существуют стандартные функции решения систем ДУ с АВШ:
ode113 – решение нежестких ДУ методом переменного порядка;
ode15s – решение жестких ДУ методом переменного порядка;
ode23s, ode23tb – решение жестких ДУ методом 2-3-го порядка;
ode23t – решение умеренно жестких ДУ методом 2-3-го порядка;
Трактование терминов жестких и нежестких ДУ может быть выполнено следующим образом:
Жесткими являются ДУ, в которых одно решение изменяется в несколько раз быстрее, чем другое или другие (например, система ЭП с одной малой и несколькими большими постоянными времени описывается жесткими ДУ). Нежесткие – такие ДУ, в которых скорости изменения всех решений соизмеримы (например, электромагнитные контуры электрических машин описываются, как правило, нежесткими ДУ).
Именно этим следует руководствоваться в первую очередь при выборе метода решения.
Пример.
Рассчитать
переходный процесс в схеме при замыкании
рубильника, определить зависимости
,
,
,
.
E
= 100 B
Jk = 5 A
C = 200 мкФ
L = 0,3 Гн
r1 = 20 Om
r2 = 50 Om
r3 = 70 Om
Решение. Выбираем положительное направление токов в ветвях.
1 этап. Составляем математическое описание по законам Кирхгофа (для схемы после коммутации).
(1)
Здесь
второе и третье уравнения – ДУ. Зависимые
переменные – i3,
uC,
независимая переменная –
.
Первое и четвертое – алгебраические
уравнения.
Для решения ДУ необходимо выразить токи i1, i2 через переменные i3, uC:
;
. (2)
Обозначим
,
,
и преобразуем ДУ из (1) в нормальную форму
Коши:
(3)
Из (2) получим уравнения связи:
;
. (4)
2 этап. Рассчитываем начальные условия.
Определение выполняем на основе схемы для предкоммутационного периода (при разомкнутом ключе). Математическое описание имеет вид:
Полагаем
для установившегося режима
:
и определяем начальные условия:
(5)
3 этап. Составляем функцию правых частей ДУ:
% Математическое описание электрической цепи
function dy=right1(t,y)
% Глобальные переменные
global E Jk R L C
% Уравнения связи в скалярной форме
i1=(E+y(1))/R(1); i2=y(2)-Jk;
% Дифференциальные уравнения
dy(1)=(i2-i1)/C;
dy(2)=(E-i1*R(1)-i2*R(2)-y(2)*R(3))/L;
dy=dy(:);
Функцию следует сохранить в файл right1.m
4 этап. Написание главной программы (script-файла).
% Глобальные данные
global E Jk R L C
% Исходные данные
E=100; Jk=5; C=200e-6; L=0.3; R=[20 50 70];
% Начальные условия
y0=[-Jk*R(3) Jk];
% Решение системы ДУ
[t,y]=ode45('right1',[0 0.1],y0);
% Определение выходных координат через зависимые переменные
% (Уравнения связи в векторной форме)
Uc=y(:,1); i1=(y(:,1)+E)/R(1); i2=y(:,2)-Jk; i3=y(:,2); ic=i2-i1;
% Построение графиков переходных процессов
figure, subplot(121), plot(t,[i1 i2 i3 ic]), grid on, legend('i1','i2','i3','ic');
subplot(122), plot(t,Uc), grid on
Результат работы программы приведен на рисунке.