Курсовая работа по информатике.. Аппроксимация функции методом наименьших квадратов
Скачать 229.38 Kb.
|
Схема алгоритма.Начало Ввод данных Промежуточные расчёты (согл. таблице 2) Аппроксимируем функцию y=f(x) линейной функцией (находим коэффициенты а1 и а2) Аппроксимируем функцию y=f(x) квадратичной функцией (находим коэффициенты а1, а2 и а3) Аппроксимируем функцию y=f(x) экспоненциальной функцией (находим коэффициенты а1 и а2) Находим среднее арифметическое и Промежуточные расчёты (согл. таблице 7) Находим коэффициент корреляции r (для линейной аппроксимации) Находим коэффициент детерминированности r2 для линейной, квадратичной и экспоненциальной аппроксимации Вывод результатов Конец Рис.1. Схема алгоритма для программы расчёта. Программа расчета на языке программирования VBA.Sub prog() For i = 1 To 25 Cells(i, 23) = Cells(i, 1) ^ 2 Cells(i, 24) = Cells(i, 1) * Cells(i, 2) Cells(i, 25) = Cells(i, 1) ^ 3 Cells(i, 26) = Cells(i, 1) ^ 4 Cells(i, 27) = Cells(i, 1) ^ 2 * Cells(i, 2) Cells(i, 28) = Log(Cells(i, 2)) Cells(i, 29) = Log(Cells(i, 2)) * Cells(i, 1) Cells(i, 30) = (summirovanie(1) / 25 - Cells(i, 1)) * (summirovanie(2) / 25 - Cells(i, 2)) Cells(i, 31) = (Cells(i, 1) - summirovanie(1) / 25) ^ 2 Cells(i, 32) = (Cells(i, 2) - summirovanie(2) / 25) ^ 2 Next Dim y3(1, 0) As Variant y1 = krameffor2(25, summirovanie(1), summirovanie(1), summirovanie(23), summirovanie(2), summirovanie(24)) с = krameffor2(25, summirovanie(1), summirovanie(1), summirovanie(23), summirovanie(28), summirovanie(29)) y3(0, 0) = exp(с(0, 0)) y3(1, 0) = с(1, 0) y2 = krameffor3(25, summirovanie(1), summirovanie(23), summirovanie(1), summirovanie(23), summirovanie(25), summirovanie(23), summirovanie(25), summirovanie(26), summirovanie(2), summirovanie(24), summirovanie(27)) For i = 1 To 25 Cells(i, 33) = (y1(0, 0) + y1(1, 0) * Cells(i, 1) - Cells(i, 2)) ^ 2 Cells(i, 34) = (y2(0, 0) + y2(1, 0) * Cells(i, 1) + y2(2, 0) * Cells(i, 1) ^ 2 - Cells(i, 2)) ^ 2 Cells(i, 35) = (y3(0, 0) * exp(y3(1, 0) * Cells(i, 1)) - Cells(i, 2)) ^ 2 Next koef1 = summirovanie(30) / (summirovanie(31) * summirovanie(32)) ^ (1 / 2) koef2 = 1 - summirovanie(33) / summirovanie(32) koef3 = 1 - summirovanie(34) / summirovanie(32) koef4 = 1 - summirovanie(35) / summirovanie(32) MsgBox ("Линейный" + vbNewLine + "a1=" + Str(Round(y1(0, 0), 5)) + vbNewLine + "a2=" + Str(Round(y1(1, 0), 5))) MsgBox ("Квадратичный" + vbNewLine + "a1=" + Str(Round(y2(0, 0), 5)) + vbNewLine + "a2=" + Str(Round(y2(1, 0), 5)) + vbNewLine + "a3=" + Str(Round(y2(2, 0), 5))) MsgBox ("Экспонентальный" + vbNewLine + "a1=" + Str(Round(y3(0, 0), 5)) + vbNewLine + "a2=" + Str(Round(y3(1, 0), 5))) MsgBox ("Коэффициенты" + vbNewLine + "коэффициент корреляции=" + Str(Round(koef1, 5)) + vbNewLine + "коэффициент д.линейный=" + Str(Round(koef2, 5)) + vbNewLine + "коэффициент д.квадратный=" + Str(Round(koef3, 5)) + vbNewLine + "коэффициент д.экспонентальный=" + Str(Round(koef4, 5))) End Sub Function krameffor2(a, b, c, d, e, f) Dim resh(1, 0) As Variant opred = a * d - b * c opred1 = e * d - b * f opred2 = a * f - e * c resh(0, 0) = opred1 / opred resh(1, 0) = opred2 / opred krameffor2 = resh End Function Function krameffor3(a1, a2, a3, b1, b2, b3, c1, c2, c3, e, f, g) Dim resh(2, 0) As Variant opred = a1 * b2 * c3 + a2 * b3 * c1 + a3 * b1 * c2 - a3 * b2 * c1 - a1 * b3 * c2 - a2 * b1 * c3 aa1 = e bb1 = f cc1 = g x1 = aa1 * b2 * c3 + a2 * b3 * cc1 + a3 * bb1 * c2 - a3 * b2 * cc1 - aa1 * b3 * c2 - a2 * bb1 * c3 aa2 = e bb2 = f cc2 = g x2 = a1 * bb2 * c3 + aa2 * b3 * c1 + a3 * b1 * cc2 - a3 * bb2 * c1 - a1 * b3 * cc2 - aa2 * b1 * c3 aa3 = e bb3 = f cc3 = g x3 = a1 * b2 * cc3 + a2 * bb3 * c1 + aa3 * b1 * c2 - aa3 * b2 * c1 - a1 * bb3 * c2 - a2 * b1 * cc3 resh(0, 0) = x1 / opred resh(1, 0) = x2 / opred resh(2, 0) = x3 / opred krameffor3 = resh End Function Function summirovanie(n) summirovanie = 0 For i = 1 To 25 summirovanie = summirovanie + Cells(i, n) Next End Function Результаты расчёта на языке программирования VBA.Результаты, полученные с помощью функции ЛИНЕЙН.Рассмотрим назначение функции ЛИНЕЙН. Эта функция использует метод наименьших квадратов, чтобы вычислить прямую линию, которая наилучшим образом аппроксимирует имеющиеся данные. Функция возвращает массив, который описывает полученную прямую. Уравнение для прямой линии имеет следующий вид: y = m1x1 + m2x2 + ... + b или y = mx + b, где зависимое значение y является функцией независимого значения x. Значения m - это коэффициенты, соответствующие каждой независимой переменной x, а b - это постоянная. Заметим, что y, x и m могут быть векторами. Для получения результатов необходимо создать табличную формулу, которая будет занимать 5 строк и 2 столбца. Этот интервал может располагаться в произвольном месте на рабочем листе. В этот интервал требуется ввести функцию ЛИНЕЙН. В результате должны заполниться все ячейки интервала А66:В70 (как показано в таблице 9). Таблица 9.
Поясним назначение некоторых величин, расположенных в таблице 9. Величины, расположенные в ячейках А66 и В66 характеризуют соответственно наклон и сдвиг. А68 – коэффициент детерминированности. А69 – F-наблюдаемое значение. B69 – число степеней свободы. A70 – регрессионная сумма квадратов. B70 – остаточная сумма квадратов. Представление результатов в виде графиков.Рис.1. График линейной аппроксимации Рис.2. График квадратичной аппроксимации Рис.3. График экспоненциальной аппроксимации Вывод.Сделаем вывод по результатам проведенных работ: Результаты расчетов показывают, что квадратичная аппроксимация лучшим образом описывает экспериментальные данные, потому что линия тренда для неё наиболее точно описывает поведение функции на заданном участке. Сравнивая результаты, полученные при помощи функции ЛИНЕЙН, видим, что они полностью совпадают с вычислениями, проведенными выше. Это показывает, что вычисления верны. Результаты, полученные с помощью программы на языке VBA, полностью совпадают со значениями, полученными в Exсel, что говорит о верности вычислений. Список используемой литературы.Методические указания «Аппроксимация экспериментальных данных методом наименьших квадратов». Руководство по прикладному программированию на VBA: Учебное пособие / Маланичев И.В., Ермолаева Л.Б. |