Министерство образования и науки Украины
Запорожский институт экономики и информационных технологий
Факультет компьютерной инженерии Кафедра КНПИ
К ЗАЩИТЕ ДОПУЩЕНА
Зав.кафедрой _____________
к.ф.-м.н., проф. Таланин И.Е.
КУРСОВАЯ РАБОТА
ПО ДИСЦИПЛИНЕ: КРОСПЛАТФОРМЕННОЕ ПРОГРАМИРОВАНИЕ РЕШЕНИЕ ГЛОБАЛЬНОЙ ИНТЕРПОЛЯЦИИ Выполнил ст. гр. ОКСИС-116К __ студент _______________ Курченко А.Ю.
Руководитель _______________ Устименко Н.Ф.
Запорожье 2012 |
РЕФЕРАТ
Курсовая работа: 41 страницы, 5 таблиц, 9 рисунков, 4 приложения, 20 источников литературы.
Объект исследования: интерполяция и методы её решения на программном уровне. Особенности различных видов интерполяции. Методы решения интерполяции.
Цель работы: изучить особенности методов решения полинома Лагранжа, подбора эмпирических формул, метода наименьших квадратов. Поиск популярного программного обеспечения выполняющего дефрагментацию жестких дисков. Создание программного продукта для расчёта данными методами.
В курсовой работе проводится анализ различных алгоритмов интерполяции, описание работы, оценка их эффективности; обзор популярных программных решений; исследование средств для создания программы.
Основные задачи: исследование различных методов решения интерполяции, выбор оптимального языка программирования для каждого метода; реализация трёх методов решения интерполяции.
АПРОКСИМАЦИЯ, ИНТЕРПОЛЯЦИЯ, МЕТОД, ПЛАТФОРМА, ЯЗЫК ПРОГРАМИРОВАНИЯ, FRAMEWORK ,ИНТЕГРАЦИЯ, КОМПИЛЯЦИЯ, ОБЕКТНО-ОРИЕНТИРОВАНЫЙ.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ…………………………………………………………………….. |
5 |
РАЗДЕЛ 1 АППРОКСИМАЦИЯ…………………………………………….. |
6 |
1.1 Аппроксимация…………………………………………………….. |
6 |
|
7 |
|
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();
}
}
}
Приложение Б
Приложение В
Приложение Г