metody_vychisleniy_3lab_1vx

advertisement
Министерство образования науки РФ.
Высшего профессионального учреждения
Тверского государственный технический университет.
Кафедра программного обеспечения.
Методы вычислений
Лабораторная работа №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 , но на большем отрезке дал большую погрешность чем метод Уэддля.
Download