Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx53 / КурсоваяЯЯЯЯЯЯЯЯЯЯЯЯЯЯ.docx
Скачиваний:
93
Добавлен:
01.08.2013
Размер:
412.24 Кб
Скачать

Раздел 3 разработка программы

Разработка данного программного обеспечения требовалась в связи с развитием и усовершенствованием методов аппроксимации и интерполяции.

Эти методы были реализованы в данном курсовом проекте непосредственно с помощью нестандартных функций. Эти функции изображены ниже.

3.1 Функция решения полинома Лагранжа

Для расчёта полинома Лагранжа необходимо реализовать способ расчета, который предложил он (1.1). Вследствие чего я реализовал функцию расчёта по формуле Лагранжа. Здесь создаётся массив данных product, в который будут заноситься данные расчёта базисного полинома. Количество этих базисных полиномов будет зависеть от степени n. В переменную arrayIndexY вносятся значения массива точек У (в данном случае массив yd). При прохождении условия моя функция проходит в завершающий этап в котором вносятся значения в массив product , после этого значения массива суммируются и помешаются в переменную sum. В дальнейшем это значение будет добавлено с помощью функции добавления в конец массива и по этим данным построится график.

for (arrayIndexY = 0; arrayIndexY < n; arrayIndexY++)

{

product[arrayIndexY] = yd[arrayIndexY];

}

for (arrayIndex = 0; arrayIndex < n; arrayIndex++)

{

for (int j = 0; j < n; j++)

{

if ((arrayIndex == j) || (xd[arrayIndex] - xd[j] == 0))

{

continue;

}

product[arrayIndex] *= (x - xd[j]) / (xd[arrayIndex] - xd[j]);

}

sum = product[0] + product[1] + product[2];

}

3.2 Добавление переменной в конец массива

В этой функции показано как можно добавить в массив любое значение в последний индекс массива. Как показано ниже, создаётся массив newArray с длинной массив array но с длиной на один больше. И в дальнейшем в этот массив будут занесены значения массива который будет передаваться в этот метод с добавлением значения val, в котором будет храниться значение добавляемое в конец массива. Эта функция использовалась в данной курсовой работе для добавления в массив точек, по которым будет строиться график функции.

private double[] addToArray(double[] array, double val)

{

double[] newArray = new double[array.Length + 1];

for (int i = 0; i < array.Length; i++)

{

newArray[i] = array[i];

}

newArray[array.Length] = val;

return newArray;

}

3.3 Функция решения подбора эмпирических формул

Расчёт этой функции необходим для данного решения и вывода эмпирических формул(1.4). Ниже будет показана реализация этого метода через несколько функций. Обработка данных для построения формул которые были введены пользователем в первую колонку с значениями Х. Здесь мы берём значения массива xd и слаживаем их в цикле. В следующем прохождении цикла мы возводим каждый элемент в степень начиная с 1(это и есть просто сумма) и так возводим в цикле до 20й степени. И в завершении помешаем значения в массив sum.

double[,] array = new double[xd.Length, powers];

for (byte q = 0; q < xd.Length; q++)

array[q, 0] = xd[q];

double[] sum = new double[powers];

for (byte j = 1; j <= powers; j++)

{

for (int q = 0; q < array.GetLength(0); q++)

{

array[q, j - 1] = Math.Pow(array[q, 0], j);

sum[j - 1] += array[q, j - 1];

}

}

Обработка данных для построения формул которые были введены пользователем во вторую колонку с значениями У. Здесь мы берём значения массива уd и слаживаем их в цикле. В следующем прохождении цикла мы умножаем каждый элемент на каждый элемент массива array ( массив xd). В каждом прохождении цикла мы повторяем это действие и до числа в переменной n и суммируем значения и помешаем их в переменную sumy для дальнейшей работы в программе.

int ypowers = n - 1;

double[,] arrayy = new double[yd.Length, ypowers];

for (byte q = 0; q < yd.Length; q++)

arrayy[q, 0] = yd[q];

double[] sumy = new double[ypowers];

for (byte j = 1; j <= ypowers; j++)

{

for (int q = 0; q < arrayy.GetLength(0); q++)

{

arrayy[q, j - 1] = arrayy[q, 0] * array[q, j - 1];

sumy[j - 1] += arrayy[q, j - 1];

}

}

Далее будет обработка данных для расположения данных массива в виде уравнений, которые в дальнейшем будут выводится в поле для пользователя. В коде видно, что создаётся массив matrix, в который помещаются элементы массива sum_x, в виде эмпирических формул (Рис. 3.3).

double[,] matrix = new double[n, n]; // добавление и перебор символов в массиве матрикс, и подставка каждого 2го элемента заново

for (int i = 0; i < n; i++)

{

for (int w = 0; w < n; w++)

{

d = i + w;

matrix[i, w] = sum_x[d];

}

}

3.4 Функция для расчёта метода Гаусса

Метод Гаусса — классический метод решения системы линейных алгебраических уравнений (СЛАУ). Это метод последовательного исключения переменных, когда с помощью элементарных преобразований система уравнений приводится к равносильной системе ступенчатого (или треугольного) вида, из которой последовательно, начиная с последних (по номеру) переменных, находятся все остальные переменные. Эта функция необходима для решения системы линейных уравнений в методе наименьших квадратов. Здесь показано, что создаются массивы: ta, tb, tx, и переменная ts. В массиве ta будут храниться значения массива matrix, в массиве tb будут находиться значения sumy_y, который был составлен аналогично функции расчёта эмпирических формул. В массиве tx будут храниться значения неизвестных, которые будут найдены после решения методом Гаусса. Дальнейшее решение метода Гаусса разбивается на 2 этапа показанных ниже:

• на первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна. А именно, среди элементов первого столбца матрицы выбирают ненулевой, перемещают его на крайнее верхнее положение перестановкой строк и вычитают получившуюся после перестановки первую строку из остальных строк, домножив её на величину, равную отношению первого элемента каждой из этих строк к первому элементу первой строки, обнуляя тем самым столбец под ним. После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию.

• на втором этапе осуществляется так называемый обратный ход, суть которого заключается в том, чтобы выразить все получившиеся базисные переменные через небазисные и построить фундаментальную систему решений, либо, если все переменные являются базисными, то выразить в численном виде единственное решение системы линейных уравнений. Эта процедура начинается с последнего уравнения, из которого выражают соответствующую базисную переменную (а она там всего одна) и подставляют в предыдущие уравнения, и так далее, поднимаясь по «ступенькам» наверх. Каждой строчке соответствует ровно одна базисная переменная, поэтому на каждом шаге, кроме последнего (самого верхнего), ситуация в точности повторяет случай последней строки.

for (int i = 0; i < size; i++)

{

for (int j = 0; j < size; j++)

ta[i, j] = matrix[i, j];

tb[i] = sumy_y[i];

}

ts = size;

//Решение СЛАУ методом Гауса

// прямой ход

for (int i = 0; i < ts - 1; i++)

{

// меняем текущую строку с той, у которой диагональный

// элемент ненулевой и наибольший

int imax = i;

for (int j = i; j < ts; j++)

{

if ((ta[j, i] > ta[imax, i]) && (ta[j, i] != 0))

imax = j;

}

if (imax != i)

{

double tmp;

for (int t = 0; t < ts; t++)

{

tmp = ta[imax, t];

ta[imax, t] = ta[i, t];

ta[i, t] = tmp;

}

tmp = tb[imax];

tb[imax] = tb[i];

tb[i] = tmp;

}

// теперь прямой ход по данной строке

for (int k = i + 1; k < ts; k++)

{

double divider = ta[k, i] / ta[i, i];

for (int l = i; l < ts; l++)

{

ta[k, l] = ta[k, l] - ta[i, l] * divider;

}

tb[k] = tb[k] - tb[i] * divider;

}

}

// все, прямой ход сделан, теперь идем обратно

for (int i = ts - 1; i >= 0; i--)

{

for (int j = i + 1; j < ts; j++)

tb[i] -= tx[j] * ta[i, j];

tx[i] = tb[i] / ta[i, i];

}

После решения методом Гаусса необходимо было построить график функции в виде функции (1.3). Для это была разработана данная функция . В коде показано, что переменные Х берутся с данных пользователя, которые он ввёл в качестве интервала. В дальнейшем значения интервала подставляются согласно функции метода наименьших квадратов, и после этого уже строится график функции х и у.

int a = 0, b = 0;

a = int.Parse(textBox18.Text);

b = int.Parse(textBox17.Text);

double y = 0;

for (int x = a; x < b; x++)

{

y = tx[0] + tx[1] * Math.Pow(x, 1) + tx[2] * Math.Pow(x, 2) + tx[3] * Math.Pow(x, 3) + tx[4] * Math.Pow(x, 4) + tx[5] * Math.Pow(x, 5) + tx[6] * Math.Pow(x, 6) + tx[7] * Math.Pow(x, 7) + tx[8] * Math.Pow(x, 8) + tx[9] * Math.Pow(x, 9) + tx[10] * Math.Pow(x, 10);

3.5 Интерфейс программы

Программа имеет удобный в использовании интерфейс (Рис. 3.1). В центре окна имеется выпадающий список, в котором расположены методы решения глобальной интерполяции. Среди них такие методы решения: полином Лагранжа, подбор эмпирических формул, метод наименьших квадратов, которые рассматриваются в данной курсовой работе. На главной форме расположена кнопка «Вызвать» служащая для перехода к методам решений, какие будут представлены ниже.

Рис. 3.1 Вид главного окна программы.

3.6 Полином Лагранжа

В первой вкладке «Полином Лагранжа» отображены поля для ввода данных, поля с выводом информации для построения графика, а так же кнопки для решения методом Лагранжа, очистка данных, очистка графика и выхода из программы (Рис 3.2). Для решения данным методом пользователю необходимо заполнить поля с значениями: Z, X, Y, и нажать на кнопку «Расчёт». После нажатия кнопки будут занесены данные в поля вывода L0, L1, L2, L3, L(x). Также будут заполнены поля с координатами Х и У, по которым будет строится график функции, расположенный справа.

Рис. 3.2 Расчёт полинома Лагранжа.

3.7 Подбор эмпирических формул

На данной вкладке расположены поля для ввода значений: Z, X, Y, по которым будет осуществляться подбор эмпирических формул (Рис 3.3). Кнопка «Решение» будет заполняться в поле вывода формул в правой части этой вкладки. Аналогично предыдущей вкладке пользователь может воспользоваться кнопками для очистки данных и выхода из программы.

Рис. 3.3 Решение методом подбора эмпирических формул.

3.8 Метод наименьших квадратов

На последней вкладке будет находиться метод наименьших квадратов (Рис. 3.4). Для решения этим методом необходимо заполнить поля с значениями: m, X, Y, и нажать на кнопку «Решение». После которой будет построен график функции с его легендой, и заполнены значения поля «Аn», по которым будет построен график расположенный в правой части данной вкладки. Так же как и в предыдущих вкладках, пользователь может воспользоваться кнопками для очистки данных, очистки графика и выхода из программы.

Рис. 3.4 Решение методом наименьших квадратов.

3.9 Меню программы

В данной программе предусмотрено меню, которое включает в себя 2 подменю для вызова формы с информацией о методах решения, и выходом из программы (Рис 3.5).

Рис.3.5 Меню программы

При нажатии на подменю «Информация» открывается форма, в которой расположены три вкладки: полином Лагранжа, подбор эмпирических формул, метод наименьших квадратов, которые рассматриваются в данной курсовой работе.

Информация для работы с первым методом «Полином Лагранжа» сжато объясняет, как работает данный метод, а так же имеет ссылки на литературу в интернете. При переходе по данным ссылкам пользователь увидит детальную информацию, которая объясни полностью историю и методологию решения (Рис 3.6).

Рис 3.6 Вкладка с информацией к первому методу.

Далее показана вторая вкладка «Подбор эмпирических формул», где сжато объясняется принцип работы данного метода, а так же находятся ссылки на литературу в интернете. При переходе по данным ссылкам пользователь увидит детальную информацию, которая объясни полностью историю и методологию решения (Рис 3.7).

Рис 3.7 Вкладка с информацией ко второму методу.

В последней вкладке показана информация для работы с третьим методом – «Методом наименьших квадратов», в котором коротко подается принцип работы данного метода, а так же имеются ссылки на литературу в интернете. При переходе по данным ссылкам пользователь увидит детальную информацию, которая объясни полностью историю и методологию решения (Рис 3.8).

Рис 3.8 Вкладка с информацией о решении третьего метода.

Так же в данной программе предусмотрено меню справки о разработке программы. При нажатии на неё откроется форма с полем данных, где написаны методы, с которыми велась работа в данной курсовой работе, так же ведомости кем была разработана программа и небольшая информация (Рис 3.9).

Рис 3.9 Информация о разработке программы.

ВЫВОД

В данной курсовой работе была выполнена поставленная задача - создание программы, реализующей решения методов полинома Лагранжа, подбора эмпирических формул, метода наименьших квадратов.

В процесс выполнения курсовой работы были исследованы различные методы решения аппроксимации и интерполяции функций, а так же методы работы с ними, последствия возникновения данного решения. Во время выполнения задания были изучены популярные алгоритмы для решения данных функций, их методы работы, особенности, преимущества и недостатки. Было произведено сравнение нескольких популярных языков программирования и выбран наиболее подходящий к предложенному методу решения. Приложение разрабатывалось в универсальной среде разработки Microsoft Visual Studio 2010. Для обеспечения более высокой скорости работы приложения, код был написан на языке Csharp, откомпилирован стандартным компилятором Microsoft.

Благодаря собранным данным и полученным навыкам, была разработана предложенная программа. Эта программа способна решать и строить графики для облегчения работы с вышеуказанными методами решения. Также в программе предусмотрена информация для работы с программой и непосредственно с методами решения. Программа не занимает много места и не требовательна к установленному программному обеспечению.

СПИСОК ЛИТЕРАТУРЫ

1. Ватсон К. Си Шарп / К. Ватсон. - М.: Лори, 2005. - 862 с.

2. Жарков В. Компьютерная графика, мультимедиа и игры на VisualC# 2005 / В. Жарков. - М.: Жарков пресс, 2005. - 812с.

3. Лахатин А. Языки программирования. Учеб. пособие / А. Лахатин, Л..Искакова. - Екатеринбург, 1998. - 548с.

4. Либерти Д. Программирование на Си Шарп / Д. Либерти.- М.: Символ-плюс, 2005. - 684 с.

5. Мак-Дональд М. Microsoft ASP.NET 3.5 с примерами на C# 2008 для профессионалов /  М. Мак-Дональд, М. Шпушта. - Иллинойс: Диалектика, 2008.– 1424.

6. Нейгел К. C# 4.0 и платформа .NET 4 для профессионалов / К. Нейгел, Б..Ивьен, Дж. Глинн. – Иллинойс: Диалектика, 2011. – 1440с.

7. Пономарев В.  Программирование на C++/C# в Visual Studio .NET 2003 / В..Пономарев. – Спб.: БХВ, 2004. - 352с.

8. Уэйт М. Язык С. Руководство для начинающих. / М. Уэйт, С. Прага, Д..Мартин. - М.: Мир, 1995. - 521с.

9. Фридман А. Язык программирования С++ / А.Фридман. - М.: Бином, 2006. - 523с.

10. Шилдт Г. C#: Учебный курс / Г.Шилд.- Спб.: Питер, 2003. - 512с.

11. Аналог программы Grapger-solver-95[Электронный ресурс]. - Режим доступа: http://onix.name/tag/java/аналог

12. Аналог программы MNK+ 1.3 [Электронный ресурс]. - Режим доступа: http://gorund.net/soft/skachat-MNK.html

13. Аналог программы расчета линейной регрессии методом наименьших квадратов [Электронный ресурс]. - Режим доступа: http://www.chem-astu.ru/science/lsq/

14. Богатырев А. Язык программирования С [Электронный ресурс] / А..Богатырев. - Режим доступа: http://www.refby.com.

15. Википедия – свободная энциклопедия [Электронный ресурс]. - Режим доступа: http://ru.wikipedia.org.

16. Информация про технологию разработки [Электронный ресурс]. - Режим доступа: http://msdn.microsoft.com/

17. Метод наименьших квадратов [Электронный ресурс]. - Режим доступа: http://pers.narod.ru/study/methods/03.html#mnk

18. Подбор эмпирических формул [Электронный ресурс]. - Режим доступа: http://pers.narod.ru/study/methods/03.html#empiric

19. Полином Лагранжа [Электронный ресурс]. - Режим доступа: http://pers.narod.ru/study/methods/03.html#lagrange

20. Полином Лагранжа [Электронный ресурс]. - Режим доступа: http://wood.mendelu.cz/math/maw-html/index.php?lang=uk&form=lagrange

Соседние файлы в папке docx53