public StructForMainSolution MainSolution(int n, double x0, double xn, double ksi) { StructForMainSolution structForMain = new StructForMainSolution(); structForMain.chart_pointV = new ChartPoint(); structForMain.chart_pointV.x = new List <double>(); structForMain.chart_pointV.Vx = new List <double>(); structForMain.chart_pointV2 = new ChartPoint(); structForMain.chart_pointV2.x = new List <double>(); structForMain.chart_pointV2.Vx = new List <double>(); double[] k = new double[n + 1]; double[] k2 = new double[2 * n + 1]; double[] f = new double[n]; double[] f2 = new double[2 * n + 1]; double[] q = new double[n]; double[] q2 = new double[2 * n + 1]; double[] diagonal1 = new double[n - 1]; double[] diagonal1_2 = new double[2 * n - 1]; double[] diagonal2 = new double[n]; double[] diagonal2_2 = new double[2 * n]; double[] diagonal3 = new double[n - 1]; double[] diagonal3_2 = new double[2 * n - 1]; double[] right_column = new double[n]; double[] right_column2 = new double[2 * n]; double h = (xn - x0) / n; double h2 = h / 2; MyFunctions myFunc = new MyFunctions(); for (int i = 0; i < n + 1; ++i) { structForMain.chart_pointV.x.Add(i * h); } for (int i = 0; i < 2 * n + 1; ++i) { structForMain.chart_pointV2.x.Add(i * h2); } for (int i = 1; i < n; ++i) { if (ksi >= (structForMain.chart_pointV.x[i] + 0.5 * h)) { f[i] = myFunc.f1(structForMain.chart_pointV.x[i]); q[i] = myFunc.q1(structForMain.chart_pointV.x[i]); } else if (ksi <= (structForMain.chart_pointV.x[i] - 0.5 * h)) { f[i] = myFunc.f2(structForMain.chart_pointV.x[i]); q[i] = myFunc.q2(structForMain.chart_pointV.x[i]); } else { f[i] = n * ((ksi - (structForMain.chart_pointV.x[i] - 0.5 * h)) * myFunc.f1(0.5 * ((structForMain.chart_pointV.x[i] - 0.5 * h) + ksi)) + ((structForMain.chart_pointV.x[i] + 0.5 * h) - ksi) * myFunc.f2(0.5 * (ksi + (structForMain.chart_pointV.x[i] + 0.5 * h)))); q[i] = n * ((ksi - (structForMain.chart_pointV.x[i] - 0.5 * h)) * myFunc.q1(0.5 * (ksi + (structForMain.chart_pointV.x[i] - 0.5 * h))) + ((structForMain.chart_pointV.x[i] + 0.5 * h) - ksi) * myFunc.q2(0.5 * ((structForMain.chart_pointV.x[i] + 0.5 * h) + ksi))); } if (ksi >= structForMain.chart_pointV.x[i]) { k[i] = 2 * myFunc.k1(structForMain.chart_pointV.x[i]) * myFunc.k1(structForMain.chart_pointV.x[i - 1]) / (myFunc.k1(structForMain.chart_pointV.x[i - 1]) + myFunc.k1(structForMain.chart_pointV.x[i])); } else if (ksi <= structForMain.chart_pointV.x[i - 1]) { k[i] = 2 * myFunc.k2(structForMain.chart_pointV.x[i - 1]) * myFunc.k2(structForMain.chart_pointV.x[i]) / (myFunc.k2(structForMain.chart_pointV.x[i - 1]) + myFunc.k2(structForMain.chart_pointV.x[i])); } else { k[i] = 2 * h * myFunc.k1(structForMain.chart_pointV.x[i - 1]) * myFunc.k1(ksi) * myFunc.k2(ksi) * myFunc.k2(structForMain.chart_pointV.x[i]) / ((ksi - structForMain.chart_pointV.x[i - 1]) * (myFunc.k1(ksi) + myFunc.k1(structForMain.chart_pointV.x[i - 1])) * myFunc.k2(ksi) * myFunc.k2(structForMain.chart_pointV.x[i]) + (structForMain.chart_pointV.x[i] - ksi) * (myFunc.k2(structForMain.chart_pointV.x[i]) + myFunc.k2(ksi)) * myFunc.k1(structForMain.chart_pointV.x[i - 1]) * myFunc.k1(ksi)); } } k[n] = 2 * myFunc.k2(structForMain.chart_pointV.x[(int)n]) * myFunc.k2(structForMain.chart_pointV.x[n - 1]) / (myFunc.k2(structForMain.chart_pointV.x[n - 1]) + myFunc.k2(structForMain.chart_pointV.x[(int)n])); structForMain.chart_pointV.Vx.Add(x0); for (int i = 1; i < 2 * n; ++i) { if (ksi >= (structForMain.chart_pointV2.x[i] + 0.5 * h2)) { f2[i] = myFunc.f1(structForMain.chart_pointV2.x[i]); q2[i] = myFunc.q1(structForMain.chart_pointV2.x[i]); } else if (ksi <= (structForMain.chart_pointV2.x[i] - 0.5 * h2)) { f2[i] = myFunc.f2(structForMain.chart_pointV2.x[i]); q2[i] = myFunc.q2(structForMain.chart_pointV2.x[i]); } else { f2[i] = 2 * n * ((ksi - (structForMain.chart_pointV2.x[i] - 0.5 * h2)) * myFunc.f1(0.5 * ((structForMain.chart_pointV2.x[i] - 0.5 * h2) + ksi)) + ((structForMain.chart_pointV2.x[i] + 0.5 * h2) - ksi) * myFunc.f2(0.5 * (ksi + (structForMain.chart_pointV2.x[i] + 0.5 * h2)))); q2[i] = 2 * n * ((ksi - (structForMain.chart_pointV2.x[i] - 0.5 * h2)) * myFunc.q1(0.5 * (ksi + (structForMain.chart_pointV2.x[i] - 0.5 * h2))) + ((structForMain.chart_pointV2.x[i] + 0.5 * h2) - ksi) * myFunc.q2(0.5 * ((structForMain.chart_pointV2.x[i] + 0.5 * h2) + ksi))); } if (ksi >= structForMain.chart_pointV2.x[i]) { k2[i] = 2 * myFunc.k1(structForMain.chart_pointV2.x[i]) * myFunc.k1(structForMain.chart_pointV2.x[i - 1]) / (myFunc.k1(structForMain.chart_pointV2.x[i - 1]) + myFunc.k1(structForMain.chart_pointV2.x[i])); } else if (ksi <= structForMain.chart_pointV2.x[i - 1]) { k2[i] = 2 * myFunc.k2(structForMain.chart_pointV2.x[i - 1]) * myFunc.k2(structForMain.chart_pointV2.x[i]) / (myFunc.k2(structForMain.chart_pointV2.x[i - 1]) + myFunc.k2(structForMain.chart_pointV2.x[i])); } else { k2[i] = 2 * h2 * myFunc.k1(structForMain.chart_pointV2.x[i - 1]) * myFunc.k1(ksi) * myFunc.k2(ksi) * myFunc.k2(structForMain.chart_pointV2.x[i]) / ((ksi - structForMain.chart_pointV2.x[i - 1]) * (myFunc.k1(ksi) + myFunc.k1(structForMain.chart_pointV2.x[i - 1])) * myFunc.k2(ksi) * myFunc.k2(structForMain.chart_pointV2.x[i]) + (structForMain.chart_pointV2.x[i] - ksi) * (myFunc.k2(structForMain.chart_pointV2.x[i]) + myFunc.k2(ksi)) * myFunc.k1(structForMain.chart_pointV2.x[i - 1]) * myFunc.k1(ksi)); } } k2[2 * n] = 2 * myFunc.k2(structForMain.chart_pointV2.x[2 * n]) * myFunc.k2(structForMain.chart_pointV2.x[2 * n - 1]) / (myFunc.k2(structForMain.chart_pointV2.x[2 * n - 1]) + myFunc.k2(structForMain.chart_pointV2.x[2 * n])); structForMain.chart_pointV2.Vx.Add(x0); for (int i = 1; i < n - 1; ++i) { diagonal1[i] = k[i + 1] * n * n; diagonal2[i] = -(n * n * (k[i] + k[i + 1]) + q[i]); diagonal3[i] = k[i + 1] * n * n; } diagonal2[(int)n - 1] = -(n * n * (k[n - 1] + k[n]) + q[n - 1]); for (int i = 1; i < n; i++) { right_column[i] = -f[i]; } right_column[1] -= x0 * k[1] * n * n; right_column[n - 1] -= xn * k[n] * n * n; double[] solutionForV = Sweep(diagonal1, diagonal2, diagonal3, right_column); for (int i = 1; i < n; ++i) { structForMain.chart_pointV.Vx.Add(solutionForV[i - 1]); } for (int i = 1; i < 2 * n - 1; ++i) { diagonal1_2[i] = k2[i + 1] * n * n * 4; diagonal2_2[i] = -(4 * n * n * (k2[i] + k2[i + 1]) + q2[i]); diagonal3_2[i] = k2[i + 1] * n * n * 4; } diagonal2_2[2 * n - 1] = -(4 * n * n * (k2[2 * n - 1] + k2[2 * n]) + q2[2 * n - 1]); for (int i = 1; i < 2 * n; i++) { right_column2[i] = -f2[i]; } right_column2[1] -= x0 * k2[1] * n * n * 4; right_column2[2 * n - 1] -= xn * k2[2 * n] * n * n * 4; double[] solutionForV2 = Sweep(diagonal1_2, diagonal2_2, diagonal3_2, right_column2); for (int i = 1; i < 2 * n; ++i) { structForMain.chart_pointV2.Vx.Add(solutionForV2[i - 1]); } structForMain.chart_pointV.Vx.Add(xn); structForMain.chart_pointV2.Vx.Add(xn); return(structForMain); }
public ChartPoint SolutionsTest2(int n, double x0, double xn, double ksi) { ChartPoint chart_point = new ChartPoint(); chart_point.x = new List <double>(); chart_point.y = new List <double>(); chart_point.Vx = new List <double>(); double[] k = new double[n + 1]; double[] f = new double[n]; double[] q = new double[n]; double[] diagonal1 = new double[n - 1]; double[] diagonal2 = new double[n]; double[] diagonal3 = new double[n - 1]; double[] right_column = new double[n]; MyFunctions myFunc = new MyFunctions(); double h = (xn - x0) / n; for (int i = 0; i < n + 1; i++) { chart_point.x.Add(i * h); } chart_point.y = GetSolutionTest2(n, h, ksi); for (int i = 1; i < n; ++i) { if (ksi >= (chart_point.x[i]) + 0.5 * h) { f[i] = myFunc.f1(ksi); q[i] = myFunc.q1(ksi); } else if (ksi <= (chart_point.x[i] - 0.5 * h)) { f[i] = myFunc.f2(ksi); q[i] = myFunc.q2(ksi); } else { f[i] = n * ((ksi - (chart_point.x[i] - 0.5 * h)) * myFunc.f1(ksi) + ((chart_point.x[i] + 0.5 * h) - ksi) * myFunc.f2(ksi)); q[i] = n * ((ksi - (chart_point.x[i] - 0.5 * h)) * myFunc.q1(ksi) + ((chart_point.x[i] + 0.5 * h) - ksi) * myFunc.q2(ksi)); } if (ksi >= chart_point.x[i]) { k[i] = myFunc.k1(ksi); } else if (ksi <= (chart_point.x[i - 1])) { k[i] = myFunc.k2(ksi); } else { k[i] = 2 * h * myFunc.k1(ksi) * myFunc.k1(ksi) * myFunc.k2(ksi) * myFunc.k2(ksi) / ((ksi - chart_point.x[i - 1]) * (myFunc.k1(ksi) + myFunc.k1(ksi)) * myFunc.k2(ksi) * myFunc.k2(ksi) + (chart_point.x[i] - ksi) * (myFunc.k2(ksi) + myFunc.k2(ksi)) * myFunc.k1(ksi) * myFunc.k1(ksi)); } } k[(int)n] = myFunc.k2(ksi); chart_point.Vx.Add(x0); for (int i = 1; i < n - 1; ++i) { diagonal1[i] = k[i + 1] * n * n; diagonal2[i] = -(n * n * (k[i] + k[i + 1]) + q[i]); diagonal3[i] = k[i + 1] * n * n; } diagonal2[n - 1] = -(n * n * (k[n - 1] + k[n]) + q[n - 1]); for (int i = 1; i < n; i++) { right_column[i] = -f[i]; } right_column[1] -= x0 * k[1] * n * n; right_column[n - 1] -= xn * k[n] * n * n; double[] sweep_result = Sweep(diagonal1, diagonal2, diagonal3, right_column); for (int i = 0; i < sweep_result.Length; i++) { chart_point.Vx.Add(sweep_result[i]); } chart_point.Vx.Add(xn); return(chart_point); }