cm4
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра безопасности информационных систем (КИБЭВС)
ИНТЕРПОЛЯЦИЯ И АППРОКСИМАЦИЯ ФУНКЦИИ
Отчет по лабораторной работе №4 по дисциплине ¾Численные методы¿
Студент гр. 730-2 Подойницын К.В. 11.11.2021
Доцент каф.КИБЭВС Якимук А.Ю. 11.11.2021
Томск 2021
2
1 Введение
Цель работы: получить навыки вычисления интерполяционного полинома Лагранжа и аппроксимирующей функции.
3
2 Ход работы
2.1 Вычисление точек
Необходимо вычислить 14 точек с координатами (xi; yi).
xi = 0; 2 i
i = 0; 13
yi = f(xi)
f(xi) – индивидуальная функция. Индивидуальная функция имеет вид:
y = ln(10; 54x2 + 2; 9)
4
2.2 Вычисление полинома Лагранжа
Листинг программы представлен в Приложении А.
Рис 1 – Скриншот работы программы
Корректность вычислений программы проверяется с помощью совпадения вычислений в узлах полинома и истинными точками.
5
2.3 Метод наименьших квадратов
С помощью метода наименьших квадратов рассчитать параметры функции f(x) = ax2 + bx + c, аппроксимирующей функцию f(x).
Рис 2 – Скриншот работы программы
Графики функций:
Рис 3 – Графики
6
2.4 Таблица результатов
|
|
|
|
|
f(x) |
L2(x) |
|
|
|
|
|
|
|
|
f(x) |
||||
|
|
x |
|||||||
|
xi |
1,1537 |
1,1537 |
1,1534 |
|||||
|
|
|
|
|
|
||||
x* |
1,1335 |
1,1243 |
1,134 |
||||||
|
|
|
|
|
|
||||
|
|
1 |
1,0647 |
1,0647 |
1,0619 |
||||
|
x |
||||||||
|
|
2 |
1,0662 |
101,1143 |
1,0653 |
||||
|
x |
7
3Заключение
Входе выполнения данной лабораторной работы были получены навыки вычисления интерполяционного полинома Лагранжа
иаппроксимирующей функции.
8
Приложение А
(обязательное)
using System; namespace laba4_cm
{
class Program
{
static void Main(string[] args)
{
double[] perviy = X(); double[] vtoroy = Fn(perviy);
Console.WriteLine("Коэффициенты матрицы:"); NK(perviy, vtoroy);
Console.WriteLine();
Enter:
Lag(perviy, vtoroy); goto Enter;
}
static double[] X()
{
double[] x = new double[14]; for (int i = 0; i < 14; i++)
{
x[i] = 0.02 * i;
Console.WriteLine($"x{i + 1} = {x[i]}");
}
Console.WriteLine("\n"); return x;
}
static double[] Fn(double[] x)
{
9
double[] f = new double[14]; for (int i = 0; i < 14; i++)
{
f[i] = Math.Log(10.54 * x[i] * x[i] + 2.9, Math.Exp(1) Console.WriteLine($"F(x{i + 1}) = {Math.Round(f[i], 4)
}
Console.WriteLine("\n"); return f;
}
static double Lag(double[] aX, double[] aFunc)
{
Console.Write("Введите одно из значений x: "); double x = double.Parse(Console.ReadLine()); Console.Write("Введите номер узла: ");
int z = int.Parse(Console.ReadLine());
double L, f, a;
if ((z == 1) || (z == 14))
{
L = aFunc[z - 1]; f = aFunc[z - 1];
a = 2.8675 * aX[z - 1] * aX[z - 1] + 0.1133 * aX[z - 1 Console.WriteLine($"L = {Math.Round(L, 4)}"); Console.WriteLine($"F{z} = {Math.Round(f, 4)}"); Console.WriteLine($"f{z} = {Math.Round(a, 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])) *
10
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];
L = s1 + s2 + s3; f = aFunc[z - 1];
a = 2.8675 * aX[z - 1] * aX[z - 1] + 0.1133 * aX[z - 1] + 1.0619;
Console.WriteLine($"L = {Math.Round(L, 4)}"); Console.WriteLine($"F{z} = {Math.Round(f, 4)}"); Console.WriteLine($"f{z} = {Math.Round(a, 4)}");
}
Console.WriteLine("\n"); return L;
}
static void NK(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);