линейно приближение

линейно приближение

При обработването на експерименталните данни, често е необходимо да се сближат линейна функция.

Сближаване (приближение) на F функция (х) се нарича да се намери такава функция (притискащото функция) г (х). което ще закрие комплекта. Критериите за функцията близост могат да бъдат различни.

Ако подходът се основава на дискретен комплект точки, сближаването се нарича точка или дискретни.

Ако приближение се извършва непрекъснат набор от точки (интервал), сближаването се нарича непрекъсната или интегрална. Пример за такова приближение може да служи като разширение на серия Taylor, т.е. замяната на функция на полином степен.

Най-често срещани гледна точка сближаване интерполация е - намиране на междинната стойност на стойностите с отделен набор от известни стойности.

Като се има предвид дискретен комплект точки, наречен интерполация възли. и стойностите на функцията на тези точки. Задължително за конструиране г функция (х). минаваща близо до всички посочени възли. Така, критерият за близост е функция г (XI) = ил.

Тъй като функция г (х) обикновено е избран полином, известен като полином интерполация.

Ако има един полином интерполация за целия регион, заяви, че глобалната интерполация.

Ако между различните възли полиноми различно, посочи по части интерполация или местни.

Намирането на интерполация полином, ние можем да се изчисли стойността на функцията между възлите, както и да се определи стойността на функцията, дори и извън посочения интервал (за да се екстраполира).

Сближаване на линейна функция

Всяка линейна функция може да бъде изразена чрез уравнението

Сближаването е да се намери коефициентите А и Б от уравнението, така че всички експериментални точки лежат най-близо до сближаване на линия.

За тази цел най-често използваният метод на най-малките квадрати (OLS), същността на която се състои в следното: сборът от квадратите на отклоненията на точката от притискащото точка взема минималната стойност:

Решението на проблема се свежда до намиране на екстремум на тази функция на две променливи. За тази цел, ние откриваме частните производни на функцията на коефициентите А и В и ги приравнява до нула.

линейно приближение

Ние решаваме получената система от уравнения

Ние се определят стойностите на коефициентите
линейно приближение

За да се изчисли коефициентите трябва да намерят следните компоненти:

Тогава стойностите на коефициентите ще бъдат определени като

изпълнение пример

Например изпълнение използваме набор от ценности, получени в съответствие с уравнението на линията

Ние изчисляваме тези коефициенти по метода на най-малките квадрати.
Резултатът се съхранява под формата на двумерен масив, състояща се от две колони.
Следващият път, когато стартирате програмата ще добави случаен компонент на определен набор от ценности и да се изчислят коефициентите отново.

Изпълнението на C

#define _CRT_SECURE_NO_WARNINGS
#include
#include
// Задаване на първоначален набор от ценности
двойно ** getData (междинно съединение п) двойно ** F;
е = новата двойно * [2];
е [0] = новата двойно [п];
е [1] = новата двойно [п];
за (INT I = 0; и е [1] [Ь] = 8 * (двойно) I - 3;
// Добавяне на случаен компонент
е [1] [Ь] = 8 * (двойно) I - 3 + ((ранд ()% 100) -50) * 0,05;
>
върне F;
>
// изчисляват коефициентите на притискащото линия
анулира getApprox (двойни ** х двукратно * на, двойно * б, Int п) двойно sumx = 0;
двойно Sumy = 0;
двойно sumx2 = 0;
двойно sumxy = 0;
за (INT I = 0; и Sumy + = х [1] [Ь];
sumx2 + = х [0] [Ь] * х [0] [Ь];
sumxy + = х [0] [Ь] * х [1] [Ь];
>
* А = (п * sumxy - (sumx * Sumy)) / (п * sumx2 - sumx * sumx);
* В = (Sumy - * а * sumx) / п;
се върне;
>
INT основни () двойни ** X, А, В;
Int п;
система ( "CHCP 1251");
система ( "CLS");
ФОРМАТ ( "Въведете броя на точки");
scanf ( ".". н);
х = getData (п);
за (INT I = 0; и ФОРМАТ ( "% 5.1lf -% 7.3lf \ п" х [0] [Ь] х [1] [Ь].);
getApprox (х, а, б, п);
ФОРМАТ ( "а =% LF \ NB =% LF" а, Ь.);
getchar (); getchar ();
връщане 0;
>


резултат на изпълнение
Изпълнете не случаен компонент

линейно приближение

Започвайки с случаен компонент
линейно приближение

Построяване функции


Изпълнението на C

#include
конст Int NUM = 70; // брой точки
LONG WinAPI WndProc (HWND UINT WPARAM LPARAM ...);
двойни ** X; // масив от данни
// Определяне на коефициентите на линейно приближение на MNE
анулира getApprox (двойни ** m, двойно * на, двойно * б, Int N) двойно sumx = 0;
двойно Sumy = 0;
двойно sumx2 = 0;
двойно sumxy = 0;
за (INT I = 0; и Sumy + = m [1] [Ь];
sumx2 + = m [0] [Ь] * м [0] [Ь];
sumxy + = m [0] [Ь] * м [1] [Ь];
>
* А = (п * sumxy - (sumx * Sumy)) / (п * sumx2 - sumx * sumx);
* В = (Sumy - * а * sumx) / п;
се върне;
>
// масив от данни за диаграмата
// (двумерен масив може да съдържа няколко реда данни)
двойно ** getData (междинно съединение п) двойно ** F;
двойно А, В;
е = новата двойно * [3];
е [0] = новата двойно [п];
е [1] = новата двойно [п];
е [2] = новата двойно [п];
за (INT I = 0; и е [0] [I] = х;
е [1] [Ь] = 8 * х - 3 + ((ранд ()% 100) - 50) * 0,05;
>
getApprox (е, а, б, п); // приближение
за (INT I = 0; и е [2] [Ь] = А * х + б;
>
върне F;
>
// изготвя графики на функции
анулира DrawGraph (HDC HDC, RECT rectClient, двойни ** х, Int п, Int numrow = 1) двойна OffsetY, OffsetX;
двойно MAX_X = 0;
двойно MAX_Y = 0;
двойно ScaleX, ScaleY;
двойно минути, макс;
вътр височина, ширина;
Int X, Y; // координати на прозореца (в пиксела)
HPEN hpen;
височина = rectClient.bottom - rectClient.top;
ширина = rectClient.right - rectClient.left;
// ПОЛЕ допустимите стойности X
мин = х [0] [0];
макс = х [0] [0];
за (INT I = 0; и мин = х [0] [Ь];
IF (х [0] [Ь]> макс)
макс = х [0] [Ь];
>
двойно температура = макс - мин;
MAX_X = макс - мин;
OffsetX = мин * ширина / MAX_X; // компенсира X
ScaleX = (двойно) широчина / MAX_X; // мащаб фактор X
// ПОЛЕ допустимите стойности Y
мин = х [1] [0];
макс = х [1] [0];
за (INT I = 0; и мин = Х [к] [Ь];
ако (х [к] [Ь]> макс)
макс = Х [к] [Ь];
>
>
MAX_Y = макс - мин;
OffsetY = макс * височина / (MAX_Y); // компенсира Y
ScaleY = (двойно) височина / MAX_Y; // Y скалиращият коефициент
// Render оси
hpen = CreatePen (PS_SOLID 0, 0); // черен химикал 1px
SelectObject (HDC, hpen);
MoveToEx (HDC, 0, OffsetY, 0); // преместване на точката (0; OffsetY)
LineTo (HDC, ширина, OffsetY); // изготвяне хоризонтална ос
MoveToEx (HDC, OffsetX, 0, 0); // премести в точка (OffsetX 0)
LineTo (HDC, OffsetX, височина); // равен вертикална ос
DeleteObject (hpen); // отстраняване на черен писалката
// Чертеж графиката на функцията
Int цвят = 0xFF; // червено писалка за първия ред на данните
за (Int J = 1; й <= numrow; j++) hpen = CreatePen( PS_SOLID. 2, color); // формирование пера 2px
SelectObject (HDC, hpen);
X = (междинно съединение) (OffsetX + х [0] [0] * ScaleX); // координати на изходните точки на графиката
Y = (междинно съединение) (OffsetY - х [к] [0] * ScaleY);
MoveToEx (HDC, X, Y, 0); // премине към началната точка
за (INT I = 0; и Y = OffsetY - х [к] [Ь] * ScaleY;
LineTo (HDC, X, Y);
>
цвят = цвят <<8; // изменение цвета пера для следующего ряда
DeleteObject (hpen); // отстраняване на ток писалката
>
>
// основна функция
Int WinAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, Int nCmdShow) HWND hwnd;
MSG съобщ;
WNDCLASS w;
х = getData (NUM); // Задаване на първоначалните данни
memset (т, 0, sizeof (WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = CreateSolidBrush (0x00FFFFFF);
w.lpszClassName = "Моят клас";
RegisterClass (w);
hwnd = CreateWindow ( "Моят клас", "Графика функция"
WS_OVERLAPPEDWINDOW. 500, 300, 500, 380, NULL. NULL,
hInstance, NULL);
ShowWindow (hwnd, nCmdShow);
UpdateWindow (hwnd);
докато (GetMessage (MSG, NULL 0, 0)). TranslateMessage (MSG);
DispatchMessage (MSG);
>
върнете msg.wParam;
>
// функция прозорец
LONG WinAPI WndProc (HWND hwnd, UINT Съобщението,
WPARAM wparam, LPARAM lparam) HDC HDC;
PAINTSTRUCT к.с.;
превключвател (ЛС) случай WM_PAINT:
HDC = BeginPaint (hwnd, PS);
DrawGraph (HDC, ps.rcPaint, X, NUM, 2); // заговор
EndPaint (hwnd, PS);
прекъсване;
При WM_DESTROY:
PostQuitMessage (0);
прекъсване;
по подразбиране:
върнете DefWindowProc (hwnd, Съобщение, wparam, lparam);
>
връщане 0;
>