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
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 = -4.0,
q = 3.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] = Math.Pow(Math.E, -2.0 * 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;
}
}