-2
2
2
-2
3
-2
29
-2
4
54
Рішення завдання по методу найменших квадратів
Розраховується модель лінійна щодо своїх коефіцієнтів a i . Задана матриці і, а також функція для отримання матриці F. F - Спеціальна матриця, яка обчислюється за алгоритмом, наведеним нижче. Функція являє собою мою власну розробку, але цілком можливо її вводити вручну. Алгоритм складання матриці F (враховуючи розкладання):
, де - функції з моделі y, а. - n-й елемент матриці.
Виходячи з цих формул будується функція f (дивися лістинг програми 30.c).
Далі, за формулою знаходиться матриця з коефіцієнтами a i і виводиться на екран. h3> Блок-схема функції main з програми 30.c
Ні
h3> Блок-схема функції MMinor з програми 30.c
В
Блок-схема функції MatrixMultiply з програми 30.c
В
Блок-схема функції Determinant з програми 30.c
В
Лістинг програми 30.c
// Завдання 30. Апроксимація функції методом найменших квадратів
// (C) 2004 REPNZ
// Включаються файли
# include
# include
# include
# include
// -------------- Опис початкових значень ------------------
// Дано (Розміри матриць - (1 х висота):
// xm - це матриці-стовпець незалежних змінних
// xm = (x1, x2, ... xN) T висотою xr
// Вектор спостережень. ym - його матриця:
// ym = (y1, y2, ..., yM) T висотою yr
// А також описи функцій при коефіцієнтах a1, a2, ..., aK
// 1. Матриці з елементами типу double
// - Кількість елементів у столбцевих марітцах xm і ym
# define xr 2
# define yr 5
// - Дані значення х
static double xm1 [xr] = {1, 1};
static double xm2 [xr] = {-1, -1};
static double xm3 [xr] = {2, 2};
static double xm4 [xr] = {3, -2};
static double xm5 [xr] = {-2, 4};
// - Масив покажчиків на ці значення
static double * xmp [yr] = {xm1, xm2, xm3, xm4, xm5};
// - Матриця зі значеннями функції
static double ym [yr] = {0, -2, -2, 29, 54};
// 2. Функції з моделі
// - скільки їх
# define n 3
// І власне самі функції, записуються як тіло Сі-функції
double f (double xm [xr], int path)
// - які саме (n штук шляхів, вибирається параметром path)
{
switch (path)
{
// Функція 1
case 1:
return xm [0];// x1
// Функція 2
case 2:
return xm [1] * xm [1];// x2 ^ 2
// Функція 3
case 3:
return xm [0] * xm [1];// x1 * x2
}
printf (" nНеправільная функція n");
abort ();
}
// Ну і модель відповідно вийшла: y = a1 * x1 + a2 * x2 ^ 2 + a3 * x1 * x2
char txtmodel [] = "y = a1x1 + a2x2 ^ 2 + a3x1x2";
// Коротше, n = K, xr = N, yr = M (!) ;-)
///////////////////////////////////////////////////////////////////////////////
// = - = - = - = - = - = - = - = - = - = - = - = - = - = Функції й підпрограми = - = - = - = - = - = - = - = - = - = - = - = - = p>///////////////////////////////////////////////////////////////////////////////
// Друк матриці m. Розміри (x * y)
void mprint (double * m, int x, int y)
{
int i, j;// Індекси для проходу
for (j = 0; j
{
for (i = 0; i
{//Елемент
printf ("% 8.4lg", * (m + (j * x + i)));
}
printf (" n");// CR/LF
}
}
///////////////////////////////////////////////////////////////////////////////
// Перемноження матриць m1 (розмір - rows1 * cols1) і m2 (розмір - cols1 * Cols2)
// Результат поміщається в result
void MatrixMultiply (double * m1, int rows1, int cols1, double * m2, int cols2, double * result)
{
int i, j, k;
// Вийде матриця висотою rows1 і довжиною cols2
for (j = 0; j
{
for (i = 0; i
{
// Очищення елемента
* (result + (cols2 * j + i)) = 0;
for (k = 0; k
// рядка першої матриці
// Обчислення чергового ...