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

2.2. Аппроксимация произвольной функцией

по методу наименьших квадратов

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

coeff = lsqcurvefit(f,x0,x,y);

где x, y – векторы значений аппроксимируемой функции; x0 – начальное значение параметров (коэффициентов) моделирующей функции; f – аппроксимирующая функция, вид которой задается пользователем; coeff – вектор уточненных параметров моделирующей функции.

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

Решение: Для конкретности возьмем функцию . Поскольку точные значения коэффициентов известны, то будем иметь возможность сравнить решение. Вычислим табличные точки

x=0:0.5:7;

y=14*sin(3*x)-2*x.^2+4;

Сделаем вид, что значения коэффициентов не известны, зададим их стартовые значения, равными 1

x0=[1 1 1];

Опишем inline-функцию с неизвестными параметрами, размещенными в векторе a

f=inline('a(1)*sin(3*x)+a(2)*x.^2+a(3)','a','x');

Уточним значения коэффициентов при помощи функции lsqcurvefit, результат разместим в векторе coeff

coeff=lsqcurvefit(f,x0,x,y)

Вычислим значения модельной функции в узлах таблицы

ymodel=model(x,coeff);

hold on

Построим реальную функцию

fplot(@model,[0 7],'b-',[],[],coeff)

Прорисуем отсчеты моделирующей и реальной функций

plot(x,y,model,'bo',x,y,'r*')

hold off

grid

title('Моделирование произвольной функцией')

legend('Исходная функция','Отсчеты','Модель')

Здесь model –m-функция аргумента х с параметром, заданным вектором coeff

function y=model(x,coeff)

y=coeff(1)*sin(3*x)+coeff(2)*x.^2+coeff(3);

Результат построений приведен на рис. 5.2.

Рис. 5.2. Моделирование с помощью lsqcurvefit

Обратите внимание на очень важный момент: функция lsqcurvefit для своей работы требует первой в списке параметров указать функцию, первым формальным параметром которой являются искомые коэффициенты. А функция fplot, используемая нами для прорисовки плавной кривой, первым параметром предписывает указать функцию, в списке формальных параметров которой первым указывается аргумент х, и только потом – коэффициенты. Поэтому нельзя одну и туже функцию использовать в обоих случаях. При этом не имеет принципиального значения, какая именно функция используется: m или inline. Для обращения к lsqcurvefit мы могли бы написать следующую m-функцию:

function y=model2(coeff,x)

y=coeff(1)*sin(3*x)+coeff(2)*x.^2+coeff(3);

которая отличается от функции model только порядком следования формальных параметров. Напомню, что имена формальных параметров и в функции model, и в model2 могут быть любыми допустимыми в Matlab (совсем не обязательно называть их у, х и coeff). Впрочем, это касается не только m-функций, но и inline-объектов.

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

coeff =

14.0000 -2.0000 4.0000