
Заключение
В ходе работы были освоены вычислительные методы для нахождения определённого интеграла и исследована их точность при разном числе разбиений, что позволило оценить влияние шага на точность вычислений. Были изучены и сравнены методы численного дифференцирования, выявлены их преимущества и недостатки. Также были рассмотрены методы группы Рунге-Кутта для решения дифференциального уравнения первого порядка, где метод 4-го порядка показал наибольшую точность
Приложение а
(обязательное)
Код для задания 1
using System;
class Program
{
static void Main(string[] args)
{
double a = 4;
double b = 5;
int[] partitions = { 6, 40, 120, 400 };
foreach (var n in partitions)
{
double h = (b - a) / n;
double[] xValues = new double[n + 1];
double[] fValues = new double[n + 1];
for (int i = 0; i <= n; i++)
{
xValues[i] = a + i * h;
fValues[i] = Function(xValues[i]);
}
double leftRectangleResult = LeftRectangleMethod(fValues, n, h);
double rightRectangleResult = RightRectangleMethod(fValues, n, h);
double trapezoidResult = TrapezoidMethod(fValues, n, h);
double simpsonResult = SimpsonMethod(fValues, n, h);
Console.WriteLine($"Разбиения: {n}");
Console.WriteLine($"Левые прямоугольники{Math.Round(leftRectangleResult,2)}");
Console.WriteLine($"Правые прямоугольники: {Math.Round(rightRectangleResult,2)}");
Console.WriteLine($"Трапеции: {Math.Round(trapezoidResult,2)}");
Console.WriteLine($"Симпсон: {Math.Round(simpsonResult,2)}");
Console.WriteLine();
}
}
static double Function(double x)
{
return Math.Exp(0.84 * x) * Math.Sin(0.15 * x);
}
static double LeftRectangleMethod(double[] fValues, int n, double h)
{
double sum = 0.0;
for (int i = 0; i < n; i++)
{
sum += fValues[i];
}
return sum * h;
}
static double RightRectangleMethod(double[] fValues, int n, double h)
{
double sum = 0.0;
for (int i = 1; i <= n; i++)
{
sum += fValues[i];
}
return sum * h;
}
static double TrapezoidMethod(double[] fValues, int n, double h)
{
double sum = (fValues[0] + fValues[n]) / 2.0;
for (int i = 1; i < n; i++)
{
sum += fValues[i];
}
return sum * h;
}
static double SimpsonMethod(double[] fValues, int n, double h)
{
if (n % 2 != 0) n++;
double sum = fValues[0] + fValues[n];
for (int i = 1; i < n; i++)
{
if (i % 2 == 0)
sum += 2 * fValues[i];
else
sum += 4 * fValues[i];
}
return sum * (h / 3);
}
}
Приложение б
Код для задания 2
using System;
class Program
{
static void Main(string[] args)
{
double x = 2.0;
double h = 0.1;
double leftDerivative = LeftDifference(f, x, h);
double rightDerivative = RightDifference(f, x, h);
double centralDerivative = CentralDifference(f, x, h);
Console.WriteLine($"Левая разностная производная: {Math.Round(leftDerivative,2)}");
Console.WriteLine($"Правая разностная производная: {Math.Round(rightDerivative, 2)}");
Console.WriteLine($"Центральная разностная производная: {Math.Round(centralDerivative, 2)}");
}
static double f(double x)
{
return Math.Pow(x, 3) - Math.Sqrt(x + 2);
}
static double LeftDifference(Func<double, double> func, double x, double h)
{
return (func(x) - func(x - h)) / h;
}
static double RightDifference(Func<double, double> func, double x, double h)
{
return (func(x + h) - func(x)) / h;
}
static double CentralDifference(Func<double, double> func, double x, double h)
{
return (func(x + h) - func(x - h)) / (2 * h);
}
}