Министерство образования науки РФ. Высшего профессионального учреждения Тверского государственный технический университет. Кафедра программного обеспечения. Методы вычислений Лабораторная работа №2 1 вариант выполнил студент группы ПИН 1106 Александренков А.Ю. проверил Грязнов Е. Н. Виноградов С. Ю. Тверь,2012 1. Напишите программу, реализующую численное интегрирование функции одной переменной методом (одним из трех - по вариантам) левых прямоугольников, правых прямоугольников, прямоугольников. 2. Напишите программу, реализующую численное интегрирование функции одной переменной методом трапеций. 3. Напишите программу, реализующую численное интегрирование функции одной переменной методом Симпсона. 4. Составьте сравнительную таблицу точности численного интегрирования перечисленными выше методами в зависимости от шага интегрирования. Сравните результаты интегрирования с точным значением интеграла. Сделайте выводы. Замечания по реализации: Реализация методов численного интегрирования должна заключаться в отдельном статическом классе. Задание границ и шага интегрирования должно осуществляться через пользовательский интерфейс. В качестве подынтегральной функции выбирается функция из списка ниже по варианту. Список функций 1. 2. 3. 4. 5. y = sin( x ); y = x – sin( x ) – 0.25; y = e ^ x; y = 1 / ln( x ); y = x; Теоретическая часть Метод прямоугольников — метод численного интегрирования функции одной переменной, заключающийся в замене подынтегральной функции на многочлен нулевой степени, то есть константу, на каждом элементарном отрезке. Если рассмотреть график подынтегральной функции, то метод будет заключаться в приближённом вычислении площади под графиком суммированием площадей конечного числа прямоугольников, ширина которых будет определяться расстоянием между соответствующими соседними узлами интегрирования, а высота — значением подынтегральной функции в этих узлах. Алгебраический порядок точности равен 0. Если отрезок является элементарным и не подвергается дальнейшему разбиению, значение интеграла можно найти по 1. Формуле левых прямоугольников: 2. Формуле правых прямоугольников: 3. Формуле прямоугольников (средних): Метод трапеций — метод численного интегрирования функции одной переменной, заключающийся в замене на каждом элементарном отрезке подынтегральной функции на многочлен первой степени, то есть линейную функцию. Площадь под графиком функции аппроксимируется прямоугольными трапециями. Алгебраический порядок точности равен 1. Если отрезок является элементарным и не подвергается дальнейшему разбиению, значение интеграла можно найти по формуле Метод парабол (метод Симпсона) Использовав три точки отрезка интегрирования, можно заменить подынтегральную функцию параболой. Обычно в качестве таких точек используют концы отрезка и его среднюю точку. В этом случае формула имеет очень простой вид . Если разбить интервал интегрирования на где равных частей, то имеем . Практическая часть Листинг Form using using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; ClassLibrary; namespace Методы_вычесления { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { try { double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); double h = Convert.ToDouble(textBox3.Text); if (h > 0) { textBox4.Text = Integral.LRat(h, a, b).ToString(); } else { MessageBox.Show("Проверь h !"); } } catch (Exception exc) { MessageBox.Show(exc.Message); } } private void button2_Click(object sender, EventArgs e) { try { double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); double h = Convert.ToDouble(textBox3.Text); if (h > 0) { textBox4.Text = Integral.TRap(h, a, b).ToString(); } else { MessageBox.Show("Проверь h !"); } } catch (Exception exc) { MessageBox.Show(exc.Message); } } private void button3_Click(object sender, EventArgs e) { try { double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); double h = Convert.ToDouble(textBox3.Text); if (h > 0) { textBox4.Text = Integral.Simpson(h, a, b).ToString(); } else { MessageBox.Show("Проверь h !"); } } catch (Exception exc) { MessageBox.Show(exc.Message); } } private void button4_Click(object sender, EventArgs e) { try { System.Diagnostics.Process proc = new System.Diagnostics.Process(); string Расчет; //задание директории в которой располагается изначальная программа Расчет = System.Windows.Forms.Application.StartupPath.ToString(); //задание параметров запускаемой программы proc.StartInfo.FileName = Расчет + "\\Таблица результатов.docx"; proc.StartInfo.WorkingDirectory = Расчет + "\\Таблица результатов.docx"; //запуск программы proc.Start(); } catch { MessageBox.Show("Ненайден файл !"); } } } } Листинг dll. using using using using System; System.Collections.Generic; System.Linq; System.Text; namespace Library2 { public class Integral { public static double getValue(double arg) { return Math.Sin(arg); } /// <summary> /// Вычесление методом левых прямоугольников /// </summary> /// <param name="h">Шаг</param> /// <param name="a">Левая граница</param> /// <param name="b">Правая граница</param> /// <returns></returns> public static double LRat(double h, double a, double b) { double res = 0; for (double i = a; i < b; i += h) res += getValue(i) * h; return res; } /// <summary> /// Вычесление методом трапеции /// </summary> /// <param name="h">Шаг</param> /// <param name="a">Левая граница</param> /// <param name="b">Правая граница</param> /// <returns></returns> public static double TRap(double h, double a, double b) { double res = 0; for(double i = a; i < b; i += h) res+=h*((getValue(i)+(getValue(i)+h))/2); return res; } /// <summary> /// Метод симсона /// </summary> /// <param name="h"></param> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static double Simpson(double h, double a, double b) { double res = 0; for (double i = a; i < b; i += h) res += (((i + h) - i) / 6 * (getValue(i) + 4 * getValue((i + i + h) / 2) + getValue(i + h))); return res; } } } Таблица Таблица результатов составлена для функции: f: y=sin(x) y1=0,459701 y2=1,416142 y3=1,53029 Метод Метод левых прямоугольников Метод трапеции Метод Симпсона Левая граница 0 0 1 0 0 1 0 0 1 Правая граница 1 2 3 1 2 3 1 2 3 Шаг Результат 0.01 0.01 0.001 0.01 0.01 0.001 0.01 0.01 0.001 0,45548 1,41158 1,53078 0,46048 1,42158 1,53178 0,45969 1,41614 1,53043 Абсолютная точность 0,004221 0,004562 -0,00049 -0,000779 -0,005438 -0,00149 0,000011 0,000002 -0,00014 Вывод: При данных условиях самым точным на небольшом отрезке оказался удобен метод Симпсона.