Документация
Два MATLAB ® функции могут смоделировать ваши данные полиномом.
Функции аппроксимации полиномом
polyfit(x,y,n) находит коэффициенты полиномиального p(x) из степени n это соответствует y данные путем минимизации суммы квадратов отклонений данных из модели (метод наименьших квадратов).
polyval(p,x) возвращает значение полинома степени n это было определено polyfit , оцененный в x .
В этом примере показано, как моделировать данные с помощью полинома.
Измерьте количество y в нескольких значениях времени t .
t = [0 0.3 0.8 1.1 1.6 2.3]; y = [0.6 0.67 1.01 1.35 1.47 1.25]; plot(t,y,'o') title('Plot of y Versus t')
Можно попытаться моделировать эти данные с помощью полиномиальной функции второй степени,
y = a 2 t 2 + a 1 t + a 0 .
Неизвестные коэффициенты, a 0 , a 1 , и a 2 , вычисляются путем минимизации суммы квадратов отклонений данных из модели (метод наименьших квадратов).
Используйте polyfit найти полиномиальные коэффициенты.
p = polyfit(t,y,2)
p = 1×3 -0.2942 1.0231 0.4981
MATLAB вычисляет полиномиальные коэффициенты в убывающих степенях.
Полиномиальная модель второй степени данных дана уравнением
y = — 0 . 2 9 4 2 t 2 + 1 . 0 2 3 1 t + 0 . 4 9 8 1 .
Оцените полином в однородно расположенные с интервалами времена, t2 . Затем отобразите на графике исходные данные и модель на том же графике.
t2 = 0:0.1:2.8; y2 = polyval(p,t2); figure plot(t,y,'o',t2,y2) title('Plot of Data (Points) and Model (Line)')
Оцените модель во временном векторе данных
y2 = polyval(p,t);
Вычислите остаточные значения.
res = y - y2;
Постройте остаточные значения.
figure, plot(t,res,'+') title('Plot of the Residuals')
Заметьте, что подгонка второй степени примерно следует за основной формой данных, но не получает плавную кривую, на которой данные, кажется, лежат. В остаточных значениях, кажется, существует шаблон, который указывает, что различная сила модели необходима. Полином пятой степени (показанный затем) делает лучшее задание следующих колебания данных.
Повторите осуществление, на этот раз с помощью полинома пятой степени от polyfit .
p5 = polyfit(t,y,5)
p5 = 1×6 0.7303 -3.5892 5.4281 -2.5175 0.5910 0.6000
Оцените полином в t2 и постройте подгонку сверху данных в новом окне рисунка.
y3 = polyval(p5,t2); figure plot(t,y,'o',t2,y3) title('Fifth-Degree Polynomial Fit')
Примечание
При попытке смоделировать физическую ситуацию, всегда важно рассмотреть, значима ли модель определенного порядка в вашей ситуации.
Линейная модель с неполиномиальными условиями
В этом примере показано, как соответствовать данным линейной моделью, содержащей неполиномиальные термины.
Когда полиномиальная функция не производит удовлетворительную модель ваших данных, можно попытаться использовать линейную модель с неполиномиальными терминами. Например, рассмотрите следующую функцию, которая линейна в параметрах a 0 , a 1 , и a 2 , но нелинейный в t данные:
y = a 0 + a 1 e — t + a 2 t e — t .
Можно вычислить неизвестные коэффициенты a 0 , a 1 , и a 2 путем построения и решения набора одновременных уравнений и решения для параметров. Следующий синтаксис выполняет это путем формирования матрицы проекта , где каждый столбец представляет переменную, используемую, чтобы предсказать ответ (член в модели), и каждая строка соответствует одному наблюдению за теми переменными.
Введите t и y как вектор-столбцы.
t = [0 0.3 0.8 1.1 1.6 2.3]'; y = [0.6 0.67 1.01 1.35 1.47 1.25]';
Сформируйте матрицу проекта.
X = [ones(size(t)) exp(-t) t.*exp(-t)];
Вычислите коэффициенты модели.
a = X\y
a = 3×1 1.3983 -0.8860 0.3085
Поэтому моделью данных дают
y = 1 . 3 9 8 3 — 0 . 8 8 6 0 e — t + 0 . 3 0 8 5 t e — t .
Теперь оцените модель в расположенных с равными интервалами точках и постройте модель с исходными данными.
T = (0:0.1:2.5)'; Y = [ones(size(T)) exp(-T) T.*exp(-T)]*a; plot(T,Y,'-',t,y,'o'), grid on title('Plot of Model and Original Data')
Множественная регрессия
В этом примере показано, как использовать множественную регрессию для данных модели, которые являются функцией больше чем одного переменного предиктора.
Когда y является функцией больше чем одного переменного предиктора, матричные уравнения, которые описывают отношения среди переменных, должны быть расширены, чтобы хранить дополнительные данные. Это называется множественной регрессией .
Измерьте количество y для нескольких значений x 1 и x 2 . Сохраните эти значения в векторах x1 x2 , и y , соответственно.
x1 = [.2 .5 .6 .8 1.0 1.1]'; x2 = [.1 .3 .4 .9 1.1 1.4]'; y = [.17 .26 .28 .23 .27 .24]';
Модель этих данных имеет вид
y = a 0 + a 1 x 1 + a 2 x 2 .
Множественная регрессия определяет неизвестные коэффициенты a 0 , a 1 , и a 2 путем минимизации суммы квадратов отклонений данных из модели (метод наименьших квадратов).
Создайте и решите набор одновременных уравнений путем формирования матрицы проекта, X .
X = [ones(size(x1)) x1 x2];
Решите для параметров при помощи оператора обратной косой черты.
a = X\y
a = 3×1 0.1018 0.4844 -0.2847
Модель метода наименьших квадратов данных
y = 0 . 1 0 1 8 + 0 . 4 8 4 4 x 1 — 0 . 2 8 4 7 x 2 .
Чтобы подтвердить модель, найдите максимум абсолютного значения отклонения данных из модели.
Y = X*a; MaxErr = max(abs(Y - y))
MaxErr = 0.0038
Это значение намного меньше, чем любое из значений данных, указывая, что эта модель точно следует за данными.
Программная аппроксимация
В этом примере показано, как использовать функции MATLAB для:
- Вычисление коэффициентов корреляции
- Подбор кривой многочлену к данным
- Графическое изображение и вычисление доверительных границ
Загрузите демонстрационные данные о переписи из census.mat , который содержит американские данные о населении с лет 1790 — 1990.
load census
Это добавляет следующие две переменные в рабочее пространство MATLAB.
- cdate вектор-столбец, содержащий годы 1790 — 1990 с шагом 10.
- pop вектор-столбец с американской численностью населения, соответствующей каждый год в cdate .
Отобразите данные на графике.
plot(cdate,pop,'ro') title('U.S. Population from 1790 to 1990')
График показывает сильный шаблон, который указывает на высокую корреляцию между переменными.
Вычисление коэффициентов корреляции
В этом фрагменте примера вы определяете статистическую корреляцию между переменными cdate и pop выровнять по ширине моделирование данных. Для получения дополнительной информации о коэффициентах корреляции, смотрите Линейную корреляцию.
Вычислите матрицу коэффициента корреляции.
corrcoef(cdate,pop)
ans = 2×2 1.0000 0.9597 0.9597 1.0000
Диагональные элементы матрицы представляют совершенную корреляцию каждой переменной с собой и равны 1. Недиагональные элементы очень близко к 1, указывая, что существует сильная статистическая корреляция между переменными cdate и pop .
Подбор кривой многочлену к данным
Этот фрагмент примера применяется polyfit и polyval Функции MATLAB, чтобы смоделировать данные.
Вычислите подходящие параметры.
[p,ErrorEst] = polyfit(cdate,pop,2);
pop_fit = polyval(p,cdate,ErrorEst);
Отобразите на графике данные и подгонку.
plot(cdate,pop_fit,'-',cdate,pop,'+'); title('U.S. Population from 1790 to 1990') legend('Polynomial Model','Data','Location','NorthWest'); xlabel('Census Year'); ylabel('Population (millions)');
График показывает, что квадратичная аппроксимация полиномом предоставляет хорошее приближение данным.
Вычислите остаточные значения для этой подгонки.
res = pop - pop_fit; figure, plot(cdate,res,'+') title('Residuals for the Quadratic Polynomial Model')
Заметьте, что график остаточных значений показывает шаблон, который указывает, что полиномиальная сила второй степени не подходит для моделирования этих данных.
Графическое изображение и вычисление доверительных границ
Доверительные границы являются доверительными интервалами для предсказанного ответа. Ширина интервала указывает на степень уверенности в соответствии.
Этот фрагмент примера применяется polyfit и polyval к census выборочные данные, чтобы произвести доверительные границы для полиномиальной модели второго порядка.
Следующий код использует интервал ± 2 Δ , который соответствует 95%-му доверительному интервалу для больших выборок.
Оцените подгонку и ошибочную оценку предсказания (дельта).
[pop_fit,delta] = polyval(p,cdate,ErrorEst);
Отобразите на графике данные, подгонку и доверительные границы.
plot(cdate,pop,'+',. cdate,pop_fit,'g-',. cdate,pop_fit+2*delta,'r:',. cdate,pop_fit-2*delta,'r:'); xlabel('Census Year'); ylabel('Population (millions)'); title('Quadratic Polynomial Fit with Confidence Bounds') grid on
95%-й интервал указывает, что у вас есть 95%-й шанс, что новое наблюдение будет находиться в пределах границ.
Открытый пример
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
Документация MATLAB
Поддержка
- MATLAB Answers
- Помощь в установке
- Отчеты об ошибках
- Требования к продукту
- Загрузка программного обеспечения
© 1994-2021 The MathWorks, Inc.
- Условия использования
- Патенты
- Торговые марки
- Список благодарностей
Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.
Аппроксимация в Matlab
Приветствую! Сегодня продолжаем говорить об обработке экспериментальных данных. Сегодняшняя статья — продолжение предыдущей темы: Интерполяция в Matlab. Настоятельно советую с ней ознакомиться перед чтением данной статьи. По сути аппроксимация в Matlab очень похожа на интерполяцию, однако, для её реализации используются другие правила и функции.
Аппроксимация
Относительно интерполяции, аппроксимация получила более широкое распространение. Сущность этого метода состоит в том, что табличные данные аппроксимируют кривой, которая не обязательно должна пройти через все узловые точки, а должна как бы сгладить все случайные помехи табличной функции.
МНК (Метод Наименьших Квадратов)
Одним из самых популярных методов аппроксимации в Matlab и в других средах, это Метод Наименьших Квадратов ( МНК ). В этом методе при сглаживании опытных данных аппроксимирующую кривую стремятся провести так, чтобы её отклонения от табличных данных по всем узловым точкам были минимальными. Суть МНК заключается в следующем: для табличных данных, полученных в результате эксперимента, отыскать аналитическую зависимость, сумма квадратов уклонений которой от табличных данных во всех узловых точках была бы минимальной. Аппроксимация в Matlab по МНК осуществляется с помощью функции polyfit. Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который аппроксимирует функцию y(x) в смысле метода наименьших квадратов. Выходом является строка p длины n+1, содержащая коэффициенты аппроксимирующего полинома.
Примеры задач
Разберём задачу, в которой разрешается использование встроенных матлабовских функций. Осуществить аппроксимацию в Matlab табличных данных x = [0, 0.1 , 0.2, 0.3, 0.5] и y = [3, 4.5, 1.7, 0.7, -1] . Применяя метод наименьших квадратов, приблизить ее многочленами 1-ой и 2-ой степени. Для каждого определить величину среднеквадратической ошибки. Построить (на одном листе) графики и заданной таблично функции (ломанная линия) и приближающих ее многочленов 1-ой и 2-ой степени.
x = [0, 0.1 , 0.2, 0.3, 0.5]; 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 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.9253
ans = 0.8973 Однако, встречаются задачи, где требуется реализовать аппроксимацию в Matlab без использования специальных функций.
Найти у(0.25) путём построения аппроксимирующего полинома методом наименьших квадратов согласно данным:
x: 0, 0.1, 0.2, 0.3, 0.5
y: 3, 4.5, 1.7, 0.7, -1
p: 0.5, 0.8, 1.6, 0.8, 0.1
Построить этот полином без учёта весовых коэффициентов с использованием определителя Вандермонда и стандартных операторов.
%Задаем массивы данных: x = [0; 0.1; 0.2; 0.3; 0.5]; y = [3;4.5;1.7;0.7;-1]; %Строим матрицу W – матрицу Вандермонда с вырезанным первым столбцом: W = vander(x); W = W(1:5,2:5); %Вычисляем элементы матрицы А как произведение транспонированной матрицы W и просто матрицы W A = W'*W; %Вычисляем элементы вектора b b = W'*y; %Решая систему уравнений Aa = b, находим значения вектор-столбца a: a = inv(A)*b %Это будут коэффициенты аппроксимирующего полинома. %Проверяем, используя методы MATLAB = функцию polyfit: qq = polyfit(x,y,3) %Получаем аппроксимированные значения y: x1 = [-0.2: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'); %Находим значение в точке x = 0.25 x2 = 0.25; y2 = a(1)*x2^3 + a(2)*x2^2 + a(3)*x2 + a(4)
Вывод:
a =
228.1447
-176.0984
22.7745
3.1590
qq = 228.1447 -176.0984 22.7745 3.1590
y2 = 1.4113 Как видите встроенные функции для аппроксимации в Matlab укорачивают алгоритм почти вдвое. Существует также возможность реализации всего алгоритма через одну функцию, но для преподавателей студентов она скорее всего будет не приемлема. С помощью функции lsqcurvefit(fun,x0,xdata,ydata), где:
xdata,ydata– табличные значения аппроксимируемой функции;
x0 –стартовое значение параметров функции;
fun – функция аппроксимации, задаваемая пользователем С аналитически-теоретической стороны, существуют такие виды аппроксимации:
- Аппроксимация ортогональными классическими полиномами.
- Аппроксимация каноническим полиномом
Но на практике их реализацию требуют редко.
Вот и вся основная информация по аппроксимации в Matlab, если остались вопросы, задавайте их в комментариях.
Поделиться ссылкой:
Аппроксимация производных MatLab
Для выполнения аппроксимации Лапласиана в MATLAB используется следующая функция:
del 2(11) — возвращает матрицу L дискретной аппроксимации дифференциального оператора Лапласа, примененного к функции U:
Матрица L имеет тот же размер, что и матрица U, и каждый ее элемент равен разности элемента массива U и среднего значения четырех его соседних элементов (для узлов сетки во внутренней области). Для вычислений используется пятиточечная формула аппроксимации Лапласиана.
Другие формы этой функции также возвращают матрицу L, но допускают дополнительные установки:
L = del2(U,h) — использует шаг h для установки расстояния между точками в каждом направлении (h — скалярная величина). По умолчанию h=1;
L = de!2(U,hx,hy) — использует hx и hy для точного определения расстояния между точками. Если hx — скалярная величина, то задается расстояние между точками в направлении оси х, если hx — вектор, то он должен иметь размер. равный числу столбцов- матрицы U , и точно определять координаты точек по оси х. Аналогично если hy — скалярная величина, то задается расстояние между точками в направлении оси у, если hy — вектор, то он должен иметь размер. равный числу строк матрицы U, и точно определять координаты точек по оси у:
L = del2(U,hx.hy,hz. ) — если U является многомерным массивом, то расстояния задаются с помощью параметров hx, hy, hz. Пример:
MATLAB. Lab5. Аппроксимация функций
Для приближенного поиска первого положительного корня был построен график функции:
Как видно из графика корень лежит в интервале от 0.2 до 0.4. Для уточнения корня используем метод деления пополам. С помощью этого метода был найден корень:
уточнённый корень: 0.30893109560193.
Отрезок аппроксимации: [0.30893109560193-2, 0.30893109560193+3]
Разработка алгоритмов для –заданных видов аппроксимации
Алгоритм аппроксимации методом наименьших квадратов:
Алгоритм аппроксимации методом Стирлинга:
Также для решения СЛАУ был разработан метод с обратной матрицей:
Алгоритм Ньютона-Котеса (n=6)
function result = DiffPogr ( F , FA , xl , xr , N )
h = ( xr — xl ) / N ;
x = xl ; i = 0 ; result = 0 ;
while ( x <= xr )
result = result + abs ( feval ( F , x ) - feval ( FA , x ) ) ;
x = xl + h * i
result = result / N ;
function result = DN ( X , Y , N , x ) ;
% eta procedure vichislyaet znacheniya DY ( 5 - i shtuk )
DY = DNone ( Y , N ) ; DY ( N ) = 0 ; DY ';
D2Y=DNone(DY,N-1);D2Y(N)=0; D2Y(N-1)=0;D2Y' ;
D3Y = DNone ( D2Y , N - 2 ) ; D3Y ( N ) = 0 ; D3Y ( N - 1 ) = 0 ; D3Y ( N - 2 ) = 0 ; D3Y ';
D4Y=DNone(D3Y,N-3);D4Y(N)=0; D4Y(N-1)=0;D4Y(N-2)=0;D4Y(N-3)=0;D4Y' ;
D5Y = DNone ( D4Y , N — 4 ) ; D5Y ( N ) = 0 ; D5Y ( N — 1 ) = 0 ; D5Y ( N — 2 ) = 0 ; D5Y ( N — 3 ) = 0 ; D5Y ( N — 4 ) ; D5Y ‘;
index=i; i=i+1;
res=zeros(N,5);
res(:,1)=DY’ ; %(index);poldecrement(index);
res ( : , 2 ) = D2Y ‘;%(index);poldecrement(index);
res(:,3)=D3Y’ ; %(index);poldecrement(index);
res ( : , 4 ) = D4Y ‘;%(index);poldecrement(index);
res(:,5)=D5Y’ ; %(index);poldecrement(index);
result = res ;
function result = DNone ( Y , N ) ;
for i = 1 : ( N — 1 )
DY ( i ) = — Y ( i + 1 ) + Y ( i ) ;
result = DY ;
function result = func ( x )
result = 3 * x ^ 4 + 4 * x ^ 3 — 12 * x * x + 1 ;
funcappms.m
function y = funcappms ( x , AI )
AI = [ 1.0000
y = AI ( 1 ) + AI ( 2 ) * x + AI ( 3 ) * x ^ 2 + AI ( 4 ) * x ^ 3 + AI ( 5 ) * x ^ 4 ;
i = 0 ; Y = 0 ; x = 0.2 ; X = 0 ;
while ( x < 2 )
Y ( i ) = func ( x ) ;
plot ( X , Y )
xl = 0.30893109560193 - 2 ;
xr = 0.30893109560193 + 3 ;
% kolichestvo uzlov 12 , 16 , 25
% minsquare ( F , N , xl , xr , 0.1 )
Stirling ( F , N , xl , xr , 0.000001 ) ;
FA = @ funcappms ;
% I1 = NyutonKotes6 ( xl , xr , FA , 1 / N )
% I2 = NyutonKotes6 ( xl , xr , F , 0.1 / N )
% inteps = I1 - I2
% difeps=DiffPogr(F,FA,xl,xr,N)
minsquare.m
function result = minsquare ( F , n , xl , xr , h2 )
h = ( xr - xl ) / n ;
x = xl ; i = 0 ;
while ( x <= xr )
Y ( i ) = feval ( F , x ) ;
x = xl + h * i ;
% X = [ 0.75 , 1.5 , 2.25 , 3 , 3.75 ]
% Y = [ 2.5 , 1.2 , 1.12 , 2.25 , 4.28 ]
% m = 2 ; n = 4 ;
A = zeros ( mc , mc )
B = zeros ( mc , 1 ) ;
for k = 1 : mc
for l = 1 : mc
for i = 1 : nc
A ( k , l ) = A ( k , l ) + ( X ( i ) ) ^ ( k - 1 + l - 1 ) ;
for i = 1 : nc
B ( k ) = B ( k ) + X ( i ) ^ ( k - 1 ) * Y ( i ) ;
% bilo polucheno SLAU teper reshim SLAY i poluchim aproksimiruyaushuyu
AI = SLAU ( A , B )
ysize = ( xr - xl ) / h2 + 1 ;
while ( x < xr )
Y1 ( i ) = AI ( 1 ) + AI ( 2 ) * X1 ( i ) + AI ( 3 ) * X1 ( i ) ^ 2 + AI ( 4 ) * X1 ( i ) ^ 3 + AI ( 5 ) * X1 ( i ) ^ 4 ;
x = xl + h2 * i ;
plot ( X , Y , ‘g.-‘ )
plot ( X1 , Y1 , ‘b.-‘ )
result = AI ;
NyutonKotes6.m
function RES = NyutonKotes6 ( A , B , F , e )
% function RES = NyutonKotes6 ( A , B , F , X , Y , h , middle , DY , e )
number_of_iteration = 1 ;
I = 0 ; dx = B — A ;
I = NyutonKotes6step ( x , x + dx , F ) ;
% I = NyutonKotes6step ( x , x + dx , F , X , Y , h , middle , DY ) ;
while ( ce > e )
x = A ; dx = dx * 0.5 ;
while ( x < B )
II = II + NyutonKotes6step ( x , x + dx , F ) ;
% II = II + NyutonKotes6step ( x , x + dx , F , X , Y , h , middle , DY ) ;
ce = abs ( I - II )
% number_of_iteration = number_of_iteration + 1 ;
NyutonKotes6step.m
function RES = NyutonKotes6step ( A , B , F )
% function RES = NyutonKotes6step ( A , B , F , X , Y , h , middle , DY )
H = [ 41 , 216 , 27 , 272 , 27 , 216 , 41 ] ;
N = 840 ; m = 1 ; x = A ; n = 6 ; dx = ( B - A ) / n ;
for i = 1 : n + 1
I = I + H ( i ) * feval ( F , x ) ;
% q = ( x - X ( middle ) ) / h ;
% yy = Y ( middle ) + q * ( DY ( middle — 1 , 1 ) + DY ( middle , 1 ) ) / 2 + q ^ 2 / 2 * DY ( middle — 1 , 2 ) + q * ( q ^ 2 — 1 ) / factorial ( 3 ) * ( DY ( middle — 2 , 3 ) + DY ( middle — 1 , 3 ) ) / 2 + q ^ 2 * ( q ^ 2 — 1 ) / factorial ( 4 ) * DY ( middle — 2 , 4 ) + q * ( q ^ 2 — 1 ) * ( q ^ 2 — 2 ^ 2 ) / factorial ( 5 ) * ( DY ( middle — 3 , 5 ) + DY ( middle — 2 , 5 ) ) / 2 ;
% I = I + H ( i ) * yy ;
x = A + dx * i ;
I = ( I / N ) * n * dx ;
function poldel ;
eps = 0.000000000000000001 ; y = func ( x ) ;
while ( abs ( y ) > eps )
y = func ( x ) ;
if ( func ( xl ) < 0 )
x = ( x + xl ) / 2 ;
x = ( x + xr ) / 2 ;
if ( func ( xl ) > 0 )
x = ( x + xl ) / 2 ;
x = ( x + xr ) / 2 ;
function X = SLAU ( A , B ) ;
X = inv ( A ) * B
function result = Stirling ( F , N , xl , xr , h2 ) ;
if ( mod ( N , 2 ) == 1 ) N = N + 1 ; end ;
h = ( xr — xl ) / N ;
x = xl ; i = 0 ;
while ( x <= xr )
Y ( i ) = feval ( F , x ) ;
x = xl + h * i ;
x = xl + h * ( i - 1 ) ;
DY = DN ( X , Y , N + 1 , x ) ;
Y1 = zeros ( N + 1 ) ;
middle = round ( ( N + 1 ) / 2 ) ;
X1 = 0 ; Y1 = 0 ;
ysize = ( xr - xl ) / h2 + 1 ; difpog = 0 ;
while ( x < xr )
q = ( x - X ( middle ) ) / h ;
Y1 ( ysize — i ) = Y ( middle ) + q * ( DY ( middle — 1 , 1 ) + DY ( middle , 1 ) ) / 2 + q ^ 2 / 2 * DY ( middle — 1 , 2 ) + q * ( q ^ 2 — 1 ) / factorial ( 3 ) * ( DY ( middle — 2 , 3 ) + DY ( middle — 1 , 3 ) ) / 2 + q ^ 2 * ( q ^ 2 — 1 ) / factorial ( 4 ) * DY ( middle — 2 , 4 ) + q * ( q ^ 2 — 1 ) * ( q ^ 2 — 2 ^ 2 ) / factorial ( 5 ) * ( DY ( middle — 3 , 5 ) + DY ( middle — 2 , 5 ) ) / 2 ;
difpog = difpog + abs ( feval ( F , xr — ( x — xl ) ) — Y1 ( ysize — i ) )
x = xl + h2 * i ;
% Y1 ( 1 ) = Y ( 1 ) ;
% X1 ( ysize — 2 ) = X ( N + 1 ) ;
% Y1 ( ysize — 2 ) = Y ( N + 1 ) ;
plot ( X , Y , ‘g.-‘ ) ;
plot ( X1 , Y1 , ‘b’ ) ;
% LLX = [ xl , xl ] ;
% YY = [ Y ( 1 ) , Y ( N ) ] ;
% RRX = [ xr , xr ] ;
% plot ( LLX , YY , ‘y’ ) ;
% plot ( RRX , YY , ‘y’ ) ;
% difpog = difpog / i
% intpog = NyutonKotes6 ( xl , xr , F , X , Y , h , middle , DY , 0.1 )
intpog = NyutonKotes6 ( xl , xr , F , 0.0001 )
result = Y1 ;
Результаты аппроксимации функции:
(на графиках зелёным цветом обозначен график реальной функции, а синим – график аппроксимирующей функции)
Для метода наименьших квадратов:
Дифференциальная погрешность = 4.699944137579830e-015
Интегральная погрешность = 0.0767
Дифференциальная погрешность = 5.141720382795256e-015
Интегральная погрешность = 0.0358
Дифференциальная погрешность = 1.596639487289053e-015
Интегральная погрешность = 0.0179
Для метода Стирлинга:
Дифференциальная погрешность = 3.287053575018462e-014
Интегральная погрешность = 0,0000000000002
Для числа узлов 16:
Дифференциальная погрешность = 2.252785354639464e-013
Интегральная погрешность = 0,0000000000006
Для числа узлов 25:
Дифференциальная погрешность =5.491511713503260e-012
Интегральная погрешность = 0,0000000000027
График зависимости интегральной погрешности от числа узлов сетки для метода наименьших квадратов:
График зависимости дифференциальной погрешности от числа узлов сетки для метода наименьших квадратов:
График зависимости дифференциальной погрешности для метода Стирлинга от числа узлов сетки:
График зависимости интегральной погрешности от числа узлов сетки для метода Стирлинга:
Анализ полученных результатов: проведенное исследование метода наименьших квадратов и метода Стирлинга показало, что при помощи этих методов можно аппроксимировать функцию.
Анализ зависимости погрешности от количества узлов показал, что для метода Стирлинга дифференциальная и интегральная погрешность растут с увеличением числа узлов, а для метода наименьших квадратов наблюдается обратная зависимость, что можно объяснить следующим образом: при увеличении числа узлов для метода Стирлинга происходит рост относительной погрешности определения значений конечных разностей, в то время как в случае со методом наименьших квадратов происходит увеличение числа многочленов, график каждого из которых в итоге всё более приближается к графику того участка исходной кривой, за аппроксимацию которого он отвечает.
Просмотр графиков аппроксимирующей и аппроксимируемой функции показал, что «на глаз» они практически неотличимы на заданном отрезке аппроксимации.
Выводы: используя 3x 4 +4x 3 -12x*x+1=0 в качестве аппроксимируемой функции функцию, мы изучили два метода аппроксимации: метод Стирлинга и метод наименьших квадратов, построили для обоих методов графики аппроксимирующей и аппроксимируемой функций для различного количества узлов. Были оценены зависимости погрешности от числа узлов для обоих методов.