Фрагмент для ознакомления
Бахвалов Н. С. Численные методы / Н. С. Бахвалов, Н. П. Жидков, Г. М. Кобельков. –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 г.).