Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
-6-05-~1.PDF
Скачиваний:
0
Добавлен:
28.12.2025
Размер:
6.59 Mб
Скачать

134

Окончание таблицы 2.6

8

9

10

11

12

13

14

15

Порядок выполнения работы.

1.Выполнить приведенные в указании упражнения.

2.Поместить в отчет решение самостоятельных задач, отмеченных маркером «В от-

чет».

3.В командном окне задать значения переменных, согласно варианту задания, представленному в таблице 2.6.

4.Записать выражение на языке MATLAB.

5.Оформить отчет.

Лабораторное занятие № 3. Моделирование законов управления исполнительными устройствами мобильных машин

Цель работы: получить навыки моделирования возмущающих (управляющих) воздействий и законов функционированияисполнительных устройств в математических моделях динамических системах мобильных машин.

Общие сведения

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

135

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

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

Например, задавая в качестве управляющего воздействия перемещение педали фрикционного сцепления, на основе конструктивных параметров последнего осуществляется определение передаточной функции, связывающей приводное усилие и развиваемый узлом момент. Полученный фрикционный момент будет являться входным параметром для коробки передач и т. д. Однако для этого необходимо иметь возможность и уметь производить силовой расчет фрикционного узла.

Сдругой стороны, в силу поставленных целей, например, оценки процессов трогания

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

Аналогичный подход удобно использовать и при моделировании гидро- и пневмоприводов, если нас интересует работа исполнительных устройств, а не системы в целом. Например, при анализе процесса торможения машины нет необходимости моделировать пневмопривод, включающий несколько десятков элементов, а достаточно задать закон изменения давления в пневмокамерах, или, что тоже вполне оправданно, учитывая механическую связь пневмокамеры с разжимным устройством тормозного механизма, непосредственно изменение тормозного момента, развиваемого тормозным механизмом. Конструктивные параметры тормозного механизма формируют передаточную функцию «пневмокамера – колесо».

Другая ситуация, если мы осуществляем моделирование работы самого пневматического привода. Но и здесь можно, с точки зрения упрощения математической модели, откры- тие-закрытие клапанных узлов моделировать с помощью заранее определенных законов. В качестве аргумента этих функций может использоваться, как время, так и некоторые рассчитываемые в математической модели параметры.

Сдостаточной для инженерных расчетов точностью закон изменения задающего воздействия или фрикционного момента может быть представлен в виде следующих зависимостей.

1. Экспоненциальный закон (рис. 3.1), который аналитически записывается в следующем виде:

M (t) = 0,

если t tз

M (t) = Mmax (1ek (ttз ) ), если t > tз

где Mmax – максимальное значение моделируемого воздействия;

k – коэффициент, зависящий от темпа изменения моделируемого воздействия. Коэффициент k подбирается в соответствии с моделируемым темпом нарастания моде-

лируемого воздействия чаще всего таким образом, чтобы за время tз+tн моделируемый параметр достигал 90–95 % своего максимального значения.

Данный закон,вчастности можнорекомендовать при моделированиипневмоприводов.

136

M

Mmax

tз

tн

t

Рисунок 3.1 – Экспоненциальный закон изменения возмущающего воздействия

2. Линейный закон (рис. 3.2), который аналитически можно представить в виде:

M = 0,

если t tз

M = Mmax

t tз

,

если tз <t tз +tн

 

 

tн

 

M = Mmax ,

если t > tз +tн

M

 

 

 

 

Mmax

tз

tн

t

Рисунок 3.2 – Линейный закон изменения возмущающего воздействия

3. Синусоидальный закон (рис. 3.3), который аналитически можно представить в виде:

M = 0,

 

 

 

если t tз

 

 

π

 

 

M = Mmax sin t tз

 

, если tз <t tз +tн

2

 

tн

 

 

M = Mmax ,

 

 

 

если t >tз +tн

Рисунок 3.3 – Синусоидальный закон изменения возмущающего воздействия

Порядок выполнения работы.

1.Составить программу для моделирования законов изменения управляющих воздействий согласно варианту задания в табл. 3.1.

2.Просчитать математическую модель закона включения с заданными характеристиками, приняв во внимание в приведенных зависимостях tз (время запаздывания воздействия).

3.Построить график заданного закона возмущающего воздействия.

137

4. Оформить отчет, содержащий математическую модель, распечатку программы, результаты расчета и построенный по ним график.

Таблица 3.1 – Варианты заданий

Закон включения

Mmax, Н

tз, с

tн, с

п/п

 

м

 

 

1

Линейный

1000

0.1

0.5

2

Экспоненц.

1000

0.1

0.5

3

Синусоид.

1000

0,1

0,5

4

Линейный

1500

0.15

0.4

5

Экспоненц.

1500

0.15

0.4

6

Синусоид.

1500

0,15

0,4

7

Линейный

500

0.05

0.25

8

Экспоненц.

500

0.05

0.25

№ п/п

Закон включения

Mmax, Н м

tз, с

tн, с

 

 

 

 

 

9

Синусоид.

500

0.05

0.25

10

Линейный

300

0,03

1,0

11

Экспоненц.

300

0,03

1,0

12

Синусоид.

300

0,03

1,0

13

Линейный

350

0.15

1.5

14

Экспоненц.

350

0.15

1.5

15

Синусоид.

350

0.15

1.5

Лабораторное занятие № 4. Численное интегрирование и дифференцирование средствами MATLAB

Цель работы: изучение возможностей Matlab по вычислению интегралов и дифференцированию функций, заданных аналитически и в виде массивов чисел.

1. Интегрирование в Matlab.

Численные методы основываются на понятии геометрического смысла интегрирования

– нахождении площади, которая находится под интегрируемой функцией.

Символьное вычисление интегралов.

Символьное вычисление интеграла аналитическими методами осуществляется в системе MATLAB с помощью функции int(f(x), a, b), где f(x) – подынтегральная функция; a, b – пределы интегрирования.

Эта функция может вычислить:

неопределенный интеграл;

неопределенный интеграл с символьными переменными;

определенный интеграл с символьными значениями пределов интегрирования;

определенный интеграл от алгебраической функции;

кратные интегралы;

– несобственные интегралы.

Технология аналитического вычисления интегралов заключается в следующем:

определение символьных переменных с помощью оператора syms;

ввод подынтегрального выражения с присвоением ему имени: y=f(x);

ввод функции int(y), если вычисляется неопределенный интеграл, или функции int(y,a,b), если вычисляется определенный интеграл в пределах [a;b].

получение решения.

Формы записи функции int():

int(S) – возвращает символьное значение неопределенного интеграла от символьного выражения или массива символьных выражений S по переменной, которая автоматически определяется функцией findsym. Если S – скаляр или матрица, то вычисляется интеграл по переменной 'х'.

int(S, v) – возвращает неопределенный интеграл от S по переменной v.

int(S, a, b) – возвращает определенный интеграл от S с пределами интегрирования от а до b, причем пределы интегрирования могут быть как символьными, так и числовыми.

int(S, v, a, b) – возвращает определенный интеграл от S по переменной v с пределами от а до b.

138

Варианты использования функции int()

1)>> syms x

>>int(sin(x)^3, x) ans =

(cos(x)*(cos(x)^2 - 3))/3

2)>> syms x z >>y=int((x^2-2)/(x*3-1)+z, x, 1, 2) y =

z + log((2^(26/27)*5^(1/27)*50^(2/3))/50) + 11/18

>>y=int((x^2-2)/(x*3-1)+z, z, 1, 2)

y =

(x^2 - 2)/(3*x - 1) + 3/2

3)>> syms x

>>y=int((x^2-2)/(x*3-1), x, 1, 2)

y =

log((2^(17/27)*5^(10/27))/5) + 11/18

>>double(y)

ans =

0.0342

4)>> syms x

>>int([x^3 sin(x) exp(x)], x) ans =

[ l/4*x^4, -cos(x), exp(x)]

5)>> syms x

>>int(log(sin(x)),x,0,pi/2)

ans =

-pi/2*log(2)

>>double(ans) ans =

-1.0888

С помощью функции int() можно вычислять имеющие аналитическое решение сложных интегралов, например с бесконечными пределами (или одним из пределов), а также кратные интегралы. Варианты использования функции int() для решения этих задач приведены ниже.

1)>> syms x

>>int(log(1+exp(-x)),x,0,inf) ans =

pi^2/12

2)>> syms x y z a b

>>int(int(int((x^2 + y^2)*z, x, 0, a), y, 0, a), z, 0, a) ans =

a^6/3

Численное вычисление интегралов.

В системе MatLab вычисление интегралов реализовано численными методами трапеции, Симпсона, Ньютона-Котеса. Рассмотрим технологию использования этих методов и программную реализацию некоторых других методов.

Методы прямоугольников

Данная группа методов включает:

метод правых прямоугольников;

метод левых прямоугольников;

139

– метод средних прямоугольников.

Суть их в построение под кривой прямоугольников одинаковый ширины и нахождение их суммарной площади.

Методы достаточны простые в реализации, однако имеют достаточно высокие погрешности и имеют первый порядок точности. Ошибка пропорциональна шагу и накапливается со временем. Соответственно, с уменьшением шага уменьшается и погрешность методов.

Пример 4.1.

Необходимо определить интеграл функции f(x) = x esin(x) x с шагом h = 0.02 на интервале от 0 до 1.

Один из вариантов программной реализации метода правых прямоугольников имеет вид (можно оформить в виде Script-файла, что предпочтительнее, или набрать в Command Window).

% Метод правых прямоугольников f=inline('x.*exp((sin(x)).^x)'); a=0;

b=1;

h=0.02;

N=((b-a)/h)+1; %количество шагов

x=a:h:b; %вычисление координат узлов сетки y=feval(f,x); %вычисление значений функции в узлах сетки m=2:N;

y1(m-1)=y(m); %создание массива значений функций в правых точках

Fr=sum(h*y1)

После выполнения получаем в Command Widow:

Fr =

1.0825

Функция feval (родственник функции eval) – интерпретирует и вычисляет текстовую строку, которая может содержать либо арифметическое выражение, либо инструкцию, либо обращение к функции.

Задание: решить вышеприведенную задачу составив программы для метода левых и средних прямоугольников.

Метод трапеций.

Одним из популярных и в тоже время простых методов является метод трапеций, который имеет второй порядок точности (ошибка пропорциональна шагу в квадрате).

В MATLAB метод трапеций реализован двумя функциями: trapz() и cumtrapz().

Функция trapz().

Используется часто, так как позволяет работать не только с векторами и матрицами, но

ис аналитической формой подынтегральной функции. Формат обращения к функции:

trapz(Y) – возвращает определенный интеграл, используя интегрирование методом трапеций с единичным шагом между отсчетами (X=1:length(Y)). Если Y – вектор, то trapz(Y) возвращает интеграл элементов вектора Y, если Y – матрица, то trapz(Y) возвращает вектор-строку, содержащую интегралы каждого столбца этой матрицы;

trapz(X, Y) – возвращает интеграл от функции Y по переменной X, используя метод трапеций (пределы интегрирования в этом случае задаются начальным и конечным элементами вектора X);

 

возвращает интеграл по строкам или по столбцам для входной

 

140

 

 

матрицы взависимости отзначенияпеременной

 

trapz(…,dim)

 

 

 

Параметры функции аналогичны параметрам

 

dim.

 

 

cumtrapz().

Следующие примеры отображают работу этой функции.

Пример 4.2.

Вычислить( ) = определенный( ). интеграл в диапазоне от 1 до 2 с шагом 0.1 для заданной функции:

Тогда для решения следует записать в MATLAB последовательность команд:

>>x=1:0.1:2;

>>y=log(x);

>>trapz(y)

После выполнения получаем в Command Widow:

ans=

( ) = ln ( ), которое вычисляется аналитиче-

0.3888

Точное значение интеграла от функции

ски, равно 0.3863.

Пример 4.3.

Вычислить определенный интеграл в диапазоне от 1 до 2 с неравномерным шагом по оси x (с шагом( ) 0=.1 в интервале( ). от 1 до 1.5 и с шагом 0.2 в интервале от 1.5 до 2) для заданной функции:

>>x=[1:0.1:1.5, 1.6:0.2:2];

>>y=log(x)

>>trapz(x,y) ans =

0.3856

Пример 4.4.

Вычислить значение интеграла методом трапеции, если функция f(X) задана векто-

ром Y=[1 3 5 7 9].

>>y=[1 3 5 7 9];

>>trapz(y)

>>ans =

20

Пример 4.5.

Вычислить значение интеграла методом трапеции, если функции fi(X) (i=1:5) заданы матрицей Y=[1 3 5 ; 3 5 7 ; 4 6 8; 4 7 9; 5 7 10].

>>y=[1 3 5 ; 3 5 7 ; 4 6 8; 4 7 9; 5 7 10];

>>trapz(y)

ans=

14 23 31.5

Пример 4.6.

Вычислить значение интеграла методом трапеции, если аргумент X и функ-

ция f(X) заданы векторами X=[1 3 7 9 10], Y=[1 3 5 7 9].

>> x=[1 3 7 9 10];

141

>>y=[1 3 5 7 9];

>>trapz(x,y)

ans=

40

Пример 4.7.

Вычислить значение интеграла методом трапеции, если аргумент X задан векто-

ром X=[1 3 7 9 10], а функция f(X) задана матрицей Y=[1 3 5; 3 5 7; 4 6 8; 4 7 9; 5 7 10].

>>x=[1 3 7 9 10];

>>y=[1 3 5; 3 5 7; 4 6 8; 4 7 9; 5 7 10];

>>trapz(x, y) ans=

30.550 68.5

Функция cumtrapz().

Обычно используют при работе с табличными данными или векторами. Откликом функции является n-интегралов, где n – число элементов вектора или элементов в каждом столбце матрицы. Значение функции cumtrapz(X, Y) можно рассматривать как дискретный аналог интеграла с переменным верхним пределом.

Формат обращения к функции:

cumtrapz(Y) – возвращает численное значение определенного интеграла для функции, заданной ординатами в векторе или матрице Y с шагом интегрирования, равным единице (интегрирование методом трапеций с накоплением). В случае, когда шаг отличен от единицы, но постоянен, вычисленный интеграл достаточно умножить на величину шага. Для векторов эта функция возвращает вектор, содержащий результат интегрирования с накоплением элементов вектора Y. Для матриц – возвращает матрицу того же размера, что и Y, содержащую результаты интегрирования с накоплением для каждого столбца матрицы Y;

cumtrapz(X, Y) – выполняет интегрирование с накоплением от Y по переменной X, используя метод трапеций. X и Y должны быть векторами одной и той же длины или X должен быть вектором-столбцом, a Y – матрицей;

cumtrapz(…,dim) – выполняет интегрирование с накоплением элементов по размерности, точно определенной скаляром dim. Длина вектора X должна быть равна size(Y. dim). dim – размерность, которая задает направление расчета: сumtrapz(Y, 1) работает над последовательными элементами в столбцах Y; cumtrapz(Y, 2) работает над последовательными элементами в строках Y; если dim больше ndims(Y), то cumtrapz возвращает массив нулей одного размера с Y).

Следующие примеры отображают работу этой функции.

Пример 4.8.

Пусть функция y(x) имеет значения, представленные в виде следующего вектора: y =

[1,2,3,4,5,6,7,8,9,10]. Необходимо вычислить:

( )

При этом a = 1; b = 1, 2, 3, 4 …,10.

Тогда для решения следует записать в MATLAB:

>>y=[1,2,3,4,5,6,7,8,9,10];

>>cumtrapz(y)

142

ans =

0

1.5000

4.0000

7.5000

12.0000

17.5000

24.0000

31.5000

 

40.0000

49.5000

 

 

 

 

 

 

Пример 4.9.

В данном примере рассматривается вариант использования функции cumtrapz(y) работы с данными, представленными вектором и матрицей. При этом функция y(x) задана в видематрицы y(x) = [1 3 5; 3 5 7; 4 6 8; 4 7 9; 5 7 10], ааргументпредставляетсобойвектор: x

= [1,3,7,9,10].

Тогда для решения следует записать в MATLAB:

>>y = [1 3 5; 3 5 7; 4 6 8; 4 7 9; 5 7 10];

>>x = [1,3,7,9,10];

>>cumtrapz(x,y) ans =

0

0

0

4.0000

8.0000

12.0000

18.0000

30.0000

42.0000

26.0000

43.0000

59.0000

30.5000

50.0000

68.5000

Метод Симпсона

Преимущество этого метода в том, что точки, взятые на каждом шаге на кривой, интерполируются полиномом второй степени, что обеспечивает методу четвертый порядок точности. На рисунке красная кривая (1) – функция, зеленая (2) – полином.

В MATLAB интегрирование с помощью метода Симпсона производит функция quad,

имеющая следующий синтаксис:

quad(f, a, b, tol, trace)

где f – указатель на функцию, задающей подынтегральное выражение, а, b – пределы интегрирования; tol – опциональный параметр, задающий точность вычисления, по умолчанию равен 10-06; trace – опциональный параметр, позволяющий получить информацию о ходе вычислений в виде таблицы, в столбцах которой представлены значение количества вычислений, начальная точка текущего промежутка интегрирования, его длина и значение интеграла; для задания этого параметра необходимо указать любое положительное число отличное от нуля.

Указатель f может быть задан одним из способов:

именем m-функции, заключенным в одинарные кавычки;

указателем @f, где f имя функции;

строкой, содержащей любую формулу с одной независимой переменной (аналитическое выражение подынтегральной функции, взятое в одинарные кавычки).

Минимальная форма обращения к функции – q=quad(f,a,b).

Пример 4.10.

 

Вычислить определенный интеграл с точностью 10-4

методом Симпсона.

10

 

( + ln( ) + 1)

 

0

 

Вариант 1 – стандартным оператором.

Точность вычислений задается четвертым параметром функции quad. Следует отметить, что в задании нижним пределом является 0, а в примере использовано число 0.001. Это

143

связано с тем, что при подстановке 0 функция не определена, так как натуральный логарифм от 0 не существует.

>>quad('x.*exp(-x)+log(x)+1',0.001,10,1e-4)

>>ans =

24.0322

Вариант 2 – путем программирования алгоритма метода Симпсона. Создадим Script-файл:

F = @(x) x*exp(-x)+log(x)+1;

%функция

a=0.01;

%пределы интегрирования

b=10;

 

n=100;

%количество интервалов деления

h=(b-a)/n;

%определение шага

integ = F(a);

 

for i=1:1:((n/2)-1)

%реализация алгоритма Симпсона

x=a+2*h*i;

 

integ=integ+2*F(x)+4*F(x+h);

 

end

 

integ=h*integ/3

 

integ =

 

24.0910

 

Для вычисления двойного интеграла методом Симпсона используется функция dblquad, имеющая следующий синтаксис:

dblquad(f, inmin, inmax, outmin, oiitmax, tol, trace)

где f – указатель на функцию, задающей подынтегральное выражение f (Inner, outer);. Inner – внутренняя переменная, изменяющаяся на закрытом интервале от inmin до inmax, a outer – внешняя переменная, изменяющаяся на закрытом интервале от outmin до outmax.

Указатель f, опциональные параметры tol и trace задаются аналогично функции quad.

Пример 4.11.

Вычислить двойной интеграл функции 2*y*sin(x)+x/2*cos(y) для пределов интегри-

рования: по x от π до 2π; по y от 0.2 до π.

Создаем m-файл integl.m, описывающий подинтегральную функцию.

function integ2 = integl(x,y) integ2=2*y*sin(x)+x/2*cos(y);

end

ВScript-файле или в командном окне обращаемся к функции dblquad():

>>result = dblquad(@integl,pi,2*pi,0.2,pi) result =

-21.1298

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

144

2. Численное дифференцирование в Matlab.

Процесс дифференцирования подразумевает нахождение производной. Для получения разных порядков производной, можно провести операцию дифференцирования несколько раз. Численное дифференцирование строится на использовании аппарата конечных разностей и соответствующего многообразия аппроксимаций.

Встроенные средства дифференцирования в Matlab.

К стандартным средствам дифференцирования в MATLAB относится такой инструмент как функция diff(x). Она принимает аргумент x, который является массивом.

Синтаксис:

diff(X) diff(X, n, dim)

Функция diff(X) вычисляет конечные разности. Если X – одномерный массив вида X = [x(1) x(2) ... x(n)], то diff(X) – это вектор разностей соседних элементов diff(X) = [x(2)x(1)

x(3)x(2) ... x(n)x(n1)], у которого количество элементов на единицу меньше количества элементов вектора X. Если X – двумерный массив, то diff(X) возвращает матрицу разности

столбцов diff(X) = [X(2:m, :)X(1:m1, :)].

Если в качестве аргумента указывается функция, то diff(f) возвращает символьное выражение производной функции f(x) по переменной x.

Функция diff(X, n, dim) возвращает конечные разности для матрицы X по строкам или по столбцам в зависимости от значения параметра dim.

Создаем Script-файл или набираем в = ( )

 

 

Пример 4.12.

 

 

 

 

 

Вычислить производную функции

 

 

.

 

 

 

 

Command Window:

syms x

% создание символьной переменной x

f = cos(x);

 

 

 

 

 

disp('f(x):=');

 

 

 

 

 

disp(f);

 

 

 

 

 

d = diff(f);

% дифференцирование f(x)

 

 

disp('Производная функции f(x):=');

 

 

 

disp(d);

 

 

 

 

 

Результат имеет вид:

 

 

 

 

f(x):=

 

 

 

 

 

cos(x)

 

 

 

 

 

Производная функции f(x):=

 

 

 

 

-sin(x)

 

 

= ( )

 

Воспользуемся функцией diff в

 

Пример 4.13.

 

 

 

 

попеременной t.

Вычислить производную функции

 

 

 

формате: diff(f, a). Она возвращает символьное выражение производной функции f по переменной a.

syms x t;

f = sin(x*t); disp('f(x) :'); disp(f);

% Производная функции f(x,t) по t d = diff(f,t);

disp('Производная функции f(x,t) по t');

145

disp(d); f(x) : sin(t*x)

Результат имеет вид:

Производная функции f(x,t) по t x*cos(t*x)

Пример 4.14.

 

 

попеременной t.

Вычислить производную функции

 

Воспользуемся функцией diff в

формате: diff(f, b, k). Она возвращает символьное вы-

 

=

 

ражение производной порядка k функции f по переменной b.

syms x m; f = x^m;

disp('f(x,m) :'); disp(f);

% Вторая производная функции f(x,m) по переменной x d = diff(f,x,2);

disp('Вторая производная функции f(x,m) по переменной x:'); disp(d);

Результат имеет вид:

f(x,m) : x^m

Вторая производная функции f(x,m) по переменной x: m*x^(m - 2)*(m - 1)

Для вычисления значения символьных выражений в Matlab при каких-то заданных значениях переменной можно воспользоваться несколькими функциями. Сначала нужно заменить все переменные на число с помощью оператора subs. Затем перевести полученное выражение в числовое с помощью оператора double.

syms x

= cos ( ) при значении x = pi/2.

Пример 1.15.

 

Вычислить производную функции

 

f = cos(x); disp('f(x) :'); disp(f);

% Дифференцирование функции f(x) d = diff(f);

val = subs(d,x,pi/2);

disp("Значение f'(x) при x = pi/2:"); disp(val);

Результат имеет вид:

f(x) : cos(x)

Значение f'(x) при x = pi/2:

-1

Программная реализация численного дифференцирования.

Методы численного дифференцирования применяются, если исходную функцию y(x) трудно или невозможно продифференцировать аналитически. Методы имеют разную погрешность при расчетах.

146

Вкачестве программной реализации численных методов рассмотрим основные из них на примере дифференцирования функции sin(x).

Вкачестве исходных данных для сравнения определим массив значений аргумента x, соответствующие значения функции sin(x) и производной y’=cos(x).

Программная реализация этого имеет вид:

h=0.2;

%задание шага дифференцирования

x=0:h:pi;

%массив значений х

n=length(x);

%размер массива (число необходимых итераций)

dy=cos(x);

%массив значений производной y'=cos(x),

 

%для оценки погрешности дифференцирования.

dz=sin(x);

%массив значений дифференцируемой функции y=sin(x)

Метод нахождения производной правой конечной разностью.

Формула метода имеет вид:

yi′ = yi+1hyi +O(h)= hyi +O(h),

где O(h) – погрешность метода (зависит от шага дифференцирования h).

Программная реализация метода:

for i=1:(n-1)

 

 

dy1(i)=(sin(x(i+1))-sin(x(i)))/h; %вычисление

производных

er1(i)=abs(dy(i)-dy1(i));

%вычисление

погрешностей

end

 

 

Метод нахождения производной левой конечной разностью.

Формула метода имеет вид:

yi′ = yi hyi1 +O(h)= hyi +O(h),

где O(h) – погрешность метода (зависит от шага дифференцирования h).

Программная реализация метода:

for i=2:n

 

 

dy2(i)=(sin(x(i))-sin(x(i-1)))/h; %вычисление

производных

er2(i)=abs(dy(i)-dy2(i));

%вычисление

погрешностей

end

 

 

Метод нахождения производной центральной конечной разностью.

Формула метода имеет вид:

yi′ = yi+12hyi1 +O(h2 )= 2yhi +O(h2 ),

где O(h2) – погрешность метода (зависит от шага дифференцирования h).

Программная реализация метода:

147

for i=2:(n-1)

dy3(i)=(sin(x(i+1))-sin(x(i-1)))/(2*h); %вычисление

производных

er3(i)=abs(dy(i)-dy3(i));

%вычисление

погрешностей

end

Метод нахождения производной четвертого порядка точности.

Формула для 4-го порядка точности и 4 переменных (в нашем случае переменных больше):

f (x1 +1,5 h)= (y4 + 27 y3 27 y2 + y1 )/ (24 h)+O(h4 ),

где O(h4) – погрешность метода (зависит от шага дифференцирования h). Программная реализация метода:

for i=3:(n-1)

dy4(i)=(-sin(x(i+1))+27*sin(x(i))- ...%вычисление производных 27*sin(x(i-1))+sin(x(i-2)))/(24*h); er4(i)=abs(cos(x(i)-0.5*h)-dy4(i)); %абсолютная погрешность, вы-

%числяется в точке x(i)-0.5*h

end

Нахождение второй производной в Matlab.

Рассмотрим использование формулы для центральной конечной разности и формулы 4-го порядка точности для вычисления второй производной функции sin(x), которая равна y’’=-sin(x). Сравним результаты дифференцирования с аналитическим решением.

Аналогично вычислению первой производной:

h=0.2;

% задание шага дифференцирования

x=0:h:pi;

%

массив значений аргумента

n=length(x);

% число итераций

d2y=-sin(x);

% точное значение второй производной d2y=-sin(x)

dz=sin(x);

%

массив значений дифференцируемой функции y=sin(x)

Метод нахождения производной центральной конечной разностью для второй производной.

Формула:

y′′(xi )= yi+1 2h2yi + yi1 +O(h2 )= h22yi +O(h2 ).

Программная реализация метода:

for

i=2:(n-1)

 

 

d2y1(i)=(sin(x(i+1))-2*sin(x(i))+... %вычисление производных

 

sin(x(i-1)))/h^2;

 

end

er1(i)=abs(d2y(i)-d2y1(i));

%вычисление погрешностей

 

 

Метод нахождения производной четвертого порядка точности для второй производной.

Формула:

f ′′(x3 )= (y5 +16 y4 30 y3 +16 y2 y1 )/ (12 h2 )+O(h4 )

Программная реализация метода:

148

for i=3:(n-2) d2y2(i)=(-sin(x(i+2))+16*sin(x(i+1))-30*sin(x(i))+...

16*sin(x(i-1))-sin(x(i-2)))/(12*h^2); er2(i)=abs(d2y(i)-d2y2(i));

end

Численное дифференцирование в Matlab функции, заданной таблично.

Найти 1-ую и 2-ую производные функции, заданной таблично.

xi

-3

-2

-1

0

1

2

3

yi

-0,71

-0,01

0,51

0,82

0,88

0,51

0,49

Так как задана не сама функция, а только точки, через которые она проходит, то необходимо найти некоторую аппроксимирующую функцию, приближенную к данным точкам. Воспользуемся соответствующей функцией polyfit(), которая осуществляет полиномиальную аппроксимацию в MATLAB.

Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который аппроксимирует функцию y(x) в смысле метода наименьших квадратов. Выходом является строка p длины n+1, содержащая коэффициенты аппроксимирующего полинома.

Программная реализация будет иметь вид:

x=[-3 -2 -1 0 1 2 3];

 

 

 

y=[-0.71 -0.01 0.51

 

0.82 0.88 0.51

0.49];

nm=4;

% задание степени аппроксимирующего полинома

p=polyfit(x,y,nm);

%

полиномиальная аппроксимация функции

y1=polyval(p,x);

%

вычисление значений функции согласно

 

%

полиному

 

dyt = polyder(p);

% вычисление производной от полинома

dyt2 = polyder(dyt);

%

вычисление второй производной от полинома

dy = polyval(dyt,x);

% вычисление значений первой производной

dy2 = polyval(dyt2,x);%

вычисление значений второй производной

plot(x,y,'-*');

% построение таблично заданной функции

hold on

 

 

 

plot(x,y1,'-<');

%

построение аппроксимирующей функции

plot(x,dy,'-or');

%

построение производной первого порядка

plot(x,dy2,'-og');

%

построение производной второго порядка

grid on

 

 

 

legend('табличная функция', 'аппроксимирующая функция', 'производная первого порядка', 'производная второго порядка');

При необходимости вывода численных значений переменных в процессе решения, достаточно просто убрать «;» в конце соответствующих строк кода.

149

Порядок выполнения работы.

1.Выполнить все примеры, приведенные в работе.

2.Оформить отчет, содержащий программные коды использованных методов.

Лабораторное занятие № 5. Численное решение алгебраических и трансцендентных уравнений средствами MATLAB

Цель работы: изучение возможностей MATLAB по решению нелинейных уравнений.

Общие сведения

Уравнения, которые содержат переменные, находящиеся в степенях, отличающихся от единицы, или имеющие нелинейные математические выражения (корень, экспонента, логарифм, синус, косинус и т. д.), а также имеющие вид f(x) = 0 называются нелинейными. В зависимости от сложности такого уравнения применяют различные методы для решения нелинейных уравнений.

В данной работепомимовстроенныхфункций MATLAB рассматривается программная реализация следующих методов:

метод перебора;

метод простых итераций;

метод половинного деления

Наряду с этими методам рассматриваются встроенные функции Matlab для решения алгебраических и трансцендентных уравнений: solve(), fzero(), roots().

Программная реализация методов решения нелинейных уравнений. Метод перебора.

Самый простой метод, который заключается в том, что сначала задается какое то приближение x (желательно слева от предполагаемого корня) и значение шага h. Затем, пока выполняется условие f(x) * f(x + h) > 0, значение x увеличивается на значение шага x = x + h. Как только условие перестало выполняться – это значит, что изменился знак функции и решение нелинейного уравнения находится на интервале [x; x + h].

Программная реализация метода перебора в Matlab:

Пример 5.1.

Результат:

>> perebordem1 x =

0.5671

i =

150

5671

Функцию можно объявить с помощью функции inline, но в последних версиях Matlab рекомендуется использование анонимной функции @(). Число итераций составило 5671. Очевидно, что чем точнее начальное приближение, тем меньше итераций необходимо затратить.

Метод простых итераций.

Для использования данного метода функцию преобразуют к виду: x = g(x). Эти преобразования можно сделать разными способами, в зависимости от вида начальной функции. Кроме этого, необходимо задать начальное приближение.

Алгоритм вычисления имеет схему xn= g(xn-1). То есть на следующей итерации исполь-

зуется значение корня, вычисленное на предыдущем шаге.

 

| −1|

 

, то есть, как

только будет достигнута заданная точность. В примере 5.2

 

Процесс заканчивается, как только выполнится условие:

 

 

ций в MATLAB для примера 5.1.

 

 

 

реализован метод простых итера-

 

 

 

 

 

 

 

Основной проблемой при работе с данным итерационными методами является про-

Так как не всегда удается

 

| ( )| < 1

 

 

 

 

 

блема сходимости. Достаточным условием сходимости метода последовательных приближе-

 

условия

 

 

для всех значений хn.

 

 

ний является выполнение

 

вычислить

производную, то идут по пути ограничения числа

итераций. Это позволит исключить зацикливание программы в случае невозможности найти решение вообще или с требуемой точностью.

Пример 5.2.

Результат:

>> iterdem1 x1 =

0.5671

i =

22

Очевидно, что метод простых итераций работает гораздо быстрее и при получении более точного решения.

Метод половинного деления.

Метод основан на следующем алгоритме:

1) задается начальный интервал поиска решения [a; b],

2) вычисляется точка, соответствующая середине интервала [a; b], c = (a+b)/2;

3) находятся значения функции в точках a и c и сравниваются знаки f(a) и f(c).

151

4)если знаки разные – для следующего шага остается интервал [a; c], в противном случае – интервал [c; b]. Таким образом, на каждом шаге интервал поиска решения сокращается

в2 раза.

5)п. 2–4 повторяются, пока не будет достигнута требуемая точность.

Реализация метода в MATLAB приведена в примере 5.3:

Пример 5.3.

Результат:

>> poldeldem1 c =

0.5671

i =

17

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

Встроенные функции решения нелинейных уравнений в Matlab. Символьное решение с помощью функция SOLVE().

Функция solve() служит для символьного решения как одиночных, так и систем алгебраических уравнений. Функция имеет следующий синтаксис:

solve(expr1, expr2,... exprN, var1, var2,... varN) – возвращает значения переменных vari,

при которых соблюдаются равенства, заданные выражениями expri (i=1, N). Если в выражениях не используются знаки равенства, то полагается ехрri = 0;

solve(expr1, expr2, ..... exprN) аналогична предшествующей функции, но переменные, по которым ищется решение, определяются функцией syms.

Ниже представлены примеры решения нелинейных уравнений с помощью функции

solve().

Пример 5.4.

>>syms x y

>>y=solve(x^3-1, x)

y =

1

-(3^(1/2)*1i)/2 - 1/2 (3^(1/2)*1i)/2 - 1/2

152

Пример 5.5.

>> syms a b c; y=solve(a*x^2+b*x+c)

y =

-(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)

Пример 5.6.

Решение системы уравнений

>>syms x y

S=solve (x+y==3, x*y^2==4, x, y) % результат представляется в виде

% структурного массива

S=

struct with fields:

x:[2×1 sym]

y:[2×1 sym]

>>S.x ans = 1 4

>>S.y ans =

2 -1

Пример 5.7.

Решение системы уравнений аналогичной примеру 6.

>>syms x y

[S1 S2] = solve(x+y==3, x*y^2==4, x, y) % результат

%представляется в виде двух векторов

S1 =

1

4

S2 =

2 -1

Пример 5.8.

>> syms x y=solve(sin(x)==0.5, x)

y =

pi/6

(5*pi)/6

>> double(y) ans =

0.5236

2.6180

Функция solve() имеет следующий недостаток. Она не требует информации о начальном значении корня или области его изоляции. Поэтому в случае трансцендентных уравнений и в ряде других случаев, она не находит всех корней уравнения.

Функция FZERO( ).

Функция fzero() используется для нахождения вещественных корней уравнений вида f(х)=0. Алгоритм, реализованный этой функцией, представляет собой комбинациюметода дихотомии (половинного деления), метода хорд и метода обратной квадратичной интерполяции. В

153

простейшем варианте обращения кромеуказателя на функцию, корень которой ищется, задается окрестность х0, с которой начинается поиск: х = fzero(f, x0).

Аргумент f может быть задан одним из способов:

формулой с неизвестным х, заключенная в апострофы;

именем m-файла (в апострофах и без расширения .m);

указателем на функцию;

указателем на анонимную функцию.

При этом формула, заключенная в апострофы, в качестве независимой переменной может содержать только х. Использование независимой переменной с другим именем вызовет сообщение об ошибке.

Аргумент х0может быть задан одним из двух способов:

вектором [a; b], представляющим интервал (а<b), внутри которого функция f меняет знак, что гарантирует нахождение, по крайней мере, одного корня на этом интервале;

скалярным значением, в окрестности которого предполагается нахождение корня. В этом случае функция fzero() сама пытается найти интервал с центром в заданной

точке х0, на концах которого функция f меняет знак.

Рассмотрим задачу определения корней некоторой функции, например, f(x)=x·e-x+sin(x).

Длянахожденияначальногоприближениядляданной функции удобнеевсегопостроить ее график.

Пример 5.9.

Из графика видно, что в заданном интервале корень находится в диапазоне изменения аргумента [3; 4]. Используем полученную информацию для уточнения этого корня с помощью функции fzero( ):

>> x=fzero('x.*exp(-x)+sin(x)',[3,4]) x =

3.2665

Вместо явного задания формулы для функции в командном окне чаще всего целесообразным является объявление соответствующей функции, запись ее в виде отдельногоm-файла или включение ее в качестве подфункции в файл основной программы.

154

Пример 5.10.

Результат:

>> fzerodem2 x =

3.2665

Если необходимо получить не только значение корня, но и получить дополнительную информацию о вычислениях, fzero( ) можно обратиться к функции fzero( ) в следующем формате:

[x, fval, exitflag, output] = fzero()

где fval – возвращает значение функции в найденной точке;

exitflag положительное значение (обычно, это 1) означает, что удалось найти интервал, на концах которого функция f( ) меняет знак. Если такой интервал не обнаружен, то ex- itflag=-1;

output – данная структура содержит несколько полей с именами intervaliterations, iterations, funcCount и algorithm. В первом из них находится количество итераций, выполненных при поиске корня, во втором – количество обращений к функцииf( ), в третьем – наименование алгоритма, использованного для нахождения корня.

Пример 5.11.

Результат:

>> fzerodem2 x =

3.2665 fval =

2.0817e-16 exitflag =

1 output =

struct with fields: intervaliterations: 0

iterations: 6 funcCount: 8

algorithm: 'bisection, interpolation'

message: 'Zero found in the interval [3, 4]'

155

Функция ROOTS().

Функция r = roots(p) возвращает корни полинома, представленного коэффициентами p, как вектор-столбец. Параметр p – вектор, содержащий n+1 полиномиальные коэффициенты, начиная с коэффициента перед xn:

p1xn+...+pnx+pn+1 = 0

Например, p = [3 2 2] представляет полином 3x2+2x−2.

Пример 5.12.

Решить уравнение 3x2−2x−4=0.

>> p = [3 -2 -4]; r = roots(p)

r =

1.5352 -0.8685

Функция возвращает вектор корней полинома, в том числе и комплексных.

Порядок выполнения работы.

Выполнение данной лабораторной работы заключается в нахождении с заданной точностью ε одного из корней кубического уравнения:

F (x)= a0 + a1 x + a2 x2 + a3 x3 = 0

рассмотренными выше методами. Коэффициенты многочлена, точность вычисления и номер вычисляемого корня заданы в таблице. Решение осуществляется в два этапа. На первом этапе с помощью грубого анализа находятся приближенные значения корней.

На втором этапе рассчитанное исходное приближение х0 уточняется каждым из трех рассмотренных методов до достижения требуемой точности ε.

1.Составить программу, реализующую алгоритмы соответствующего метода для решения алгебраического или трансцендентного уравнения.

2.Решить уравнение.

3.Оформить отчет, содержащий:

3.1.Исходное уравнение f(х) = 0.

3.2.Таблицу для нахождения приближенных значений корней и график функции f(х).

3.3.График функции y = f(х).

3.4.Текст программы, результаты расчета и график нахождения искомого корня (2–3 шага в укрупненном масштабе) методом половинного деления.

3.5.Текст программы, результаты расчета и график нахождения искомого корня (2–3 шага в укрупненном масштабе) методом простых итераций.

3.6.Текст программы, результаты расчета и график нахождения искомого корня (2–3 шага в укрупненном масштабе) с использование функции fzero().

3.7.Выводы, содержащие анализ точности и скорости сходимости рассмотренных ме-

тодов.

Таблица 5.1 – Исходные данные для расчета

Вариант

a0

a1

a2

a3

ε

№ корня

1

0,6768

0,144

0,47

0,1

0,0001

1

2

2,2976

0,4335

0,795

0,15

0,0001

2

3

5,372

1,2493

0,559

0,13

0,0001

3

4

3,8987

0,5819

0,737

0,11

0,0001

1

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