Метод Эрмита вычисления наименьшего значения полинома

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Программирование
  • 52 52 страницы
  • 8 + 8 источников
  • Добавлена 20.05.2024
1 496 руб.
  • Содержание
  • Часть работы
  • Список литературы
СОДЕРЖАНИЕ
Стр
ВВЕДЕНИЕ 6
РАЗДЕЛ 1 МЕТОД ЭРМИТА ВЫЧИСЛЕНИЯ НАИМЕНЬШЕГО ЗНАЧЕНИЯ ПОЛИНОМА 7
1.1Постановка задачи метода Эрмита вычисления наименьшего значения полинома 8
1.2Входные и выходные данные метода Эрмита вычисления наименьшего значения полинома 8
1.3Идея метода Эрмита вычисления наименьшего значения полинома 10
1.4Условия применимости метода Эрмита вычисления наименьшего значения полинома 10
1.5Вывод формул метода Эрмита вычисления наименьшего значения полинома 13
1.6Алгоритм метода Эрмита вычисления наименьшего значения полинома 14
1.7Практическое применение метода Эрмита вычисления наименьшего значения полинома 20
РАЗДЕЛ 2 РАЗРАБОТКА ПРОГРАММНОГО ПРОДУКТА 20
2.1Среда разработки Microsoft Visual Studio 20
2.2Язык программирования С# 22
2.3Интерфейс программного продукта 25
2.4Особенности интерфейса программного продукта 29
2.5Структура программного кода 30
ЗАКЛЮЧЕНИЕ 40
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 41
ПРИЛОЖЕНИЕ А БЛОК – СХЕМА ПРОГРАММЫ 42
ПРИЛОЖЕНИЕ Б ЛИСТИНГ ПРОГРАММЫ 44
Фрагмент для ознакомления

Бахвалов Н. С. Численные методы / Н. С. Бахвалов, Н. П. Жидков, Г. М. Кобельков. –7-е изд. – М.: БИНОМ. Лаборатория знаний, 2011. – 636 с.Казанский А.А. Программирование на VisualC# 2013: учеб.пособие для СПО / А.А. Казанский.- М.: Издательство Юрайт, 2019. – 191 с.Введение в WindowsForms. [Электронный ресурс]. – Режим доступа: https://metanit.com/sharp/windowsforms/1.3.php(дата обращения – 14 апреля 2024 г.)Документация по C#[Электронный ресурс]. – Режим доступа: https://docs.microsoft.com/ru-ru/dotnet/csharp/(дата обращения – 14 апреля 2024 г.)Различия между C# и другими языками программирования: яблоки, апельсины и немного C-Sharp. [Электронный ресурс]. – Режим доступа:https://habr.com/ru/companies/otus/articles/723460/(дата обращения – 14 апреля 2024 г.)Практика программирования на С# для Windows и Web в MicrosoftVisualStudio. [Электронный ресурс]. – Режим доступа:http://wladm.narod.ru/C_Sharp/index.html(дата обращения – 14 апреля 2024 г.)Язык программирования С#: история, специфика, место на рынке. [Электронный ресурс]. – Режим доступа:https://gb.ru/posts/yazyk-programmirovaniya-c-sharp-istoriya-specifika-mesto-na-rynke(дата обращения – 14 апреля 2024 г.).ПРИЛОЖЕНИЕ АБЛОК – СХЕМА ПРОГРАММЫРисунок А.1 – Блок-схема метода ЭрмитаПродолжение приложения АРисунок А.2 – Продолжение блок-схемыметода ЭрмитаПРИЛОЖЕНИЕ Б ЛИСТИНГПРОГРАММЫusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceMinimumFuncErmitApproximation{public partial class Form1 : Form {public Form1() {InitializeComponent(); }private void button2_Click(object sender, EventArgs e) {this.Close(); }private void Nextbtn_Click(object sender, EventArgs e) {this.Hide();MainFormmainFrm = new MainForm();mainFrm.ShowDialog();this.Close(); } }}using System;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Globalization;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceMinimumFuncErmitApproximation{public partial class MainForm : Form {publicstaticdoublexmin; //найденное наименьшее значениеpublic static double eps; //точностьрешенияpublicstaticdouble h; //шаг для нахождения интервала поиска наименьшего значенияpublicstaticint n; //степень многочленаpublicstaticdouble x0; //начальное приближениеpublicstaticintiter; //число итераций при поиске наименьшего значенияПродолжение приложения БpublicstaticstringsInterval=""; //строка для формирования сообщения об интервале поиска наименьшего значенияpublic static List coeff = new List(); // списокподкоэффициентыполинома// вычисление значения полинома в точке по схеме Горнераstatic double PolinomGorner(double[] a, double x) {int n = a.Length;double y = a[0];for (inti =1; i coef) {double[] a = new double[coef.Count];for (vari = 0; i < coef.Count; i++) {a[i] = coef[i]; }returnPolinomGorner(a, x);}//вычисление значения производной исследуемого полинома в точкеdouble f1(double x, List coef) {int k = coef.Count-1;double[] a = new double[k];for (vari = 0; i < k; i++) {a[i] = coef[i]*( k - i); }returnPolinomGorner(a, x); } //МетодкубическойпараболыdoublecubicParabola(double h, double x0, double epsilon) {double x1, x2;double y1, y2;double y11, y12;doublez,w,mu;double xx;bool flag = false;int k = 0;iter = 0;double y10;do { y10 = f1(x0, coeff);if (y10 > 0) {xx = x0 - Math.Pow(2, k) * h; }else {xx = x0 + Math.Pow(2, k) * h;}Продолжение приложения Бif (f1(xx, coeff) * f1(x0, coeff) < 0 || k>=10){flag = true; }else {x0 = xx; k = k + 1; } }while (!flag);if (f1(x0, coeff) < 0) {x1 = x0;x2 = xx; }else {x1 = xx;x2 = x0; }if (k>=10) {sInterval = "Начальное приближение или шаг выбраны неудачно, интервал поиска не найден"; //выводим очень большое число в качестве результатаreturn -2147483648; }else {sInterval = "Интервалпоиска: ("+x1.ToString() + "; " + x2.ToString() + ")";} //пока разница между концами отрезка с наименьшим значением больше или равна заданной точности, уменьшенной вдвое, ищем минимумwhile (Math.Abs(x2 - x1) >= epsilon / 2){ //задаем счётчик итерацийiter = iter + 1; //вычисляем значение полинома и его производной в концах отрезкаy1 = f(x1, coeff); y2 = f(x2, coeff); y11 = f1(x1, coeff); y12 = f1(x2, coeff);//вычисляем значение минимума кубической параболы по формулам z = y11 + y12 - 3 * (y2 - y1) / (x2 - x1); w = Math.Sqrt(z * z - y11 * y12);mu = (w + z - y11) / (2 * w - y11 + y12);xx = x1 + mu * (x2 - x1);//задаем новые концы отрезка с наименьшим значениемif (f1(xx, coeff) < 0)x1 = xx;else {if (f1(xx, coeff) == 0){ //если найденное значение попало точно в минимумx1 = xx;x2 = xx; }elsex2 = xx;} };Продолжение приложения Б //выводим минимум исследуемого полиномаreturn (x2 + x1) / 2; }publicMainForm() {InitializeComponent(); }private void ExitMainbtn_Click(object sender, EventArgs e) {this.Close(); }private void Runbtn_Click(object sender, EventArgs e) {int k = 0; n = Convert.ToInt32(DegreeUpDown.Value) + 1;//проверяем коэффициенты полинома на заполнениеfor (int i = 0; i < n; i++){if (CoeffdGV.Rows[0].Cells[i].Value == null) { k = k + 1; //считаем количество пустых коэффициентов } };if (k > 0) { //если есть хотя бы один незаполненный коэффициент, то поиск не начинаемMessageBox.Show("Коэффициенты полинома должны быть заполнены!");return; }if (BegintxtBox.Text != "" && SteptxtBox.Text != "" && EpstxtBox.Text != "") { k = 0; // Задаем десятичную точкуIFormatProvider formatter = new NumberFormatInfo{ NumberDecimalSeparator = "." }; //приводим число в техтбокс к формату с точкой (даже если введена запятая)stringtmpS = BegintxtBox.Text.Replace(",", ".");//получаем начальное приближение числом x0 = double.Parse(tmpS, formatter); //приводим число в техтбокс к формату с точкой (даже если введена запятая)tmpS = SteptxtBox.Text.Replace(",", "."); //получаем шаг числомh = double.Parse(tmpS, formatter);if (h == 0) {MessageBox.Show("Шаг не может быть нулевым!");return; } //приводим число в техтбокс к формату с точкой (даже если введена запятая)tmpS = EpstxtBox.Text.Replace(",", "."); //получаем точность числомeps = double.Parse(tmpS, formatter);if (eps == 0) {MessageBox.Show("Точность не может быть нулевой!");return; } //очищаем списокcoeff.Clear();Продолжение приложения Б //заполняем список коэффициентами полиномаfor (inti = 0; i < n; i++) {tmpS = CoeffdGV.Rows[0].Cells[i].Value.ToString().Replace(",", "."); //получаемкоэффициентчисломcoeff.Add(double.Parse(tmpS, formatter));if (double.Parse(tmpS, formatter) == 0){ k = k + 1; //считаем количество нулевых коэффициентов } };if (k == n) { //если все коэффициенты равны нулюMessageBox.Show("Хотя бы один коэффициент полинома должен быть ненулевым!");return; } //поиск наименьшего значения полиномаdoublexmin = cubicParabola(h, x0, eps); //Вывод результатов поиска:if (xmin != -2147483648){Intervallbl.ForeColor = Color.Black;Intervallbl.Text = sInterval;xMintxtBox.Text = xmin.ToString();fMintxtBox.Text = f(xmin, coeff).ToString(); textBox1.Text = iter.ToString(); }else {Intervallbl.ForeColor = Color.Red;Intervallbl.Text = sInterval;xMintxtBox.Text = "";fMintxtBox.Text = ""; textBox1.Text = "";} }else {MessageBox.Show("Необходимо задать настройки поиска!");return; } }private void MainForm_Load(object sender, EventArgs e){CoeffdGV.ColumnCount = 4; //задаем минимальное количество столбцовCoeffdGV.RowCount = 2; //задаем количество строкCoeffdGV.AllowUserToAddRows = false; //отключаем добавление строкCoeffdGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //настройки графикаchart1.Visible = false;AxesXMintxtBox.Text = "-5";AxesXMaxtxtBox.Text = "5";AxesYMintxtBox.Text = "-500";AxesYMaxtxtBox.Text = "500"; } //Обработкаизменениястепениполиномаprivate void DegreeUpDown_ValueChanged(object sender, EventArgs e){CoeffdGV.Columns.Clear(); //удаляем ранее созданные столбцыПродолжение приложения БCoeffdGV.AllowUserToAddRows = true; //отключаем добавление строкint k = (int)DegreeUpDown.Value+1; //задаем количество столбцовfor (inti = 0; i < k; i++) {CoeffdGV.Columns.Add("a" + Convert.ToString(k - 1 - i), "a" + Convert.ToString(k -1 - i)); };CoeffdGV.RowCount = 2; //задаемколичествострокCoeffdGV.AllowUserToAddRows = false; //отключаемдобавлениестрок } //очисткаполейвводаprivate void Clearbtn_Click(object sender, EventArgs e) {BegintxtBox.Text = "";SteptxtBox.Text = "";EpstxtBox.Text = "";xMintxtBox.Text = "";fMintxtBox.Text = ""; textBox1.Text = "";for (inti = 0; i < n; i++) {CoeffdGV.Rows[0].Cells[i].Value=""; }; chart1.Visible = false;Intervallbl.ForeColor = Color.Black;Intervallbl.Text = "Интервал поиска: "; } //вывод графика полинома и его производнойprivate void Chartbtn_Click(object sender, EventArgs e) {int k = 0; n = Convert.ToInt32(DegreeUpDown.Value) + 1;//проверяем коэффициенты полинома на заполнениеfor (int i = 0; i < n; i++){if (CoeffdGV.Rows[0].Cells[i].Value == null){ k = k + 1; //считаем количество пустых коэффициентов } };if (k > 0) { //если есть хотя бы один незаполненный коэффициент, то поиск не начинаемMessageBox.Show("Коэффициенты полинома должны быть заполнены!");return; }if (AxesXMintxtBox.Text != "" && AxesXMaxtxtBox.Text != "" && AxesYMintxtBox.Text != "" && AxesYMaxtxtBox.Text != "") { k = 0; // ЗадаемдесятичнуюточкуIFormatProvider formatter = new NumberFormatInfo{ NumberDecimalSeparator = "." }; //приводим число в техтбокс к формату с точкой (даже если введена запятая)stringtmpS = AxesXMintxtBox.Text.Replace(",", "."); //получаемминимумпо X числомdoubleXmin = double.Parse(tmpS, formatter);//приводим число в техтбокс к формату с точкой (даже если введена запятая)tmpS = AxesXMaxtxtBox.Text.Replace(",", "."); //получаем максимум по X числомdoubleXmax = double.Parse(tmpS, formatter);tmpS = AxesYMintxtBox.Text.Replace(",", "."); //получаемминимумпо X числомПродолжениеприложенияБdoubleYmin = double.Parse(tmpS, formatter);//приводим число в техтбокс к формату с точкой (даже если введена запятая)tmpS = AxesYMaxtxtBox.Text.Replace(",", "."); //получаем максимум по X числомdoubleYmax = double.Parse(tmpS, formatter);double Step = 0.1; // Количествоточекграфикаint count = (int)Math.Ceiling((Xmax - Xmin) / Step) + 1;// Массив значений X – общий для обоих графиковdouble[] x = new double[count];// Два массива Y – по одному для каждого графикаdouble[] y1 = new double[count];double[] y2 = new double[count]; //очищаемсписокcoeff.Clear();for (inti = 0; i < n; i++) {tmpS = CoeffdGV.Rows[0].Cells[i].Value.ToString().Replace(",", "."); //получаемкоэффициентчисломcoeff.Add(double.Parse(tmpS, formatter));if (double.Parse(tmpS, formatter) == 0){ k = k + 1; //считаем количество нулевых коэффициентов } };if (k == n) { //если все коэффициенты равны нулюMessageBox.Show("Хотя бы один коэффициент полинома должен быть ненулевым!");return; } // Расчитываем точки для графиков функцииfor (inti = 0; i < count; i++) { // Вычисляемзначение Xx[i] = Xmin + Step * i;y1[i] = f(x[i], coeff);y2[i] = f1(x[i], coeff); } chart1.Visible = true;chart1.ChartAreas[0].AxisX.Minimum = Xmin;chart1.ChartAreas[0].AxisX.Maximum = Xmax;chart1.ChartAreas[0].AxisY.Minimum = Ymin;chart1.ChartAreas[0].AxisY.Maximum = Ymax;chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;chart1.ChartAreas[0].AxisX.Crossing = 0;chart1.ChartAreas[0].AxisY.Crossing = 0;chart1.ChartAreas[0].AxisX.Interval = 0.5; //(Xmax - Xmin) / 20;chart1.Series[0].LegendText = "полином";chart1.Series[1].LegendText = "производная"; // Определяемшагсеткиchart1.ChartAreas[0].AxisX.MajorGrid.Interval = 5 * Step;chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;chart1.Series[1].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;chart1.Series[0].Points.DataBindXY(x, y1);chart1.Series[1].Points.DataBindXY(x, y2);}else {Продолжение приложения БMessageBox.Show("Необходимо указать границы области графика!");return; } }private void AxesXMintxtBox_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void AxesYMintxtBox_KeyPress(object sender, KeyPressEventArgs e){if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void AxesXMaxtxtBox_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void AxesYMaxtxtBox_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void BegintxtBox_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void SteptxtBox_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void EpstxtBox_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true; }private void CoeffdGV_KeyPress(object sender, KeyPressEventArgs e) {if (!char.IsDigit(e.KeyChar) & (e.KeyChar != '-') & (e.KeyChar != ',') & (e.KeyChar != '.') & (e.KeyChar != (char)Keys.Back))e.Handled = true;} }}

1.Машарова Р.В., – Методические рекомендации по выполнению курсовой работы по междициплинарному курсу МДК 01.01 Разработка программных модулей, ГТ ФГБОУ ВО «ДонГУ», Горловка, 2023 г., – 24 с.
2.Бахвалов Н. С. Численные методы / Н. С. Бахвалов, Н. П. Жидков, Г. М. Кобельков. – 7-е изд. – М.: БИНОМ. Лаборатория знаний, 2011. – 636 с.
3.Казанский А.А. Программирование на Visual C# 2013: учеб. пособие для СПО / А.А. Казанский.- М.: Издательство Юрайт, 2019. – 191 с.
4.Введение в Windows Forms. [Электронный ресурс]. – Режим доступа: https://metanit.com/sharp/windowsforms/1.3.php (дата обращения – 14 апреля 2024 г.)
5.Документация по C# [Электронный ресурс]. – Режим доступа: https://docs.microsoft.com/ru-ru/dotnet/csharp/ (дата обращения – 14 апреля 2024 г.)
6.Различия между C# и другими языками программирования: яблоки, апельсины и немного C-Sharp. [Электронный ресурс]. – Режим доступа: https://habr.com/ru/companies/otus/articles/723460/ (дата обращения – 14 апреля 2024 г.)
7.Практика программирования на С# для Windows и Web в Microsoft Visual Studio. [Электронный ресурс]. – Режим доступа: http://wladm.narod.ru/C_Sharp/index.html (дата обращения – 14 апреля 2024 г.)
8.Язык программирования С#: история, специфика, место на рынке. [Электронный ресурс]. – Режим доступа: https://gb.ru/posts/yazyk-programmirovaniya-c-sharp-istoriya-specifika-mesto-na-rynke (дата обращения – 14 апреля 2024 г.).