Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Самоучитель Matlab

Сначала переменной res присваивается нулевое значение, а затем в операторе цикла (в котором индексная переменная i пробегает значения от 1 до m) ее значение изменяется в команде res=res+phi(x,i)*a(i). Здесь использован оператор матричного умножения *, но это не принципиально, поскольку в данном случае список phi(x,i) умножается на скаляр a(i) при фиксированном индексе i. Список phi(x,i) представляет собой набор значений базисной функции с индексом i для значений аргументов из списка x. Каждый элемент этого списка умножается на скалярное значение a(i), и полученные на каждом итерационном шаге списки складываются (в результате выполнения оператора цикла). Общий результат дает значение аппроксимирующего выражения для набора точек из списка x. Программный код функции GetFit() можно видеть в документе на рис. 8.10, где представлено окно редактора m-файлов.

Рис. 8.10. Код функции для вычисления значения аппроксимирующего выражения

Наконец, следующая функция MyFit() объединяет в себе две предыдущие функции LSFit() и GetFit(). С ее помощью вычисляются значения аппроксимирующего выражения и строятся соответствующие графики. Результат функцией не возвращается. Код у функции следующий:

function MyFit(x,y,z,phi,m) a=LSFit(x,y,phi,m); res=GetFit(a,z,phi); plot(x,y,'rs','LineWidth',2); hold on;

grid on; plot(z,res,'b-','LineWidth',2); title('Базовые точки и аппроксимация');

legend('базовые точки','аппроксимация'); hold off;

end

326

Глава 8. Обработка данных

Этот же код в редакторе m-файлов представлен на рис. 8.11.

Рис. 8.11. Функция для выполнения линейной аппроксимации

У функции MyFit() пять аргументов. Первые два аргумента (переменные x и y) определяют базовые точки, на основе которых строится аппроксимирующее выражение. Третий аргумент (переменная z) содержит список значений, которые служат аргументом для вычисления аппроксимирующего выражения. Указатель phi является ссылкой на базисную функцию (от двух аргументов). Последний, четвертый аргумент (переменная m), определяет количество слагаемых в аппроксимирующем выражении. Код у функции достаточно простой. Командой a=LSFit(x,y,phi,m) вычисляются коэффициенты аппроксимирующего полинома. Командой res=GetFit(a,z,phi) вычисляется значение аппроксимирующего полинома в точках, которые определяются списком z. После этого полученные зависимости отображаются на графике. Базовые точки отображаются командой plot(x,y,'rs','LineWidth',2). Точки отображаются красными квадратами (толщина линий 2). Командой hold on переходим в режим удержания графики. Сетку отображаем командой grid on. После этого командой plot(z,res,'b-','LineWidth',2) отображается аппроксимирующая кривая (синий цвет, сплошная линия толщины 2). Заголовок добавляется командой title('Базовые точки и аппроксимация'). Команда legend('базовые точки','аппроксимация') нужна для добавления легенды. Наконец, для выхода из режима удержания графики используем команду hold off.

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

327

Самоучитель Matlab

Рис. 8.12. Создание аппроксимирующего полинома

Рис. 8.13. Аппроксимация полиномом

Рис. 8.14. Добавлены команды для аппроксимации косинусами

328

Глава 8. Обработка данных

Здесь мы использовали такие команды:

>>x=0:10;

>>y=cos(x)./(1+x);

>>phi=@(x,k)x.^(k-1);

>>z=0:0.01:10;

>>MyFit(x,y,z,phi,5);

Переменная x содержит значения узловых точек, а переменная y содержит значения табулированной функции в этих точках. Переменная z содержит значения по аргументу, для которых вычисляется аппроксимирующее выражение. Командой phi=@(x,k)x.^(k-1) задается функция двух переменных, которая соответствует базисным функциям вида ϕk (x) = xk −1 , то есть функциям 1, x , x2 и так далее. Другими словами, речь идет об аппроксимации выражением полиномиального вида. Результат получаем после выполнения команды MyFit(x,y,z,phi,5). Здесь речь идет об аппроксимирующем полиноме 4-й степени (пять слагаемых в полиноме). Результат представлен на рис. 8.13.

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

Командой f=@(x,k)cos((k-1)*x) создается указатель f на новую базисную функцию вида ϕk (x) = cos((k −1)x), то есть 1, cos(x), cos(2x) и так далее. Аппроксимация (включая создание графиков) выполняется командой MyFit(x,y,z,f,5). Результат (график) показан на рис. 8.15.

Рис. 8.15. Аппроксимация косинусами

329

Самоучитель Matlab

Очевидно, что каждая аппроксимация (аппроксимация на основе разных базисных функций) имеет свои особенности. Кроме того, нередко основной интерес представляет не графическая кривая, а непосредственно коэффициенты линейной комбинации для аппроксимирующего выражения. Например, чтобы узнать коэффициенты разложения по степенным функциям, используем команду LSFit(x,y,phi,5). Коэффициенты для аппроксимации по косинусам узнаем с помощью команды LSFit(x,y,f,5) (рис. 8.16).

Рис. 8.16. Вычисление коэффициентов для аппроксимации по степенным функциям и косинусам

Как отмечалось выше, аппроксимация выражением линейного вида далеко не всегда позволяет получить приемлемый результат. Есть две ситуации: нелинейную зависимость удается свести к линейной, и нелинейную зависимость не удается свести к линейной. Начнем с первого случая. Поскольку он предполагает наличие конкретной функциональной зависимости, рассмотрим следующую задачу. Пускай по неотрицательным значениям табулированной функции yk в узловых точках xk (индекс k = 1,2,...,n ) необходимо для аппроксимации построить зависимость вида f(x) = a exp(bx).

330

Источник: https://studfile.net/preview/16433384/