Наша совместная команда Banwar.org

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

  • (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-го. Розрахуйте і побудуйте наведену похибка апроксимації.

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

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.