Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Применение MATLAB для решения аналитических задач моделирования. Учебное пособие
.pdf
Аппроксимация в 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'
Еще одним способом «склеить» строки является знак " + ".
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
