metody_vychisleniy_2lab_1vx

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