Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
moy_chm_Avtosokhranennyy (1) до правки.doc
Скачиваний:
39
Добавлен:
02.09.2019
Размер:
953.86 Кб
Скачать

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

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]