Вычисление определенного интеграла методом прямоугольников.
Задание: Вычислить определенный интеграл с заданной точностью по методу прямоугольников. Проверить правильность результата, вычисляя тот же интеграл с использованием первообразной функции по формуле Ньютона-Лейбница.
Теоретическое введение:
Метод
прямоугольников — метод численного
интегрирования функции одной переменной,
заключающийся в замене подынтегральной
функции на многочлен нулевой степени,
то есть константу, на каждом элементарном
отрезке. Если рассмотреть график
подынтегральной функции, то метод будет
заключаться в приближённом вычислении
площади под графиком суммированием
площадей конечного числа прямоугольников,
ширина которых будет определяться
расстоянием между соответствующими
соседними узлами интегрирования, а
высота — значением подынтегральной
функции в этих узлах. Формула нахождения
интеграла методом средних прямоугольников:
,
где x1
и x2
– концы элементарного отрезка (см
рис.2).
Формула
Ньютона-Лейбница:
Текст программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
//Преобразуем функцию в переменную типа делегат, для получения к ней доступа другими методами//
delegate double fx(double i);
static double f1(double x)
{
return (Math.Sin(1 / x) / (x * x));
}
//Создаем метод, вычисляющий интеграл методом прямоугольников //
static double rectangle(fx f, double a, double b, double n)
{
double s = 0, h;
while (a < b)
{
h = (f(a) + f(a + n)) / 2;
s = s + h * n;
a = a + n;
}
return s;
}
// Создаем метод вычисляющий интеграл методом Ньютона//
static double newton(double a, double b)
{
a = Math.Cos(1 / a) - Math.Cos(1);
b = Math.Cos(1 / b) - Math.Cos(1);
double d = b - a;
return (d);
}
static void Main(string[] args)
{
//Вызываем метод rectangle и вводим значения пределов интегрирования a,b и шаг n//
double s = rectangle(f1, 1, 2.5, 0.1);
//Вызываем метод newton и вводим значения пределов интегрирования//
double d = newton(1, 2.5);
Console.WriteLine("Рассчет интеграла методом прямоугольников S=" + "{0,6:f3}", s);
Console.WriteLine("Рассчет интеграла методом Ньютона - Лейбница S=" + "{0,6:f3}", d);
Console.ReadKey();
}
}
}
Результат:
Вывод: Данная программа позволяет рассчитывать интегралы с точностью до тысячных (расхождения в результатах по методу прямоугольников и методу Ньютона - Лейбница).
Интерполирование функции методом линейной интерполяции.
Задание: Используя линейную интерполяцию, найти значение функции в любой точке,
заключенной между минимальным и максимальным значениями аргумента и не
совпадающей с табличным значением. Самостоятельно задать для проверки 2-3 контроль-
ные точки.
Таблица 1. Начальные данные.
Х |
927 |
1077 |
1227 |
1377 |
1527 |
1677 |
1827 |
1977 |
2120 |
2125 |
2127 |
У |
3 |
4 |
5 |
23 |
40 |
39 |
38 |
29 |
20,5 |
20 |
20 |
Теоретическое введение:
Простейшим и часто используемым видом локальной интерполяции является линейная интерполяция. Она состоит в том, что заданные точки М(xi, yi) (i = 0, 1, ..., n) соединяются прямолинейными отрезками, и функция f(x) приближается к ломаной с вершинами в данных точках
Уравнения каждого отрезка ломаной линии в общем случае разные. Поскольку имеется n интервалов (xi , xi + 1), то для каждого из них в качестве уравнения интерполяционного полинома используется уравнение прямой, проходящей через две точки. В частности, для i - го интервала можно написать уравнение прямой, проходящей через точки (xi , yi) и (xi + 1, yi + 1), в виде:
Отсюда
Следовательно, при использовании линейной интерполяции сначала нужно определить интервал, в который попадает значение аргумента x, а затем подставить его в формулу и найти приближенное значение функций в этой точке.
Текст программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
//Создаем метод для нахождения интерполирующей линейной функции между узлами, который так же будет рассчитывать значения функции в заданных точках//
static void asd(double[] x, double[] y, ref double z)
{
double xmax, xmin, ymax, ymin;
for (int i = 0; i < x.Length; i++)
{
if (x[i] > z)
{
xmax = x[i];
xmin = x[i - 1];
ymax = y[i];
ymin = y[i - 1];
double b = ((ymax - ymin) / (xmax - xmin)) * (z - xmax) + ymax;
Console.WriteLine("При х=" + z + " у=" + "{0:#.##}", b); Console.WriteLine();
break;
}
}
}
static void Main(string[] args)
{
//Вводим значения узлов, в массив а - значения х, соответственно, в массив m - значения у//
double[] a = new double[] { 927, 1077, 1227, 1377, 1527, 1677, 1827, 1977, 2120, 2125, 2127 };
double[] m = new double[] { 75, 69, 63, 41, 20, 14, 8, 6, 4.2, 4, 4 };
//Выводим на экран данные узлов//
Console.WriteLine("Исходные данные ");
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine("x=" + a[i] + " " + "y=" + m[i]);
}
Console.WriteLine();
double z = 2;
while (z != 1)
{
Console.WriteLine("Введите значение из отрезка [927;2127] , для выхода введите 0");
// Задаем любую точку не принадлежащую узлу//
z = double.Parse(Console.ReadLine());
if (z == 0)
break;
//Вызываем метод интерполяции, задавая значения массивов x=a, y=m, требуемой точки z//
asd(a, m, ref z);
}
}
}
}
Результат:
Вывод: Данная программа позволяет найти приблизительные значения функции в точках, не заданных таблично, методом линейной интерполяции.
