static class CollocationMethod public static double eps 0001 точность

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
static class CollocationMethod
{
public static double eps = 0.0001; //точность
// Получение коэффициентов сигма и гамма для построения функции Phi0(x)
public static Matrix GetCoeff(KeyValuePair<double, double> alpha, KeyValuePair<double, double> beta, double a, double b, double A, double B)
{
Matrix lMatrix = new Matrix(new double[,] {{alpha.Key, alpha.Key * a + alpha.Value},
{beta.Key, beta.Key * b + beta.Value}}),
rMatrix = new Matrix(new double[,] {{A},
{B}}),
retValue = Matrix.GetSolve(lMatrix, rMatrix, eps);
return retValue;
}
// Получение значения функции Phi0(x)
public static double GetPhiZero(double sigma, double gamma, double x)
{
double retValue = sigma + gamma * x;
return retValue;
}
// Получение коэффициентов гамма
public static double GetGammaI(int i, KeyValuePair<double, double> beta, double a, double b)
{
double retValue = (-1.0 * (beta.Key * Math.Pow(b - a, 2) + (i + 2) * beta.Value * (b - a))) / (beta.Key * (b - a) + (i + 1) * beta.Value);
return retValue;
}
// Получение значения функции Phii(x)
public static double GetPhiI(int i, double gammaI, double a, double x)
{
double retValue = gammaI * Math.Pow(x - a, i + 1) + Math.Pow(x - a, i + 2);
return retValue;
}
// Приближенное вычисление первой производной функции в точке
public static double GetFirstDerivative(int i, double gammaI, double a, double x)
{
double retValue = (GetPhiI(i, gammaI, a, x + eps) - GetPhiI(i, gammaI, a, x - eps)) / (2.0 * eps);
return retValue;
}
// Приближенное вычисление первой производной функции в точке
public static double GetFirstDerivative(double sigma, double gamma, double x)
{
double retValue = (GetPhiZero(sigma, gamma, x + eps) - GetPhiZero(sigma, gamma, x - eps)) / (2.0 * eps);
return retValue;
}
// Приближенное вычисление второй производной функции в точке
public static double GetSecondDerivative(int i, double gammaI, double a, double x)
{
double retValue = (1.0 / Math.Pow(eps, 2)) * (GetPhiI(i, gammaI, a, x + eps) - 2.0 * GetPhiI(i, gammaI, a, x) + GetPhiI(i, gammaI, a, x - eps));
return retValue;
}
// Приближенное вычисление второй производной функции в точке
public static double GetSecondDerivative(double sigma, double gamma, double x)
{
double retValue = (1.0 / Math.Pow(eps, 2)) * (GetPhiZero(sigma, gamma, x + eps) - 2.0 * GetPhiZero(sigma, gamma, x) + GetPhiZero(sigma, gamma, x - eps));
return retValue;
}
// Получение коэффициентов ci
public static Matrix GetCI(List<double> xValue, double a, double b, KeyValuePair<double, double> beta, double sigma, double gamma)
{
int size = xValue.Count;
Matrix rMatrix = new Matrix(size, 1),
lMatrix = new Matrix(size, size);
double gammaI = 0.0,
p = -2.0,
q = 2.0;
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
{
gammaI = GetGammaI(j + 1, beta, a, b);
lMatrix[i, j] = GetSecondDerivative(j + 1, gammaI, a, xValue[i]) +
p * GetFirstDerivative(j + 1, gammaI, a, xValue[i]) +
q * GetPhiI(j + 1, gammaI, a, xValue[i]);
rMatrix[i, 0] = 4*Math.Pow(xValue[i], 5) - xValue[i] -
GetSecondDerivative(sigma, gamma, xValue[i]) -
p * GetFirstDerivative(sigma, gamma, xValue[i]) -
q * GetPhiZero(sigma, gamma, xValue[i]);
}
Matrix retValue = Matrix.GetSolve(lMatrix, rMatrix, eps);
return retValue;
}
// Получение численного решения в точке x
public static double GetY(KeyValuePair<double, double> beta, double a, double b, double x, double sigma, double gamma, List<double> xValue)
{
double retValue = GetPhiZero(sigma, gamma, x);
Matrix cI = GetCI(xValue, a, b, beta, sigma, gamma);
double gammaI = 0.0,
curPhi = 0.0;
for (int i = 1; i <= xValue.Count; ++i)
{
gammaI = GetGammaI(i, beta, a, b);
curPhi = GetPhiI(i, gammaI, a, x);
retValue += cI[i - 1, 0] * curPhi;
}
return retValue;
}
}