Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Методика решения нормальных уравнений ⇐ ПредыдущаяСтр 3 из 3
Один из возможных способов минимизации критерия аппроксимации (2) предполагает решение системы нормальных уравнений (3). При выборе в качестве аппроксимирующей функции линейной функции искомых параметров нормальные уравнения представляют собой систему линейных алгебраических уравнений. Систему n линейных уравнений общего вида:
(4)
(4) можно записать посредством матричных обозначений в следующем виде: А·Х=В,
квадратная матрица А называется матрицей системы, а вектора Х и В соответственно вектором-столбцом неизвестных систем и вектором-столбцом ее свободных членов. В матричном виде исходную систему n линейных уравнений можно записать и так:
(6)
Решение системы линейных уравнений сводиться к отысканию значений элементов вектора-столбца (хi), называемых корнями системы. Чтобы эта система имела единственное решение, входящее в нее n уравнение должно быть линейно независимым. Необходимым и достаточным условием этого является неравенство нулю определителя системы, т.е. Δ=detA≠0. Алгоритм решения системы линейных уравнений подразделяется на прямые и итерационные. На практике никакой метод не может быть бесконечным. Для получения точного решения итерационные методы требуют бесконечного числа арифметических операций. Практически это число приходиться брать конечным и поэтому решение в принципе имеет некоторую ошибку, даже если пренебречь ошибками округлений, сопровождающими большинство вычислений. Что же касается прямых методов, то они даже при конечном числе операций могут в принципе дать точное решение, если оно существует. Прямые и конечные методы позволяют найти решение системы уравнений за конечное число шагов. Это решение будет точным, если все промежутки вычисления проводятся с ограниченной точностью.
3. Ручной счёт.
Исходная функциональная зависимость представлена таблично, парами значения Найти параметры
1. Выражение для аппроксимации функции будет иметь следующий вид: 2. Запишем выражение для критерия аппроксимации
3. В соответствии с условиями локального минимума функции
Таким образом, получим три уравнения
4. Приведём полученную систему уравнений к нормальному виду, перенеся свободные члены вправо и поделив обе части уравнения на 2.
5. Для удобства представим промежуточные результаты вычислений в таблице
Используя значение из таблицы, запишем систему уравнений в окончательном виде
Введя обозначения
данную систему уравнений можно записать можно в матричном виде:
6. Полученную систему уравнений решим тем способом, который указан в задании. 1. Метод Гаусса Множитель, на который необходимо умножать второе уравнение будет Если из первого уравнения вычесть второе, умноженное на
Множитель, на который необходимо умножать третье уравнение будет Если из второго уравнения вычесть третье, умноженное на
Решение данной системы имеет вид:
7. В результате решения исходной системы линейных уравнений и нахождения значений получаем запись искомой аппроксимирующей функции в следующем виде
8. Оценка погрешности аппроксимации. Рассчитаем значение аппроксимирующей функции в заданных точках В соответствии с таблицей построим график исходной и аппроксимационной функции.
Вычислим значение критерия аппроксимации:
Максимальное по модулю отклонение
4. Текст программы и результат расчётов параметров на ЭВМ. Схемы алгоритмов Схема алгоритма основной программы:
i=0; i<n; i++
i=0; i<n; i++
i i
j
i koeff -схема алгоритма функции расчёта коэффициентов
i=0; i<m; i++ j=0; j<m; j++
I=0; I<n; I++
I
j
I=0; I<n; I++
I
i
vivodres - Схема алгоритма функции расчёта F[i], D[i]
i=0; i<n; i++
i
approk- cхема алгоритма функции расчёта и вывода Kr
i=0; i<n; i++
i
otkl - подпрограммы поиска и вывода максимального отклонения по модулю
i=0; i<n; i++
Да
i
metodgaussa- главная функция метода
i=0; i<m-1; i++ j
k=0; k<m; k++
j=i+1; j<m; j++
j
k i i=m-1;i>=0;i--
j=i+1;j<m;j++
fi - схема алгоритма функции выбора функций
4.2. Текст программы и результат расчётов параметров на ЭВМ #include <stdio.h> #include <conio.h> #include <math.h> #include <cmath> #define n 5 #define m 3 void koeff(float A[m][m], float B[m], float x[n], float y[n]); float fi(float x, int k); void metodgaussa(float A[m][m], float B[m], float C[m]); void otkl(float G[n], float X[n]); void approk(float G[n]); void res(float X[n], float Y[n], float C[m], float G[n]);
int main() { int i, k, j; float A[m][m], B[m], C[m], D[n], x[n], y[n]; printf("Vvedite X:\n"); for (i = 0; i<n; i++) { scanf_s("%f", &x[i]); } printf("Vvedite Y:\n"); for (i = 0; i<n; i++) { scanf_s("%f", &y[i]); } koeff(A, B, x, y); printf("matrica A: "); for (i = 0; i<m; i++) { printf("\n"); for (j = 0; j<m; j++) printf("%9.4f ", A[i][j]); } printf("\nVektor B:\n"); for (i = 0; i<m; i++) { printf("%5.4f ", B[i]); } metodgaussa(A, B, C); printf("\n"); printf("\nKoefficienti C1=%5.4f, C2=%5.4f, C3=%5.4f", C[0], C[1], C[2]); printf("\n"); printf("\nF=%4.4f+%4.4f(x)+%4.4f(x*x)", C[0], C[1], C[2]); printf("\n"); res(x, y, C, D); printf("\n"); approk(D); printf("\n"); otkl(D, x); _getch(); }
float fi(float x, int k) { if (k == 0) return (1); else if (k == 1) return (log(x)); else if (k == 2) return (x); }
void koeff(float A[m][m], float B[m], float x[n], float y[n]) { int i, j, l; float S; for (i = 0; i<m; i++) { for (j = 0; j<m; j++) { S = 0; for (l = 0; l<n; l++) S = S + fi(x[l], i)*fi(x[l], j); A[i][j] = S; } S = 0; for (l = 0; l<n; l++) S = S + y[l] * fi(x[l], i); B[i] = S; } }
void res(float X[n], float Y[n], float C[m], float D[n]) { int i; float F[n]; printf("\nRezultati vichislenii:\n"); printf("i X[i] Y[i] F[i] D[i]\n"); for (i = 0; i<n; i++) { F[i] = C[0] + C[1] * (log(X[i])) + C[2] * (X[i]); D[i] = Y[i] - F[i]; printf("%i %5.4f %5.4f %6.4f %6.4f\n", i + 1, X[i], Y[i], F[i], D[i]); } }
void approk(float D[n]) { int i; float Kr; Kr = 0; for (i = 0; i<n; i++) Kr = Kr + D[i] * D[i]; printf("\nMin. znachenie kachestva approksimacii:"); printf("Kr=%7.6f ", Kr); }
void otkl(float D[n], float X[n]) { int i, max; float g; g = fabs(D[0]); max = 0; for (i = 1; i<n; i++) if (fabs(D[i])>g) { g = fabs(D[i]); max = i; } printf("\n\nMax. po modulu otklonenie:\n"); printf("max|g[i]|=%5.4f pri x=x[%d]=%5.4f\n", g, max + 1, X[max]); }
void metodgaussa(float A[m][m], float B[m], float C[m]) { int i, k, j; float sum; for (i = 0; i<m - 1; i++) { for (k = i + 1; k<m; k++) { C[i] = A[k][i] / A[i][i]; A[k][i] = 0; for (j = i + 1; j<m; j++) A[k][j] = A[k][j] - C[i] * A[i][j]; B[k] = B[k] - C[i] * B[i];
} }
for (i = m - 1; i >= 0; i--) { sum = 0; for (j = i + 1; j<m; j++) sum = sum + A[i][j] * C[j]; C[i] = (B[i] - sum) / (A[i][i]); } } Скриншот работы программы:
Заключение В результате проделанной работы был описан критерий аппроксимации, способ его минимизации, составлена система нормальных уравнений, параметры которой вычислили при помощи метода Гаусса, рассчитаны отклонения аппроксимирующей функции, а также максимальное по модулю отклонение. Расчёты составлены двумя способами: -подсчитанные вручную -подсчитанные на ЭВМ, при помощи составленной программы
Date: 2016-05-25; view: 942; Нарушение авторских прав |