Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Применение MATLAB для решения аналитических задач моделирования. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Аппроксимация в Matlab
71
АППРОКСИМАЦИЯ В MATLAB
«Аппроксимацией (приближением) функции f(x) называется нахождение такой функции (аппроксимирующей функции) g(x), кото­рая была бы близка заданной. Критерии близости функций могут быть различные.
В случае если приближение строится на дискретном наборе точек, аппроксимацию называют точечной или дискретной.
В случае если аппроксимация проводится на непрерывном мно­жестве точек (отрезке), аппроксимация называется непрерывной или интегральной. Примером такой аппроксимации может служить разло­жение функции в ряд Тейлора, т.е. замена некоторой функции степен­ным многочленом»5.
Интерполяция является одним из наиболее распространенных ви­дов точечной аппроксимации и заключается в нахождении некоторых промежуточных значений из имеющегося дискретного набора известных значений.
Любую линейную функцию можно представить в виде
.
В ходе аппроксимации коэффициенты a и b рассчитывались таким образом, чтобы все экспериментальные точки находились очень близко к аппроксимирующей прямой.
Метод наименьших квадратов (МНК) заключается в том, что за значение принимается величина квадратов отклонений значений точек от аппроксимирующей точки:
Решение задачи сводится к нахождению экстремума заданной функции двух переменных. Для этого находят и приравнивают к нулю частные производные функции по коэффициентам а и b.
5
Линейная аппроксимация. URL: https://prog-cpp.ru/mnk/
Применение Matlab для решения аналитических задач моделирования
72
В результате получаем систему уравнений:
В процессе решения определяются значения коэффициентов
Для вычисления коэффициентов находят следующие значения:
В результате значения коэффициентов определяются следующим
образом6:
6
Линейная аппроксимация. URL: https://prog-cpp.ru/mnk/
Аппроксимация в Matlab
73
В среде Matlab аппроксимация получила более широкое распростра­нение. Суть метода заключается в том, что табличные данные аппроксими­руются кривой, которая должна сглаживать все случайные шумы табличной функции и не обязательно проходит через все узловые точки.
Метод наименьших квадратов (МНК)
Один из самых популярных методов аппроксимации в Matlab и в других средах, это метод наименьших квадратов (МНК). В этом методе при сглаживании опытных данных аппроксимирующую кривую частоту приема задают так, чтобы ее отключение от табличных данных по всем узловым точкам было выявлено.
Суть МНК решается в последующем: для табличных данных, полу­ченных в результате эксперимента, отыскать аналитическую зависимость, чтобы количество квадратов отклонений от табличных данных во всех выявленных точках было значительно. Аппроксимация в Matlab по МНК производится с применением функции polyfit. Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который аппроксимиру­ет функцию y(x) в смысле метода наименьших квадратов. Выходом явля­ется строка p длины n+1, содержащая коэффициенты аппроксимирующе­го полинома.
Например, можно осуществить аппроксимацию в Matlab табличных данных x = [0.1, 0.3, 0.5, 0.7, 0.9] и y = [3, 4.5, 1.7, 0.7, –1] с применением метода наименьших квадратов, а после многочленами 1-й и 2-й степени приблизить найденные значения (рис. 35). В процессе решения нужно также определить величину среднеквадратической ошибки.
>> x = [0.1, 0.3 , 0.5, 0.7, 0.9]; y = [3, 4.5, 1.7, 0.7, –1]; grid on plot(x, y, '*r'); xi = min(x):0.1:max(x); N = 1; % степень coeff1 = polyfit(x, y, N); y2 = 0; for k=0:N
Применение Matlab для решения аналитических задач моделирования
74
y2 = y2 + coeff1(N–k+1) * xi.^k; end hold on; plot(xi, y2, 'r'); N = 2; coeff2 = polyfit(x, y, N); y3 = 0; for k=0:N y3 = y3 + coeff2(N–k+1) * xi.^k; end hold on; plot(xi, y3, 'g'); std(y–(coeff1(1)*x+coeff1(2))) std(y–(coeff2(1)*x.^2+coeff2(2)*x+coeff2(3))) ans = 0.9829 ans = 0.7669
Рис. 35. Построение графиков функции и приближающих
ее многочленов 1-й и 2-й степени
Однако есть задачи, где требуется реализовать аппроксимацию в Matlab без использования специальных функций. Например, найти y (0,8), построив аппроксимирующий многочлен методом наименьших квадратов по данным (табл. 31, рис. 36):
x: 0.1, 0.3, 0.5, 0.7, 0.9 y: 3, 4.5, 1.7, 0.7, -1 p: 0.5, 0.8, 1.6, 0.8, 0.1
Аппроксимация в Matlab
75
Таблица 31
Построение полинома с использованием определителя Вандермонда
Код
Значение
>> x = [0.1; 0.3; 0.5; 0.7; 0.9]; y = [3;4.5;1.7;0.7; –1]; >>W = vander(x); W = W(1:5,2:5); >>A = W'*W; >>b = W'*y; >>a = inv(A)*b >>qq = polyfit(x,y,3) x1 = [–0.3:0.001:0.7]; y1 = a(1)*x1.^3 + a(2)*x1.^2 + a(3)*x1 + a(4); >>plot(x,y,'*'); hold on; grid on; plot(x1,y1,'Color','r'); >>x2 = 0.8; y2 = a(1)*x2^3 + a(2)*x2^2 + a(3)*x2 + a(4)
Задаем массивы данных: Строим матрицу W – матрицу Ван­дермонда с вырезанным первым столбцом Вычисляем элементы матрицы А как произведение транспонированной матрицы W и просто матрицы W Вычисляем элементы вектора b Решая систему уравнений Aa = b, находим значения вектор-столбца a Это будут коэффициенты аппрокси­мирующего полинома. Проверяем, используя методы MATLAB = функцию polyfit: Получаем аппроксимированные зна­чения y: Строим график функции Находим значение в точке x = 0,8
Вывод:
a = 37.5000 –64.4643 25.3393 1.1961 qq = 37.5000 –64.4643 25.3393 1.1961 y2 = –0.5896
Рис. 46. Построение полинома с использованием определителя Вандермонда
Применение Matlab для решения аналитических задач моделирования
76
Также можно реализовать весь алгоритм через одну функцию с по­мощью функции lsqcurvefit(fun,x0,xdata,ydata), где
xdata, ydata – табличные значения аппроксимируемой функции;
x0 – начальное значение параметров функции;
fun – определяемая пользователем функция аппроксимации.
С аналитической и теоретической стороны различают следующие виды аппроксимации:
• Аппроксимация ортогональными классическими полиномами;
• Аппроксимация каноническим полиномом.
Лабораторная работа № 10.
Аппроксимация в Matlab
Осуществить аппроксимацию в Matlab табличных данных соглас­но вариантам в табл. 32. Применяя метод наименьших квадратов, при­близить ее многочленами 1-й и 2-й степени. Для каждого многочлена определить величину среднеквадратической ошибки. Найти у(а) путём построения аппроксимирующего полинома методом наименьших квад­ратов согласно данным.
Таблица 32
Варианты заданий для лабораторной работы № 10
№ варианта
Диапазон Х
Диапазон У
А 1 [0, 0.1 , 0.2, 0.3, 0.4];
[3, 2.5, 1.1, 0.7, –1];
0.5
2
[0.1, 0.3 , 0.5, 0.7, 0.9];
[3, 2.5, 1.1, 0.7, –1];
1 3 [0.1 , 0.2, 0.3, 0.4];
[2.5, 1.2, 0.7, –1];
0.8
4
[0.2, 0.4, 0.6];
[3, 1.1, –1];
1 5 [0, 0.1 , 0.2, 0.3];
[2.5, 1.1, 0.7, –1];
0.5
6
[0.5, 0.7 , 0.9, 1.1];
[3, 2.5, 0.7, –1];
1 7 [0, 0.1 , 0.2, 0.3];
[2, 4.5, 1.0, 0.5];
0.8
8
[0, 0.2 , 0.4, 0.6];
[2.5, 1.0, 0.5, –1.5];
0.7 9 [0, 0.1 , 0.2, 0.3, 0.4];
[3, 2.5, 1.1, 0.7, –1];
0.5
10
[0.2, 0.4 , 0.6, 0.8];
[2.0, 1.3, 1.7, –2];
1
Функции и операции для работы со строками
77
ФУНКЦИИ И ОПЕРАЦИИ
ДЛЯ РАБОТЫ СО СТРОКАМИ
Основным типом данных в MatLab является массив, вспомните, что даже числа представляются массивами размера один на один. Элементы массива не обязательно должны быть числами. Если элементы массива являются символами, то такой массив называется массивом символов, или строкой. Переменные, содержащие строки, будем называть строковыми переменными. Для ограничения строки используются апострофы, напри­мер, оператор присваивания
>> str='Hello, World!' приводит к образованию строковой переменной
str = ‘Hello, World!’
Убедитесь, что строковая переменная str действительно является массивом, обратившись к ее элементам: str(8), str(1:5). Команда whos поз­воляет получить подробную информацию о str, в частности, str хранится в виде вектор-строки, ее длина равна 13. Поскольку строковые переменные являются массивами, то к ним применимы некоторые функции и опера­ции, рассмотренные нами ранее. Длина строковой переменной, т.е. число символов в ней, находится при помощи функции length. Допустимо сцеп­ление строк как вектор-строк с использованием квадратных скобок. Со­здайте еще одну строковую переменную str1, содержащую текст 'My name
is Tommy.', и осуществите сцепление: >> strnew=[str str1]
strnew = Hello, World! My name is Tommy.
Обратите внимание, что для разделения сцепляемых строк в квад­ратных скобках следует использовать пробел (или запятую). Применение точки с запятой приведет к ошибке, поскольку точка с запятой служит для образования вектор-столбцов или отделения строк матриц. Но в матрице все строки должны быть одинаковой длины, а переменные str и str1 состо­ят из различного числа символов. Далее рассмотрим, как создавать дву-
Применение Matlab для решения аналитических задач моделирования
78
мерные массивы символов (массивы строк), а пока обратимся к наиболее важным функциям MatLab, предназначенным для обработки строк.
Для создания строки также можно воспользоваться следующей
конструкцией:
str = string(A)
Данная команда преобразует входные данные в строковые данные.
Например, если A — числовой вектор длиной 20, str — массив строк того же размера, "20".
Для преобразования текста в строку, нужно назначить его строкой.
Понятнее будет на примере:
a = 1000; str = string(a)
Для того чтобы узнать длину введенной строки, можно воспользо-
ваться командой strlength. Например, команда:
STR = "data.doc"; strlength(STR) 9
Операции со строками
Операции со строками обычно включают поиск вхождений одной
строки в другую, замену регистров символов, объединение строк и т.д. Следующие функции выполняют операции со строками.
Для того чтобы определить, встречается ли одна строка в другой
строке, используют команду contains. Синтаксис приведен ниже:
>>str1 = 'Does the string 1 contains the string 2'; >> str2 = 'string'; >> с = contains(str1,str2)
с = logical 1 Наличие элементов строки 2 в строке 1 выводится в виде логиче-
ской переменной. В случае нахождения элементов, программа выведет 1, в противном случае – 0.
Для нахождения количества вхождений строки 2 в строку 1 нужно
воспользоваться командой findstr (str1, str2) , которая ищет начальные ин-
Функции и операции для работы со строками
79
дексы более короткой строки в более длинной строке и возвращает вектор этих индексов. Индексы указывают позицию первого символа более ко­роткой строки в более длинной строке.
>> str1 = 'Does the string 1 contains the string 2 once?';
>> str2 = 'string';
>> f = findstr(str1,str2)
f = 10 32
Команда lower(str1) возвращает список символов str1, в котором символы верхнего регистра передаются в нижний регистр, а все осталь­ные символы проявляются без изменений.
str1 = 'Does the string 1 contains the string 2 once?';
>> l = lower(str1)
l = 'does the string 1 contains the string 2 once?'
Команда upper(str1) возвращает строку символов str1, в которой все символы нижнего регистра преобразуются в символы верхнего регистра, а все остальные символы остаются неизменными.
>> str1 = 'caution';
>> u = upper(str1)
u = 'CAUTION'
Строки и векторы символов могут быть объединены с помощью strcat. При объединении строк с векторами символов пробел не будет до­бавлен. Объедините вектор символов в каждый элемент массива строк. Команда strcat(strl, str2, ...) – выполняет горизонтальную конкатенацию (объединение) соответствующих строк символьных массивов str1, str2 и т.д. с отбрасыванием пробелов в конце каждой строки и возвращает объединенную строку (строки) результирующего массива символов. Про­белы добавляются снова после синтаксического анализа строк в результи­рующем массиве.
Все входные массивы должны иметь одинаковое количество строк (в частном случае они должны быть представлены в виде одной символь­ной строки), но если один из входных аргументов является не символь­ным массивом, а строковым массивом ячеек, то любой другой входной аргумент может быть скаляром или любым массивом той же размерности и того же размера.
Применение Matlab для решения аналитических задач моделирования
80
Если входной массив состоит только из символов, то выходной
массив также будет массивом символов. Если какой-либо из входных мас­сивов является массивом строковых ячеек, то функция strcat возвращает массив строковых ячеек, сформированный из конкатенированных соот­ветствующих элементов массивов str1, str2, в этом случае любой из эле­ментов может быть скаляром и т.д. Примеры применения команды к раз­ным строкам приведены ниже:
>> strcat({'White','Blue'},{'Blue','Red'}) ans = 1×2 cell array {'WhiteBlue'} {'BlueRed'}
>> str1=['stu '] ; >> str2=['dent'] ; >> c = strcat(strl,str2) c = 'student'
Рис. 37. Результат конкатенации строк
Функцию добавления можно использовать вместо strcat (рис. 37)
для сохранения завершающих пробельных символов. Например:
>>s1 = 'Information '; s2 = 'System'; s = [s1 s2]
s = 'Information System' Еще одним способом «склеить» строки является знак " + ".
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]