ЧислМетодЛаб3
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Факультет безопасности (ФБ)
Кафедра безопасности информационных систем (БИС)
ИНТЕРПОЛЯЦИЯ И АППРОКСИМАЦИЯ ФУНКЦИИ Отчѐт по лабораторной работе 3
по дисциплине «Численные методы»
Студент гр.731-2
__________ Батаев А.С. 02.11.2022
Руководитель:
Доцент кафедры КИБЭВС
__________ __________ Якимук А.Ю. 02.11.2022
Томск 2022
Оглавление
1 |
Введение ............................................................................................................. |
3 |
|
2 |
Ход работы......................................................................................................... |
4 |
|
|
2.1 |
Вычисление точек......................................................................................... |
4 |
|
2.2 |
Вычисление полинома Лагранжа................................................................. |
4 |
|
2.3 |
Метод наименьших квадратов ..................................................................... |
5 |
3 |
Заключение ........................................................................................................ |
7 |
1 Введение
Цель работы: получить навыки вычисления интерполяционного
полинома Лагранжа и аппроксимирующей функции.
2 Ход работы
2.1 Вычисление точек
Необходимо вычислить 14 точек с координатами (xi , yi). Индивидуальная функция имеет вид: y = ln(16, 94x^2)
2.2 Вычисление полинома Лагранжа
Листинг программы представлен в Приложении А.
Рисунок 1 – Работа программы
Корректность вычислений программы проверяется с помощью
совпадения вычислений в узлах полинома и истинными точками.
2.3Метод наименьших квадратов
Спомощью метода наименьших квадратов рассчитать параметры функции f(x) = ax2 + bx + c, аппроксимирующей функцию f(x).
Рисунок 2 – Работа программы
Графики функций:
Рисунок 3 – Графики
2.4 Таблица результатов
Таблица 1 – Значения корней
̅ |
|
|
̅ |
|
|
|
|
|
-2,2178 |
-2,2178 |
-2,2218 |
|
|
|
|
|
-1,741 |
-1,741 |
-1,4581 |
|
|
|
|
|
1,9986 |
1,9986 |
-41,6125 |
|
|
|
|
|
5,7282 |
5,7282 |
-2710,7155 |
|
|
|
|
3Заключение
Входе выполнения данной лабораторной работы были получены навыки вычисления интерполяционного полинома Лагранжа и аппроксимирующей функции.
Приложение A
(Обязательное)
Код приложения
namespace chm4
{
class Program
{
static void LeastSquares(double[] aX, double[] aFunc)
{
double[] A1 = new double[3] { 0, 0, 0 }; double[] A2 = new double[3] { 0, 0, 0 }; double[] A3 = new double[3] { 0, 0, 0 }; double[] B = new double[3] { 0, 0, 0 }; for (int i = 0; i < 14; i++)
{
int n = 0;
for (int j = 2; j >= 0; j--)
{
A1[n] = A1[n] + Math.Pow(aX[i], 2) * Math.Pow(aX[i], j); A2[n] = A2[n] + Math.Pow(aX[i], 1) * Math.Pow(aX[i], j); A3[n] = A3[n] + Math.Pow(aX[i], j);
B[n] = B[n] + aFunc[i] * Math.Pow(aX[i], j); n++;
}
}
double[] FirstLine = new double[3] { 0, 0, 0 }; double[] SecondLine = new double[3] { 0, 0, 0 }; double[] ThirdLine = new double[3] { 0, 0, 0 }; double[] FourthLine = new double[3] { 0, 0, 0 }; for (int k = 0; k < 3; k++)
{
FirstLine[k] = 2 * A1[k];
SecondLine[k] = 2 * A2[k];
ThirdLine[k] = 2 * A3[k];
FourthLine[k] = 2 * B[k];
}
Console.Write($"{Math.Round(FirstLine[0], 4)}\t"); for (int i = 1; i < 3; i++)
{
Console.Write($"{Math.Round(FirstLine[i], 4)}\t");
}
Console.WriteLine();
for (int i = 0; i < 3; i++)
{
Console.Write($"{Math.Round(SecondLine[i], 4)}\t");
}
Console.WriteLine();
for (int i = 0; i < 3; i++)
{
Console.Write($"{Math.Round(ThirdLine[i], 4)}\t");
}
Console.WriteLine("\n"); Console.WriteLine("Free members : "); for (int i = 0; i < 3; i++)
{
Console.Write($"{Math.Round(FourthLine[i], 4)}\t");
}
Console.WriteLine();
}
static double[] Function(double[] x)
{
double[] IndividualFunction = new double[15];
9
for (int i = 1; i < 15; i++)
{
IndividualFunction[i] = Math.Log(16.94 * x[i] * x[i]); Console.WriteLine($"F(x{i + 1}) = {Math.Round(IndividualFunction[i], 4)}");
}
Console.WriteLine("\n"); return IndividualFunction;
}
static double LagrangePolynomial(double[] aX, double[] aFunc)
{
Console.Write("x value: ");
double x = double.Parse(Console.ReadLine()); Console.Write("Node number ");
int z = int.Parse(Console.ReadLine()); double Lag, Func, App;
if ((z == 1) || (z == 14))
{
Lag = aFunc[z - 1]; Func = aFunc[z - 1];
App = -161.125 * aX[z - 1] * aX[z - 1] + 51.3175 * aX[z - 1] - 5.296; Console.WriteLine($"Lagrange Polynomial = {Math.Round(Lag, 4)}"); Console.WriteLine($"Function ({z}) = {Math.Round(Func, 4)}"); Console.WriteLine($"Approximation ({z}) = {Math.Round(App, 4)}");
}
else
{
double s1 = ((x - aX[z - 1]) * (x - aX[z])) / ((aX[z - 2] - aX[z - 1]) * (aX[z - 2] - aX[z])) * aFunc[z - 2];
double s2 = ((x - aX[z - 2]) * (x - aX[z])) / ((aX[z - 1] - aX[z - 2]) * (aX[z - 1] - aX[z])) * aFunc[z - 1];
double s3 = ((x - aX[z - 2]) * (x - aX[z - 1])) / ((aX[z] - aX[z - 2]) * (aX[z] - aX[z - 1])) * aFunc[z];
Lag = s1 + s2 + s3; Func = aFunc[z - 1];
App = -161.125 * aX[z - 1] * aX[z - 1] + 51.3175 * aX[z - 1] - 5.296; Console.WriteLine($"Lagrange Polynomial = {Math.Round(Lag, 4)}"); Console.WriteLine($"Function ({z}) = {Math.Round(Func, 4)}"); Console.WriteLine($"Approximation ({z}) = {Math.Round(App, 4)}");
}
Console.WriteLine("\n"); return Lag;
}
static void Main(string[] args)
{
double[] first = Unknown(); double[] second = Function(first);
Console.WriteLine("Matrix coefficients :"); LeastSquares(first, second); Console.WriteLine();
Enter:
LagrangePolynomial(first, second); goto Enter;
}
static double[] Unknown()
{
double[] NumberX = new double[15]; for (int i = 0; i < 15; i++)
{
NumberX[i] = 0.02 * i;
Console.WriteLine($"x({i + 1}) = {NumberX[i]}");
}
Console.WriteLine("\n");
10
return NumberX;
}
}
}