
ЛР3 / ЧМ_Л3
.pdfint n = xValues.Length;
double x0 = xValues[n - 3], x1 = xValues[n - 2], x2 = xValues[n - 1]; double y0 = yValues[n - 3], y1 = yValues[n - 2], y2 = yValues[n - 1];
result = ((x - x1) * (x - x2) * y0) / ((x0 - x1) * (x0 - x2)) + ((x - x0) * (x - x2) * y1) / ((x1 - x0) * (x1 - x2)) + ((x - x0) * (x - x1) * y2) / ((x2 - x0) * (x2 - x1));
}
else
{
for (int i = 0; i < xValues.Length - 2; i++)
{
if (x >= xValues[i] && x <= xValues[i + 2])
{
double x0 = xValues[i], x1 = xValues[i + 1], x2 = xValues[i + 2]; double y0 = yValues[i], y1 = yValues[i + 1], y2 = yValues[i + 2];
result = ((x - x1) * (x - x2) * y0) / ((x0 - x1) * (x0 - x2)) + ((x - x0) * (x - x2) * y1) / ((x1 - x0) * (x1 - x2)) + ((x - x0) * (x - x1) * y2) / ((x2 - x0) * (x2 - x1));
break;
}
}
}
return result;
}
21
public double[] LeastSquares(double[] yValues)
{
int n = xValues.Length; double sumX = xValues.Sum();
double sumX2 = xValues.Sum(x => x * x); double sumX3 = xValues.Sum(x => x * x * x); double sumX4 = xValues.Sum(x => x * x * x * x); double sumY = yValues.Sum();
double sumXY = xValues.Zip(yValues, (x, y) => x * y).Sum(); double sumX2Y = xValues.Zip(yValues, (x, y) => x * x * y).Sum();
double[,] A = {
{sumX4, sumX3, sumX2 },
{sumX3, sumX2, sumX },
{sumX2, sumX, n }
};
double[] B = { sumX2Y, sumXY, sumY };
return SolveLinearSystem(A, B);
}
private double[] SolveLinearSystem(double[,] A, double[] B)
{
int n = B.Length;
double[] result = new double[n];
22
double[,] matrix = new double[n, n + 1];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
matrix[i, j] = A[i, j];
}
matrix[i, n] = B[i];
}
for (int i = 0; i < n; i++)
{
double maxElement = matrix[i, i]; int maxRow = i;
for (int k = i + 1; k < n; k++)
{
if (Math.Abs(matrix[k, i]) > maxElement)
{
maxElement = matrix[k, i]; maxRow = k;
}
}
for (int k = i; k < n + 1; k++)
{
double tmp = matrix[maxRow, k];
23
matrix[maxRow, k] = matrix[i, k]; matrix[i, k] = tmp;
}
for (int k = i + 1; k < n; k++)
{
double factor = matrix[k, i] / matrix[i, i]; for (int j = i; j < n + 1; j++)
{
matrix[k, j] -= factor * matrix[i, j];
}
}
}
for (int i = n - 1; i >= 0; i--)
{
result[i] = matrix[i, n] / matrix[i, i]; for (int k = i - 1; k >= 0; k--)
{
matrix[k, n] -= matrix[k, i] * result[i];
}
}
return result;
}
public static void Main()
{
24
var interp = new LagrangeApproximation();
for (int idx = 1; idx <= 3; idx++)
{
double[] yValues = idx == 1 ? interp.y1Values : (idx == 2 ? interp.y2Values : interp.y3Values);
Console.WriteLine($"\nРассчитываем для функции y{idx}:");
Console.Write($"Введите значение x для интерполяции функции y{idx}:
");
double xInterp = double.Parse(Console.ReadLine());
double lagrangeValue = Math.Round(interp.LagrangeInterpolate(xInterp, yValues), 4);
Console.WriteLine($"Значение интерполяции Лагранжа для x = {xInterp} и функции y{idx} равно {lagrangeValue}");
double[] coefficients = interp.LeastSquares(yValues);
Console.WriteLine($"Аппроксимация f(x) для y{idx} = {coefficients[0]:F4} x^2 + {coefficients[1]:F4}x + {coefficients[2]:F4}");
Console.Write($"Введите значение x для аппроксимации функции y{idx}:
");
double xApprox = double.Parse(Console.ReadLine());
double fXApprox = Math.Round(coefficients[0] * xApprox * xApprox + coefficients[1] * xApprox + coefficients[2], 4);
Console.WriteLine($"Значение аппроксимирующей функции f({xApprox}) для y{idx} = {fXApprox}");
}
}
25
}
26