Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив1 / docx53 / Титул

.docx
Скачиваний:
23
Добавлен:
01.08.2013
Размер:
316.79 Кб
Скачать

Министерство образования и науки Украины

Запорожский институт экономики

и информационных технологий

Факультет компьютерной инженерии

Кафедра КНПИ

К ЗАЩИТЕ ДОПУЩЕНА

Зав.кафедрой _____________

к.ф.-м.н., проф. Таланин И.Е.

КУРСОВАЯ РАБОТА

ПО ДИСЦИПЛИНЕ: КРОСПЛАТФОРМЕННОЕ ПРОГРАМИРОВАНИЕ

РЕШЕНИЕ ГЛОБАЛЬНОЙ ИНТЕРПОЛЯЦИИ

Выполнил

ст. гр. ОКСИС-116К __ студент _______________ Курченко А.Ю.

Руководитель _______________ Устименко Н.Ф.

Запорожье

2012

РЕФЕРАТ

Курсовая работа: 41 страницы, 5 таблиц, 9 рисунков, 4 приложения, 20 источников литературы.

Объект исследования: интерполяция и методы её решения на программном уровне. Особенности различных видов интерполяции. Методы решения интерполяции.

Цель работы: изучить особенности методов решения полинома Лагранжа, подбора эмпирических формул, метода наименьших квадратов. Поиск популярного программного обеспечения выполняющего дефрагментацию жестких дисков. Создание программного продукта для расчёта данными методами.

В курсовой работе проводится анализ различных алгоритмов интерполяции, описание работы, оценка их эффективности; обзор популярных программных решений; исследование средств для создания программы.

Основные задачи: исследование различных методов решения интерполяции, выбор оптимального языка программирования для каждого метода; реализация трёх методов решения интерполяции.

АПРОКСИМАЦИЯ, ИНТЕРПОЛЯЦИЯ, МЕТОД, ПЛАТФОРМА, ЯЗЫК ПРОГРАМИРОВАНИЯ, FRAMEWORK ,ИНТЕГРАЦИЯ, КОМПИЛЯЦИЯ, ОБЕКТНО-ОРИЕНТИРОВАНЫЙ.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ……………………………………………………………………..

5

РАЗДЕЛ 1 АППРОКСИМАЦИЯ……………………………………………..

6

1.1 Аппроксимация……………………………………………………..

6

    1. Интерполяция……………………………………………………...

7

    1. Полином Лагранжа……………………………………………….

10

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

11

1.5 Метод наименьших квадратов…………………………………...

13

РАЗДЕЛ 2 ОПИСАНИЕ МЕТОДОВ РЕШЕНИЙ…………………………...

15

2.1 Microsoft Visual Studio…………………………………………….

15

2.2 .NET Framework……………………………………………………

16

2.3 Csharp и сравнение его с другими языками……………………...

17

2.4 Программы аналоги……………………………………………….

22

2.4.1 Grapger-solver-95………………………………………………

23

2.4.2 Программа расчета линейной регрессии методом наименьших квадратов………………………………………………………..

23

2.4.3 MNK+ 1.3……………………………………………………..

23

РАЗДЕЛ 3 РАЗРАБОТКА ПРОГРАММЫ……………………………………..

25

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

25

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

26

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

26

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

28

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

31

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

32

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

33

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

33

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

34

ВЫВОД…………………………………………………………………………

39

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

40

Приложение А………………………………………………………………….

42

Приложение Б………………………………………………………………….

51

Приложение В………………………………………………………………….

52

Приложение Г………………………………………………………………….

53

Приложение А

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace Курсовая_работа

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

//Системные команди----------------------------------------------------------------------------

private void button1_Click(object sender, EventArgs e)

{

ReshenieLagranga();

}

private void button7_Click(object sender, EventArgs e)

{

ReshenieEmpi();

}

private void button8_Click(object sender, EventArgs e)

{

ReshenieMNK();

}

private void button9_Click(object sender, EventArgs e)

{

chart2.Series[0].Points.Clear();

}

private void button4_Click(object sender, EventArgs e)

{

chart1.Series[0].Points.Clear();

}

private void button2_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void button5_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void button11_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void button10_Click(object sender, EventArgs e)

{

textBox16.Text = "";

textBox17.Text = "";

textBox18.Text = "";

textBox19.Text = "";

textBox20.Text = "";

textBox21.Text = "";

}

private void button6_Click(object sender, EventArgs e)

{

textBox10.Text = "";

textBox12.Text = "";

textBox13.Text = "";

richTextBox1.Text = "";

}

private void button3_Click(object sender, EventArgs e)

{

textBox1.Text = "";

textBox2.Text = "";

textBox3.Text = "";

textBox4.Text = "";

textBox5.Text = "";

textBox6.Text = "";

textBox7.Text = "";

textBox8.Text = "";

textBox9.Text = "";

textBox11.Text = "";

}

//Добавление элемента в масив------------------------------------------------------------------

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;

}

//Решение Полинома Лагранжа

private void ReshenieLagranga()

{

String x_line = textBox2.Lines[0]; //Получаем первую строку из textBox

String[] x_strings = x_line.Split(' '); //Разбиваем строку на отдельные элементы по пробелу

double[] xd = new double[x_strings.Length];

for (int i = 0; i < x_strings.Length; i++) //Цикл по всем элементам массива с строками значений x

{

xd[i] = double.Parse(x_strings[i]); //Переводим строки в double

}

String y_line = textBox11.Lines[0]; //Получаем первую строку из textBox5

String[] y_strings = y_line.Split(' '); //Разбиваем строку на отдельные элементы по пробелу

double[] yd = new double[y_strings.Length];

for (int i = 0; i < y_strings.Length; i++) //Цикл по всем элементам массива с строками значений x

{

yd[i] = double.Parse(y_strings[i]); //Переводим строки в double

}

// Сам алгорит расчёта полинома Лагранжа

double x = double.Parse(textBox7.Text);

if (xd.Length != yd.Length)

{

MessageBox.Show("Количество вводимых чисел должно быть одинаково!");

}

double sum = 0;

int n = xd.Length, arrayIndex, arrayIndexY;

double[] product = new double[n];

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];

textBox6.Text = sum.ToString();

}

xd = addToArray(xd, x);

yd = addToArray(yd, sum);

textBox1.Text = product[0].ToString();

textBox3.Text = product[1].ToString();

textBox4.Text = product[2].ToString();

foreach (int myInt in xd)

{

textBox8.AppendText(myInt.ToString());

}

foreach (int myInt in yd)

{

textBox9.AppendText(myInt.ToString());

}

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

{

chart1.Series[0].Points.AddXY(xd[i], yd[i]);

chart1.Series[0].LegendText = "Lx = sum yi*li*(x)";

}

}

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

private void ReshenieEmpi()

{

int m = int.Parse(textBox13.Text);

int n = m + 1;

String x_line = textBox12.Lines[0]; //Получаем первую строку из textBox

String[] x_strings = x_line.Split(' '); //Разбиваем строку на отдельные элементы по пробелу

double[] xd = new double[x_strings.Length];

for (int i = 0; i < x_strings.Length; i++) //Цикл по всем элементам массива с строками значений x

{

xd[i] = double.Parse(x_strings[i]); //Переводим строки в double

}

String y_line = textBox10.Lines[0]; //Получаем первую строку из textBox5

String[] y_strings = y_line.Split(' '); //Разбиваем строку на отдельные элементы по пробелу

double[] yd = new double[y_strings.Length];

for (int i = 0; i < y_strings.Length; i++) //Цикл по всем элементам массива с строками значений x

{

yd[i] = double.Parse(y_strings[i]); //Переводим строки в double

}

if (xd.Length != yd.Length)

{

MessageBox.Show("Количество вводимых чисел должно быть одинаково!");

}

double N = xd.Length; //

double sumy1 = 0;

// Работа с элементами первой строки ввода------------------------------------------------------

int powers = 20;

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];

}

}

// Работа с эдементами втрой строки ввода------------------------------------------------------

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];

}

}

for (int f = 0; f < yd.Length; f++) //перебираем елементы масива

{

sumy1 = sumy1 + yd[f]; // сумируем первые елементы строки уд

}

var indexToInsert = 0; // индекс, куда мы ходим вставить новый элемент

var newValue = N; // новый элемент, который вставляем

var list = sum.ToList();

list.Insert(indexToInsert, newValue);

var sum_x = list.ToArray();

//-----------

var indexToInserty = 0; // индекс, куда мы ходим вставить новый элемент

var newValuey = sumy1; // новый элемент, который вставляем

var listy = sumy.ToList();

listy.Insert(indexToInserty, newValuey);

var sumy_y = listy.ToArray();

//-----------------------------------------------------------------------------------------------------------------------------------

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

int d = 0;

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

{

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

{

d = i + w;

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

}

}

//-----------------------------------------------------------------------------------------------------------------

richTextBox1.Text = "";

for (int i = 0; i < matrix.GetLength(0); i++)

{

String line = "" + i + ") " + matrix[i, 0].ToString();

for (int j = 1; j < matrix.GetLength(1); j++)

{

line += "+" + matrix[i, j].ToString();

}

line += "=" + sumy_y[i] + " \n";

richTextBox1.Text += line; // вывод в рич текст бокс в формульном виде через параметр строки Лине

}

}

//Решение метода наименьших квадратов

private void ReshenieMNK()

{

int m = int.Parse(textBox21.Text);

int n = m + 1;

String x_line = textBox20.Lines[0]; //Получаем первую строку из textBox

String[] x_strings = x_line.Split(' '); //Разбиваем строку на отдельные элементы по пробелу

double[] xd = new double[x_strings.Length];

for (int i = 0; i < x_strings.Length; i++) //Цикл по всем элементам массива с строками значений x

{

xd[i] = double.Parse(x_strings[i]); //Переводим строки в double

}

String y_line = textBox19.Lines[0]; //Получаем первую строку из textBox5

String[] y_strings = y_line.Split(' '); //Разбиваем строку на отдельные элементы по пробелу

double[] yd = new double[y_strings.Length];

for (int i = 0; i < y_strings.Length; i++) //Цикл по всем элементам массива с строками значений x

{

yd[i] = double.Parse(y_strings[i]); //Переводим строки в double

}

if (xd.Length != yd.Length)

{

MessageBox.Show("Количество вводимых чисел должно быть одинаково!");

}

double N = xd.Length; //

double sumy1 = 0;

// Работа с эдементами первой строки ввода------------------------------------------------------

//textBox2.Text = Array.ConvertAll(textBox1.Lines[0].Split(' '), Convert.ToDouble).Select(x => Math.Pow(x,3)).Sum().ToString();

int powers = 20;

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];

}

}

// Работа с элементами втрой строки ввода------------------------------------------------------

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];

}

}

for (int f = 0; f < yd.Length; f++) //перебираем елементы масива

{

sumy1 = sumy1 + yd[f];

}

var indexToInsert = 0; // индекс, куда мы ходим вставить новый элемент

var newValue = N; // новый элемент, который вставляем

var list = sum.ToList();

list.Insert(indexToInsert, newValue);

var sum_x = list.ToArray();

//-----------

var indexToInserty = 0; // индекс, куда мы ходим вставить новый элемент

var newValuey = sumy1; // новый элемент, который вставляем

var listy = sumy.ToList();

listy.Insert(indexToInserty, newValuey);

var sumy_y = listy.ToArray();

//-----------------------------------------------------------------------------------------------------------------------------------

double[,] matrix = new double[n, n];// для заполнение в матрикс 4го елемента 0 нужно н+1

int d = 0;

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

{

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

{

d = i + w;

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

}

}

int size = n;

double[,] ta = new double[n, n];

double[] tb = tb = new double[n];

double[] tx = tx = new double[11];

int ts;

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];

}

foreach (int myInt in tx)

{

textBox16.AppendText(" " + myInt.ToString());

}

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);

chart2.Series[0].Points.AddXY(x + 1, y);

chart2.Series[0].LegendText = "y = A0+A1X^1+A2X^2+...+AnX^n";

}

}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void разработанаToolStripMenuItem_Click(object sender, EventArgs e)

{

About ab = new About();

ab.ShowDialog();

}

private void infoToolStripMenuItem_Click(object sender, EventArgs e)

{

Info inf = new Info();

inf.ShowDialog();

}

}

}

Приложение Б

Приложение В

Приложение Г

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