- •Семестровая работа по численным методам на тему:
- •Вариант №13.
- •Постановка задачи.
- •1. Составная квадратурная формула трапеций:
- •2. Формула Гаусса:
- •3. Формула Симпсона:
- •IntegralHelper.Cs – вычисляет интеграл заданной функции по заданному алгоритму
- •InterpolationPolynom.Cs – класс, реализующий вычисление интерполяционного полинома.
- •InverseFunctionHelper.Cs – класс, реализующий вычисление обратной функции.
IntegralHelper.Cs – вычисляет интеграл заданной функции по заданному алгоритму
using System;
using NumericAnalysis.FunctionHelpers;
namespace NumericAnalysis.Integral {
public class IntegralHelper {
public double Calc(SumAlgorithm sumAlgorithm, double c, double d, Calc phi, double precision, out int N) {
const double EPSILON = 0.000001;
Func<double, double> f = (x) => phi(x, EPSILON);
N = 2;
double result = 0;
AbstractSumAlgorithm sumAlgorithmMethod = SumAlgorithmFactory.GetSumAlgorithm(sumAlgorithm);
while (Math.Abs(sumAlgorithmMethod.S(c, d, f, N) - (result = sumAlgorithmMethod.S(c, d, f, 2*N))) > precision) {
N *= 2;
}
return result;
}
}
}
SumAlgorithm.cs SumAlgorithm – перечисление, определяющее доступные реализации вычисления суммы для алгоритма интегрирования
namespace NumericAnalysis.Integral {
public enum SumAlgorithm {
Trapezoidal,
Simpson,
Gauss,
Rectangle
}
}
SumAlgoruthmFactory.cs Возвращает реализации алгоритма суммирования по их типу.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NumericAnalysis.Integral {
public static class SumAlgorithmFactory {
private static Dictionary<SumAlgorithm, AbstractSumAlgorithm> algorithms;
static SumAlgorithmFactory() {
algorithms = new Dictionary<SumAlgorithm, AbstractSumAlgorithm>();
algorithms.Add(SumAlgorithm.Rectangle, new Rectangle());
algorithms.Add(SumAlgorithm.Trapezoidal, new Trapezoidal());
algorithms.Add(SumAlgorithm.Gauss, new Gauss());
algorithms.Add(SumAlgorithm.Simpson, new Simpson());
}
public static AbstractSumAlgorithm GetSumAlgorithm(SumAlgorithm sumAlgorithm) {
return algorithms[sumAlgorithm];
}
class Trapezoidal : AbstractSumAlgorithm {
public override double S(double c, double d, Func<double, double> f, int N) {
double result = 0;
double hN = (d - c) / N;
for (int i = 0; i < N; i++) {
double zI = c + i * hN;
double zInext = c + (i + 1) * hN;
double Si = hN * (f(zI) + f(zInext)) / 2;
result += Si;
}
return result;
}
}
class Simpson : AbstractSumAlgorithm {
#region Overrides of AbstractSumAlgorithm
public override double S(double c, double d, Func<double, double> f, int N) {
double result = 0;
double hN = (d - c)/N;
for(int i = 0; i< N; i++) {
double zI = c + i*hN;
double zInext = zI + hN;
double Si = (zInext - zI)/6*(f(zI) + 4*f((zI + zInext)/2) + f(zInext));
result += Si;
}
return result;
}
#endregion
}
class Gauss : AbstractSumAlgorithm {
public override double S(double c, double d, Func<double, double> f, int N) {
double result = 0;
double hN = (d - c)/N;
double SQRT_3 = Math.Sqrt(3);
for(int i = 0; i < N; i++) {
double a = c + i*hN;
double b = a + hN;
double Si = (b - a)/2*(f((a + b)/2 - (b - a)/(2*SQRT_3)) + f((a + b)/2 + (b - a)/(2*SQRT_3)));
result += Si;
}
return result;
}
}
class Rectangle : AbstractSumAlgorithm {
#region Overrides of AbstractSumAlgorithm
public override double S(double c, double d, Func<double, double> f, int N) {
double result = 0;
double hN = (d - c) / N;
for (int i = 0; i < N; i++) {
double a = c + i * hN;
double Si = f(a);
result += Si;
}
result = result*hN;
return result ;
}
#endregion
}
}
}