- •А.К. Ефремов интегрированная
- •Рекомендовано редсоветом мгту им. Н.Э. Баумана
- •Isbn 5-7038-2301-3 мгту им. Н.Э. Баумана, 2003
- •1. Интерфейс системЫ matlab
- •1.1. Программная группа matlab
- •1.2. Командное окно matlab
- •1.2.1. Главное меню
- •1.2.2. Панель инструментов
- •1.3. Настройка параметров рабочего пространства
- •1.4. Справочная система matlab
- •2. Работа в режиме прямых вычислений
- •3. Базовые объекты системы matlab
- •3.1. Способы формирования матриц и векторов
- •3.2. Матричные операции и функции
- •3.3. Решение линейных уравнений
- •3.4. Вычисление корней полиномов
- •3.5. Обработка данных
- •4. Графические средства системы matlab
- •4.1. Графические объекты на плоскости
- •4.1.1. Функция plot
- •4.1.2. Функции fplot и ezplot
- •4.1.3. Другие графические функции
- •4.1.5. Обработка данных
- •4.2. Построение трехмерных поверхностей и тел
- •4.2.1. Основные графические функции
- •4.2.2. Дополнительные возможности
- •5. Основы программирования в среде matlab
- •5.1. Общие положения
- •5.2. Примеры простых программ
- •Xlabel('sin(X)') % Надпись по оси х
- •Xlabel('X') % Надпись по оси абсцисс
- •5.3. Программа с использованием внешней функции
- •5.4. Дополнительные программы
- •5.4.1. Дифференцирование функций
- •Xlabel('Число элементов массивов')
- •Xlabel('Число элементов массивов')
- •5.4.2. Функции eval, feval
- •Xlabel(‘t’), ylabel(‘y, dy/dt’)
- •Xlabel(‘y’), ylabel(‘dy/dt’)
- •6. Символьные вычисления
- •6.1. Определение символьной переменной
- •6.2. Основные функции
- •6.3. Математический анализ
- •6.3.1. Функция limit – предел функции одной переменной
- •6.3.2. Функция diff – дифференцирование функции одной переменной
- •6.3.3. Функция int – интегрирование функции одной переменной
- •6.3.4. Функция symsum – суммирование членов рядов
- •6.3.5. Функция taylor – разложение функции в ряд Тэйлора
- •6.4. Символьное решение уравнений
- •6.4.1. Решение отдельных уравнений
- •6.4.2. Решение систем уравнений
- •6.4.3. Решение дифференциальных уравнений
- •7. Пакет моделирования динамических систем simulink
- •7.1. Рабочая среда Simulink
- •7.2. Представление динамической системы в виде структурной схемы
- •7.3. Основные приемы работы в среде Simulink
- •7.4. Модель с ветвлением соединений
- •7. 5. Интегрирование дифференциального уравнения
- •Список литературы
- •Оглавление
- •Приложение
- •Разделы справочной системы
- •Программирования и отладки программ
- •Графические средства matlab
- •Символьные вычисления (symbolic math toolbox)
5.4. Дополнительные программы
5.4.1. Дифференцирование функций
В системе MATLAB имеется функция diff, предназначенная для вычисления конечных разностей; ее синтаксис:
z=diff(y), где – массив; функция diff возвращает конечные разности смежных элементов y:
;
число элементов на единицу меньше числа элементов х. Для перехода к производной конечные разности необходимо разделить на шаг независимой переменной х;
z=diff(y,n) – вычисление конечных разностей n-го порядка
Следует иметь в виду, что процедуре численного дифференцирования присуща методическая погрешность, возрастающая при увеличении шага независимой переменной и порядка производной. Поэтому функцию diff следует применять лишь для приближенного вычисления производных невысокого порядка относительно медленно изменяющихся (гладких) зависимостей.
Составим программу (deriv.m), иллюстрирующую вычисление производных до третьего порядка включительно:
% Численное дифференцирование функции
step=input('step ==> '); % Ввод шага независимой переменной
n=input('n ==> '); % Ввод высшего порядка производной
x=-3:step:(3+n*step); % Учет уменьшения числа элементов
% при дифференцировании
m=length(x)-n; % Число элементов массива высшей
% производной
y=exp(-x.^2); % Дифференцируемая функция
z1=diff(y)/step; % Первая производная
if n==2
z2=diff(z1)/step; % Вторая производная
end
if n==3
z2=diff(z1)/step;
z3=diff(z2)/step; % Третья производная
z2=z2(1:m);
end
x=x(1:m); % Уменьшение размерности массивов
y=y(1:m);
z1=z1(1:m);
figure % Открываем графическое окно
if n==1 % Строим графики исходной функции
plot(x,y,x,z1) % и ее производных
end
if n==2, plot(x,y,x,z1,x,z2), end
if n==3, plot(x,y,x,z1,x,z2,x,z3,'k'), end
grid
title('Численное дифференцирование')
Xlabel('Число элементов массивов')
ylabel('Функция и ее производные')
pause
close
Упрощенный вариант программы (deriv1.m) выводит графики как зависимости от номеров элементов. В этом случае корректировать их число с учетом уменьшения при дифференцировании не нужно.
step=input('step ==> ');
n=input('n ==> ');
x=-3:step:3;
y=exp(-x.^2);
color=['r','g','k'];
figure
plot(y), hold on
for k=1:n
z=diff(y,k)/step.^k;
plot(z,color(k)), hold on
end
grid
title('Численное дифференцирование')
legend('y(x)','dy/dx','d^2y/dx^2','d^3y/dx^3')
Xlabel('Число элементов массивов')
ylabel('Функция и ее производные')
pause
close
Упражнение. Составить программу дифференцирования другой функции и проанализировать влияние величины шага переменной на точность вычисления производной.
Дифференцирование может быть организовано и в командном режиме. Если задано аналитическое выражение исходной функции, во многих случаях операцию дифференцирования можно реализовать точно – в символьной форме.
5.4.2. Функции eval, feval
Возможность интерпретации и вычисления выражений, заданных в символьной форме, придает системе MATLAB дополнительную гибкость.
Функция eval(‘Выражение’) возвращает результат выполнения выражения, заданного символьно, при известном значении независимой переменной
script %eva
s='exp(-0.5*x).*sin(3*x)';
x=0:0.1:10;
y=eval(s);
plot(x,y)
grid
pause
close
Функция feval(‘Выражение’,x) возвращает значение внешней функции, заданной в символьной форме, при аргументе (массиве) х. Эту функцию применяют, когда внешняя функция вычисляется в теле другой процедуры, например, при интегрировании дифференциальных уравнений. В следующем простом примере использована созданная ранее внешняя функция func.
script %feva
global nn
nn=2;
f=’func’;
x=0:0.1:4;
plot(x,feval(f,x))
grid
pause
close
5.4.3. Решение обыкновенных дифференциальных уравнений (ОДУ)
В инженерной практике необходимость решения ОДУ возникает часто. Система MATLAB имеет встроенный решатель, который позволяет выбирать конкретный способ решения, задавать начальные условия (задача Коши) и оптимизировать вычислительный процесс. Решатель также используется в пакете SimuLink. Кроме того, при инсталляции системы MATLAB 5.х можно подключить специализированный пакет для решения дифференциальных уравнений (ДУ) в частных производных.
Вычислительный алгоритм при интегрировании ОДУ любого порядка заключается в том, что это уравнение превращают в систему ДУ первого порядка с соответствующими правыми частями: , где y –вектор переменных состояния; t – независимая переменная (в инженерных задачах чаще всего время); – вектор правых частей.
Решатель ОДУ использует различные численные методы, названия (имена) которых должны заменять слово solver:
[t,y]=solver(‘f’,tspan,y0), [t,y]=solver(‘f’,tspan,y0,options),
где результат вычислений [t,y] – матрица, столбцы которой представляют собой массивы t, а также и т.д.; ‘f’ – имя внешней функции, вычисляющей правые части ДУ первого порядка; задает диапазон изменения независимой переменной (от t0 до tk); y0 – вектор начальных значений; options – аргумент, создаваемый с помощью функции odeset.
В MATLAB реализуются следующие методы численного интегрирования:
Гладкие системы:
ode45 – алгоритм Рунге-Кутта 4-го и 5-го порядков; рекомендуется для пробного интегрирования системы ДУ;
ode23 – алгоритм Рунге-Кутта 2-го и 3-го порядков; применяется при низких требованиях к точности;
ode113 – решатель переменного порядка, основанный на формуле Адамса; эффективнее ode45 при высоких требованиях к точности и сложных выражениях в правых частях системы ДУ;
Жесткие системы: ode15s, ode23s, ode23t, ode23tb.
В качестве примера приведем программу для решения ДУ Ван-дер-Поля .. Введем обозначения: ; тогда исходное уравнение можно представить как систему из ДУ первого порядка:
Сначала составляем внешнюю программу (van.m) для вычисления правых частей ДУ:
% Вычисление правых частей
function ypr=van(t,y)
ypr=[y(2,:); (1-y(1,:).^2)*y(2,:)-y(1,:)];
затем script-файл (vander.m) (начальные условия: при ):
% Интегрирование ДУ Ван-дер-Поля
script %vander
y0=[0 1]';
[t,y]=ode45('van',[0 30],y0);
figure
plot(t,y(:,1),t,y(:,2))
title(‘Решение уравнения Ван-дер-Поля’)