Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MATLAB.doc
Скачиваний:
202
Добавлен:
13.11.2018
Размер:
1.36 Mб
Скачать

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(‘Решение уравнения Ван-дер-Поля’)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]