Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР3 / ЧМ_Л3

.pdf
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
599.53 Кб
Скачать

int 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

Соседние файлы в папке ЛР3