You are on page 1of 11

Київський національний університет імені Тараса Шевченка

Факультет радіофізики, електроніки і комп’ютерних систем

ЗВІТ ДО ЛАБОРАТОРНОЇ РОБОТИ №1


З ПРЕДМЕТУ АЛГОРИТМИ ТА МЕТОДИ ОБЧИСЛЕНЬ

Виконала:
Студентка І групи
І курсу КІ
Прищепа Олександра
Варіант 4.
1. Завдання

Задана таблиця значень функції


в 10-ти вузлових точках:
x 0,91 1,2 2,3 3,5 4,7 5,1 6,8 7,1 7,7 9
f(x) 2,20230 2,53968 2,10793 0,70414 0,36791 0,39621 1,63904 2,07294 2,68631 1,51001
1.Побудувати таблицю значень функції f(x), xє[1,9] з кроком h=0,1:
а) безпосередньо за формулою;
б) застосовуючи кубічну інтерполяцію (через поліномом Лагранжа);
в) за допомогою за допомогою глобальної інтерполяції поліномом
Лагранжа.
2. Застосовуючи лінійну апроксимацію функції f(x) а формули чисельного
диференціювання, побудувати таблиці значень функції та
xє[1,9] з кроком h=0,1. Порівняти з таблицями значень цих функцій,
одержаних безпосереднім диференціюванням.

2. Математичний апарат

 Поліном Лагранжа:

 Права різницева похідна:

 Ліва різницева похідна:

 Центральна різницева похідна:


 Друга похідна:

3. Код програми(c#)
using System;

namespace Interpolation

class Program

public static double Function(double x)

return Math.Exp(Math.Sin(x));

public static double Function1(double x)

return Math.Cos(x) * Math.Exp(Math.Sin(x));

public static double Function2(double x)

return -Math.Exp(Math.Sin(x)) * Math.Sin(x) + Math.Exp(Math.Sin(x)) * Math.Cos(x) * Math.Cos(x);

public static double[] Diapason(double firstpoint, double lastpoint, double step)

int length = (int)((lastpoint - firstpoint) / step);

double[] diapason = new double[length];

for (int i = 0; i < length; i++)

diapason[i] = firstpoint + step * i;

}
return diapason;

public static double Lagrange(double x, double[] arrayX, double[] arrayY)

double logrange = 0;

for (int i = 0; i < arrayX.Length; i++)

double l = 1;

for (int j = 0; j < arrayX.Length; j++)

if (i != j)

l *= ((x - arrayX[j]) / (arrayX[i] - arrayX[j]));

logrange += l * arrayY[i];

return logrange;

public static int Findmin(double x, double[] array)

int min = 0;

for (int i = 0; i < array.Length - 5; i++)

if ((Math.Abs(array[min] - x) + Math.Abs(array[min + 1] - x) + Math.Abs(array[min + 2] - x) +


Math.Abs(array[min + 3] - x) > (Math.Abs(array[i + 1] - x) + Math.Abs(array[i + 2] - x) + Math.Abs(array[i +
3] - x) + Math.Abs(array[i + 4] - x))))

min = i + 1;

return min;

public static double LocalInterpolation(double x, double[] arrayX, double[] arrayY)

int min = Findmin(x, arrayX);


return Lagrange(x, new double[] { arrayX[min], arrayX[min + 1], arrayX[min + 2], arrayX[min + 3] },
new double[] { arrayY[min], arrayY[min + 1], arrayY[min + 2], arrayY[min + 3] });

public static double[] Derivative(double[] arrayY, double step)

int length = arrayY.Length;

double[] derivative = new double[length];

derivative[0] = (arrayY[1] - arrayY[0]) / step;

for (int i = 1; i < length - 1; i++)

derivative[i] = (arrayY[i + 1] - arrayY[i - 1]) / (2 * step);

derivative[length - 1] = (arrayY[length - 1] - arrayY[length - 2]) / step;

return derivative;

static void Main(string[] args)

double[] arrayX = new double[] { 0.91, 1.2, 2.3, 3.5, 4.7, 5.1, 6.8, 7.1, 7.7, 9 };

double[] arrayY = new double[] { 2.20230, 2.53968, 2.10793, 0.70414, 0.36791, 0.39621, 1.63904,
2.07294, 2.68631, 1.51001 };

for (int i = 0; i < arrayX.Length; i++)

Console.Write("X=" + arrayX[i]+ "\t");

Console.WriteLine();

for (int j = 0; j < arrayY.Length; j++)

Console.Write("F(x)=" + arrayY[j]+"\t");

Console.WriteLine("\
n-------------------------------------------------------------------------------------------------------------------------------------
--------------------\n");

double[] xDiapason = Diapason(1, 9, 0.1);

double[] Interpolation = new double[xDiapason.Length];


double[] Interpolation2 = new double[xDiapason.Length];

for (int i = 0; i < xDiapason.Length; i++)

Interpolation[i] = LocalInterpolation(xDiapason[i], arrayX, arrayY);

Interpolation2[i] = Lagrange(xDiapason[i], arrayX, arrayY);

Console.WriteLine($"xi={xDiapason[i]:f2}\t\tyi={Function(xDiapason[i]):f8}\t\
tLocalInterpolation={Interpolation[i]:f8}\t\tGlobalInterpolation={Interpolation2[i]:f8}");

double[] FirstDerivative = Derivative(Interpolation, 0.1);

double[] SecondDerivative = Derivative(FirstDerivative, 0.1);

Console.WriteLine("\
n-------------------------------------------------------------------------------------------------------------------------------------\
n");

for (int i = 0; i < FirstDerivative.Length; i++)

Console.WriteLine($"xi={xDiapason[i]:f2}\t\tF(x)`= {FirstDerivative[i]:f8}\t\
t{Function1(xDiapason[i]):f8}\t\tF(x)``={SecondDerivative[i]:f8}\t\t{Function2(xDiapason[i]):f8}");

Console.ReadKey();

4. Виконання програми
5. Висновок
Протягом лабораторної роботи було вивчено формули полінома Лагранжа,
числового диференціювання першого та другого порядку. Здобуто вміння
апроксимувати функцію, використовуючи глобальну та кускову
інтерполяцію на заданих вузлах. Отримано навички приблизного
знаходження першої та другої похідних функції.

You might also like