Министерство образования науки РФ. Высшего профессионального учреждения Тверского государственный технический университет. Кафедра программного обеспечения. Методы вычислений Лабораторная работа №3 1 вариант выполнил студент группы ПИН 1106 Александренков А.Ю. проверил Грязнов Е. Н. Виноградов С. Ю. Тверь,2012 1. Напишите программу, реализующую численное интегрирование функции одной переменной по формуле «3/8». 2. Напишите программу, реализующую численное интегрирование функции одной переменной по формуле Уэддля. 3. Напишите программу, реализующую численное интегрирование функции одной переменной методом Гаусса для двух точек. 4. Дополните сравнительную таблицу точности численного интегрирования, составленную в ходе предыдущей лабораторной работы, результатами расчета по перечисленным выше методам. Сравните результаты интегрирования с точным значением интеграла. Сделайте выводы. Теоретическая часть Метод Гаусса Описанные выше методы используют фиксированные точки отрезка (концы и середину) и имеют низкий порядок точности (1 — методы правых и левых прямоугольников, 2 — методы средних прямоугольников и трапеций, 3 — метод парабол (Симпсона)). Если мы можем выбирать точки, в которых мы вычисляем значения функции , то можно при том же количестве вычислений подынтегральной функции получить методы более высокого порядка точности. Так для двух (как в методе трапеций) вычислений значений подынтегральной функции, можно получить метод уже не 2-го, а 3-го порядка точности: . В общем случае, используя точек, можно получить метод с порядком точности метода Гаусса по точкам являются корнями полинома Лежандра степени . . Значения узлов Значения узлов метода Гаусса и их весов приводятся в справочниках специальных функций. Наиболее известен метод Гаусса по пяти точкам. Практическая часть Листинг 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 { double a = 0, b = 0, h = 0; void metod() { try { a = Convert.ToDouble(textBox1.Text); b = Convert.ToDouble(textBox2.Text); h = Convert.ToDouble(textBox3.Text); } catch (Exception exc) { MessageBox.Show(exc.Message); } if (h > 0) { h = Convert.ToDouble(textBox3.Text); } else { MessageBox.Show("Проверь h ! Присвоенно h=0.01 по умолчанию !"); h = 0.01; textBox3.Text = Convert.ToString("0,01"); } } public Form1() { InitializeComponent(); } private void button5_Click(object sender, EventArgs e) { metod(); textBox4.Text = Integral.TriWosmyh(h, a, b).ToString(); } private void button6_Click(object sender, EventArgs e) { metod(); textBox4.Text = Integral.Gausa(h, a, b).ToString(); } private void button7_Click(object sender, EventArgs e) { metod(); textBox4.Text = Integral.Ueddla(h, a, b).ToString(); } } } Листинг dll. using using using using System; System.Collections.Generic; System.Linq; System.Text; namespace ClassLibrary { 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 Gausa(double h, double a, double b) { double res = 0; for (double i = a; i < b; i += h) res += h / 2 * (getValue((i + h + i) / 2 - (h / (2 * Math.Sqrt(3)))) + getValue((i + h + i) / 2 + (h / (2 * Math.Sqrt(3))))); return res; } /// <summary> /// Метод 3/8 /// </summary> /// <param name="h">Шаг</param> /// <param name="a">Левая Граница</param> /// <param name="b">Правая Граница</param> /// <returns></returns> public static double TriWosmyh(double h, double a, double b) { double res = 0; double V = h / 3; for (double i = a; i <= b; i += h) res += ((getValue(i)) + 3 * getValue(i + V) + 3 * getValue(i + 2 * V)) + getValue(i + h); res = res * 3 * V / 8; return res; } /// <summary> /// Метод Уэддля /// </summary> /// <param name="h">Шаг</param> /// <param name="a">Левая Граница</param> /// <param name="b">Правая Граница</param> /// <returns></returns> public static double Ueddla(double h, double a, double b) { double res = 0; for (double i = a; i < b; i += h) res += (getValue(i - h) + 5 * getValue(i - h + h / 6) + getValue(i - h + h / 3) + 6 * getValue(i - h + h / 2) + getValue(i - h + 2 * h / 3) + 5 * getValue(i - h + 5 * h) + getValue(i)) * h; return res / 20; } } } Таблица Таблица результатов составлена для функции: f: y=sin(x) y1=0,459701 y2=1,416142 y3=1,53029 Метод 3/8 Гаусса Уэддля Левая граница 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,459697 1,416146 1,530435 0,459697 1,416146 1,530435 0,459956 1,416244 1,530403 Абсолютная точность 0,000004 0,004562 -0,000145 -0,000779 -0,000004 -0,000145 -0,000255 -0,000102 -0,000113 Вывод: При данных условиях самым точным на небольшом отрезке оказался удобен метод 3/8 , но на большем отрезке дал большую погрешность чем метод Уэддля.