Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

НОУ ІНТУЇТ | лекція | Планування і обробка результатів пасивного експерименту

  1. 2. Апроксимація функцій статечними полиномами

2. Апроксимація функцій статечними полиномами

За допомогою методу найменших квадратів можна поставити діагноз параметри рівняння кривих, заданих деякими своїми точками, за умови, що вид рівняння відомий, а невідомими виступають параметри цього рівняння. При цьому будь-яка аналітична функція може бути наближена полиномом. Тому для підгонки нелінійних даних можливо використовувати побудова полінома методом найменших квадратів. Для більш точної підгонки ступінь полінома доводиться збільшувати. Правда, якщо дані не виявляють полиномиальной природи, то в результаті виходить крива, яка буде сильно осциллировать [15] . Цей феномен називається поліноміальний розгойдування [15 , С. 301]. Воно явно спостерігається у полиномов високого ступеня. З цих міркувань поліноми ступеня 6 або вище рідко використовуються, якщо відомо, що справжня функція, що виражає залежність, є поліномом.

Але в той же час наближення даних поліномами служить основним інструментом для випадку, коли рівняння кривої невідомо зовсім. Тоді в завдання входить визначення коефіцієнтів (параметрів) обраного полінома, яким здійснюється підгонка. У будь-якому випадку метод найменших квадратів дає досить прийнятні результати. Більш того, коли дані представляють собою деяку "розсип", за допомогою методу найменших квадратів можливо провести криву між цими даними, які найкращим чином мінімізують квадрат невязки за цими даними.

Приклад 2. Для функції виду відомі кілька значень точок на площині. За цим значенням розрахуйте параметри (коефіцієнти) заданої функції.

Програмний код рішення прикладу:

clear, clc try global hep delete (hep); end options.Resize = 'on'; options.WindowStyle = 'normal'; options.Interpreter = 'tex'; f = inputdlg ({sprintf ( '\\ bfВектор базисних функцій:'), ... sprintf ( '\\ bfОбласть визначення:'), ... sprintf ( '\\ bfЧісловие значення параметрів b0, b1, ...' ), ... sprintf ( '\\ bfЗначенія аргументу (не менше 4 значень): ...')}, ... 'ВИХІДНІ ДАНІ', 1, ... { 'x; x ^ 3; sqrt (x ) ',' [0 2] ',' - 5; 1.2; 3.2; -12.4 ',' 0,0.12,0.7,1.34,0.45,1.678 '}, options) if isempty (f) errordlg (' Можливо, натиснута клавіша '' Cansel '' ', ...' Помилка '); return end y1 = sym (char (f (1))); x = str2num (char (f (2))); b = str2num (char (f (3))); es = str2num (char (f (4))); Y2 = char (y1); q = find (Y2 == 'x'); if length (q) + 1 ~ = length (str2num (char (f (3)))) errordlg ( 'Число введених параметрів не відповідає числу параметрів введеної функції', ... 'Помилка введення параметрів'); return end% ---------------- Загальне число точок --------------------- if length (es) == 1 if es <length (b) errordlg (sprintf ( 'Загальна кількість точок повинно бути не менше числа% d - числа параметрів', length (b)), ... 'Помилка введення числа точок функції'); return end fprintf ( '\ n ВИЗНАЧЕННЯ ПАРАМЕТРІВ ЗАДАНОЇ ФУНКЦІЇ \ n'); fprintf ( '\ t Вид параметричних функцій: \ n \ t% s \ n', Y2); fprintf ( '\ t Область визначення функції: [% g% g] \ n', x (1), x (2)); fprintf ( '\ t Значення введених параметрів: \ n'); for J = 1: length (b) fprintf ( '\ t% g \ t', b (J) '); end fprintf ( '\ n'); disp ( '----------------------------------------------- ------ ') er1 = inline (sprintf (' [1,% s] ', char (f (1)))); erV1 = vectorize (inline (sprintf ( '[1,% s]', char (f (1))))); erV = vectorize (inline (sprintf ( '[% s]', char (f (1))))); con = char (erV); n = find (con == ';'); con (n) = ','; con1 = char (er1); n1 = find (con1 == ';'); con1 (n1) = ','; symV = sym (con1); wone = inline (con); V = x (1) + (x (2) - x (1)) * rand (es, 1); fprintf ( '\ t Значення аргументу і параметричних функцій: \ n'); X = [ones (length (V), 1), wone (V)]; disp ([V, X]) XX = []; for I = 1: length (V) XX = [XX; b '. * X (I, :)]; end Y = sum (XX, 2); fprintf ( '\ t Значення аргументу і заданої функції: \ n'); disp ([V, Y]) B = regress (Y, X); fprintf ( '\ t Розрахункові значення параметрів заданої функції: \ n'); for J = 1: length (B) fprintf ( '\ tb% d =% g \ n', J - 1, B (J)); end y = []; for J = 1: length (symV) if J <length (symV) if J == 1 y = [y, sprintf ( 'b% d% s +', J - 1, '')]; else y = [y, sprintf ( 'b% d *% s +', J - 1, char (symV (J)))]; end elseif J == length (symV) y = [y, sprintf ( 'b% d *% s', J - 1, char (symV (end)))]; end end fprintf ( '\ n \ t Заданий вид функціональної залежності: \ n \ ty =% s \ n', y) helpdlg (sprintf ( 'Результати виконання програми дивіться в командному вікні'), '')% ---- ------------- Кілька точок ------------------------------ elseif length (es) > = length (b) if min (es) <x (1) | max (es)> x (2) errordlg (sprintf ( 'Значення аргументу функції виходять за область визначення [% g,% g]', x (1), x (2)), ... 'Помилка введення значень аргументу функції '); return end fprintf ( '\ n ВИЗНАЧЕННЯ ПАРАМЕТРІВ ЗАДАНОЇ ФУНКЦІЇ \ n'); fprintf ( 'Вид параметричних функцій: \ n \ t% s \ n', Y2); fprintf ( 'Область визначення функції: [% g% g] \ n', x (1), x (2)); disp ( '----------------------------------------------- -------------- ') er1 = inline (sprintf (' [1,% s] ', char (f (1)))); erV1 = vectorize (inline (sprintf ( '[1,% s]', char (f (1))))); erV = vectorize (inline (sprintf ( '[% s]', char (f (1))))); con = char (erV); n = find (con == ';'); con (n) = ','; con1 = char (er1); n1 = find (con1 == ';'); con1 (n1) = ','; symV = sym (con1); wone = inline (con); V = es '; fprintf ( 'Значення аргументу і значення параметричних функцій: \ n'); X = [ones (length (V), 1), wone (V)]; disp ([V, X]) XX = []; for I = 1: length (V) XX = [XX; b '. * X (I, :)]; end Y = sum (XX, 2); fprintf ( 'Значення аргументу і значення заданої функції: \ n'); disp ([V, Y]) B = regress (Y, X); fprintf ( 'Розрахункові значення параметрів заданої функції: \ n'); for J = 1: length (B) fprintf ( '\ tb% d =% g \ n', J - 1, B (J)); end y = []; for J = 1: length (symV) if J <length (symV) if J == 1 y = [y, sprintf ( 'b% d% s +', J - 1, '')]; else y = [y, sprintf ( 'b% d *% s +', J - 1, char (symV (J)))]; end elseif J == length (symV) y = [y, sprintf ( 'b% d *% s', J - 1, char (symV (end)))]; end end fprintf ( '\ n Заданий вид функціональної залежності: \ n \ ty =% s \ n', y); global hep hep = helpdlg (sprintf ( 'Результати виконання програми дивіться в командному вікні'), ''); else errordlg (sprintf ( 'Необхідно загальне число аргументів не менше% d', length (b)), 'Помилка!') return end

завдання 2

  1. Змініть область визначення параметричних функцій, наприклад, .
  2. Побудуйте діаграму заданої функціональної залежності.
  3. У програмі задайте "свої" параметричні функції.
  4. Визначення параметрів (коефіцієнтів) заданої функції зробіть через рішення нормального рівняння за допомогою методу виключення Гауса. приклад: .
  5. У програмі передбачте "зашумлення" значень заданої функції по нормальному і рівномірному імовірнісним законам. Розрахуйте значення параметрів (коефіцієнтів) заданої функції і підрахуйте відносну похибку розрахунку коефіцієнтів. Підрахуйте також залишкову суму квадратів;
  6. вивчіть функції , по довідкової системі пакета MATLAB.

Приклад 3. Функціональна експериментальна залежність задана масивом точок (значень). Провести апроксимацію даної функціональної залежності степеневим поліномом. Побудуйте графіки функцій.

Значення експериментальної залежності:

x f (x) 0; 149.0; 5; 146.3; 10; 145.8; 15; 149.8; 20; 154.9; 25; 164.7; 30; 178.2; 35; 196.2; 40; 221.8; 45; 259.8; 50; 299.2; 55; 331.5; 60; 338.1; 65; 304.4; 70; 238.5; 72; 205.3; 74; 170.9; 75; 153.9; 76; 136.6; 78; 103.9; 80; 74.2; 82; 48.6; 84; 29.7; 85; 19.9; 86; 12.4; 88; 3.1; 90; 0;

Рішення прикладу виконаємо за допомогою стандартних функцій MATLAB, таких як , , , [8] .

Програмний код рішення прикладу:

clear, clc, close all x = ... [0; 5; 10; 15; 20; 25; 30; 35; 40; 45; 50; 55; 60; 65; 70; 72; 74; 75; 76; 78; 80; 82; 84; 85; 86; 88; 90]; f = ... [149.0; 146.3; 145.8; 149.8; 154.9; 164.7; 178.2; 196.2; 221.8; 259.8; 299.2; 331.5; 338.1; 304.4; 238.5; 205.3; 170.9; 153.9; 136.6; 103.9; 74.2; 48.6; 29.7; 19.9; 12.4; 3.1; 0]; n = length (x); %% length (x) == length (f) Lmin = f '* f; %% Квадратичний критерій - сума квадратів line (x, f, 'linew', 2) grid on xlabel ( '\ bf - - - - - - - - - x - - - - - - - - -'); ylabel ( '\ bf f (x)'); qprob = 0.4; % Рівень значущості %%%% Вибір ступеня полінома for m = 1: n psi (:, m) = x. ^ (M-1); % Psi - Спеціальна функція (полігамма) if m> 1 for k = 1: m-1 psi (:, m) = psi (:, m) - ((psi (:, m)) '* psi (:, k )) * psi (:, k); end end psi (:, m) = psi (:, m) / norm (psi (:, m)); % Нормировка bk = f '* psi (:, m); DOLD = Lmin / (nm); %%% Стара дисперсія Lmin = Lmin - bk ^ 2; Dnew = Lmin / (nm-1); %%% Нова дисперсія% fprintf ( '\ n'); if m> 1% перевірка ступеня починаючи з 2 if Dnew / DOLD <finv (qprob, nm, nm-1)% fprintf ( 'Ступінь% d слід враховувати \ n', m-1); stp = m-1; else% fprintf ( 'Ступінь% d не потрібно враховувати \ n', m-1); if m> 2 stp = m-2; break; else stp = m - 1; break; end end end end PO = polyfit (x, f, stp); fprintf ( '\ n Коефіцієнти аппроксіміруещего полінома: \ n'); for J = 1: length (PO) fprintf ( '% 15g \ n', PO (J)); end fprintf ( '\ n'); yPO = polyval (PO, x); line (x, yPO, 'marker', 'o', 'color', 'r') title (sprintf ( '% s Апроксимація експериментальної кривої поліномом% d ступеня', '\ bf', stp)); legend ( '\ bfЕксперімент', '\ bfАппроксімація', 'location', 'best')

Діаграми заданої експериментальної кривої і аппроксимирующего полінома показані на Мал. 9.2 .


Мал. 9.2. Результат апроксимації кривої поліномом

завдання 3

  1. Перевірте результат виконання програми при зменшенні і збільшенні рівня значущості.
  2. Побудуйте аппроксимирующую функцію безпосередньо по апроксимується полиному (без функції ).
  3. Запишіть в текстовий файл отриманий аппроксимирующий поліном. Файл задайте у вигляді compX.txt, де - номер комп'ютера, за яким виконується лабораторна робота (1, 2, 3, ...).
  4. Створіть масив значень функції на відрізку і зробіть апроксимацію поліномами наступних порядків: 2-го, 3-го, 4-го. Розрахуйте і побудуйте наведену похибка апроксимації.

Примітка. Як зведеної похибки прийміть різницю в абсо-лютні значеннях між апроксимуючої функцією і істинної функції, віднесеної до максимуму модуля істинної функції (наприклад, для функції ).

Новости

Фольгированные шары с гелием
Для начала давайте разберемся и чего же выполнен фольгированный шар и почему он летает дольше?! Как вы помните, наши латексные шарики достаточно пористые, поэтому их приходится обрабатывать специальным

Все товары для праздника оптом купить
Как сделать правильный выбор в работе, бизнесе и жизни, о котором никогда не придется жалеть. Мы хотим рассказать вам об удивительной и очень простой технике 7 вопросов, которые позволят оценить ситуацию

Как сделать красивую снежинку из бумаги
Красивые бумажные снежинки станут хорошим украшением дома на Новый год. Они создадут в квартире атмосферу белоснежной, зимней сказки. Да и просто занимаясь вырезанием из бумаги снежинок разнообразной

Пиротехника своими руками в домашних
Самые лучшие полезные самоделки рунета! Как сделать самому, мастер-классы, фото, чертежи, инструкции, книги, видео. Главная САМОДЕЛКИ Дизайнерские

Аниматоры на детские праздники в Зеленограде
Уж сколько раз твердили миру…Что готовиться ко дню рождения нужно заранее, а не бегать в предпраздничный день угорелой кошкой. Нельзя впихнуть в 24 часа дела, рассчитанные на недели. К празднику нужно

Надувные шарики с гелием с доставкой
На праздники часто бывают востребованы воздушные шарики, надутые гелием. Обычно, их покупают уже готовыми (надутыми) и привозят на праздник. Или, приглашают специалистов, которые приезжают и надувают

2400 наименований пиротехники
В последние десятилетия наша страна может похвастаться появлением нескольких десятков отечественных производителей, специализирующихся на выпуске пиротехники. Если вы сомневаетесь, какой фейерверк заказать,

Как сделать из бумаги самолет
 1. Самолеты сделанный по первой и второй схеме являются самыми распространенными. Собирается такое оригами своими руками достаточно быстро, несмотря на это самолет летит достаточно далеко за счет свое

Суши доставка меню
В последние годы японская кухня стала очень популярной в нашей стране. И найти современного человека, который бы никогда не пробовал суши и роллы очень сложно. Но как правильно кушать суши палочками

Обеденные группы для маленькой кухни
Любой дом начинается с кухонной комнаты, а хороший дом - с уютной кухни. Уютной назвать кухню можно, если все в ней гармонично подобрано в соответствии с вашими вкусами и в едином стиле. Многие люди