Вы находитесь на странице: 1из 13

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
«Белорусский государственный университет информатики и
радиоэлектроники»

Кафедра «Кафедра микропроцессорных систем и сетей»

КОНТРОЛЬНАЯ РАБОТА
по дисциплине «Технология проектирования программного
обеспечения информационных систем»

ВАРИАНТ 9

Выполнил:
студент группы 790441
Манченко Алексей Анатольевич

Минск 2021
2
Задание № 1. Интерполяция

1. Построить интерполяционный многочлен Ньютона по заданным в таблице


точкам. В отчете должны быть также приведены результаты вычисления
разделенных разностей.
2. Построить интерполяционный многочлен Лагранжа по заданным в
таблице точкам.
3. Построить графики интерполяционных многочленов и убедиться, что они
проходят через заданные точки.

x -1 2 5
y 4 3 4

Построим интерполяционный многочлен Ньютона по заданным в таблице


точкам

y1  y0 34 1
f10   
x1  x0 2  (1) 3
1  1
 
f11  f10 3  3  1
f 20   
x2  x0 5  (1) 9
y2  y1 4  3 1
f11   
x2  x1 5  2 3

Запишем формулу для интерполяционного многочлена Ньютона и подставим


туда полученные значения:
 1 1
P ( x)  y0  f10 ( x  x0 )  f 20 ( x  x0 )( x  x1 )  4      x  (1)    x  (1)   x  2  
 3 9
2
x 4 31
  x
9 9 9

Построим интерполяционный полином Лагранжа

( x  x1 )( x  x2 ) ( x  x0 )( x  x2 ) ( x  x0 )( x  x1 )
P ( x )  y0  y1  y2 
( x0  x1 )( x0  x2 ) ( x1  x0 )( x1  x2 ) ( x2  x0 )( x2  x1 )
( x  2)( x  5) ( x  1)( x  5) ( x  1)( x  2) x 2 4 31
 4  3  4   x
( 1  2)( 1  5) (2  1)(2  5) (5  1)(5  2) 9 9 9

3
Построим графики интерполяционных многочленов и убедимся, что они
проходят через заданные точки.

4
Задание № 2. Численное решение нелинейных уравнений f ( x )  0

1. Построить график функции f (x) и определить приблизительное


положение корней.
2. Составить программу на языке Java для решения уравнения (уточнения
корня):
(а) методом деления отрезков пополам. Для нахождения корня следует
должным образом выбрать отрезок, на котором ищется решение;
(б) методом простых итераций. Для обеспечения сходимости следует
должным образом подобрать вспомогательную функцию  (x ) и начальное
приближение;
(в) методом Ньютона. Для обеспечения сходимости следует должным
образом подобрать начальное приближение
3. Привести текст программы и результаты решения уравнения с точностью
0.0001. Определить количество делений пополам/итераций, которое вам
понадобилось для этого.

9. x 3  6 x  1  0

Построим график функции f ( x)  x 3  6 x  1

5
Функция содержит единственный действительный корень на интервале
[0,0; 0,5] .
Программно произведем уточнение заданного корня методом деления
отрезка пополам. Листинг программы на языке программирования Java:

public class Lab1 {


public static void main(String[] args) {

double a=0.0; // левая граница отрезка


double b=0.5; // правая граница отрезка
double eps=0.0001; // заданная точность
double c; // середина отрезка
int n=0; // количество делений отрезка пополам

System.out.println(" N a b c f(a) f(b)


f(c)");
do {
c=(a+b)/2;
double fa=f(a); double fb=f(b); double fc=f(c);
n++;
System.out.format(" %2d % .5f % .5f % .5f % .5f % .5f % .
5f\n", n, a, b, c, fa, fb, fc);
if(fa*fc>0)
a=c;
else
b=c;

} while(Math.abs(a-b)>2*eps);
c=(a+b)/2;
System.out.format("Корень: %.5f \n", c);
System.out.format("Невязка: %.5f \n", Math.abs(f(c)));
}
public static double f(double x) {
return x*x*x+6*x-1;
}
}
Результат вычислений:

Метод простых итераций


Заменим исходное уравнение эквивалентным ему уравнением, которое
преобразуем к виду:
x3  1
x
6
Тогда

6
x3  1
 ( x) 
6
x2
 '( x)  
3
Функция  '( x) на всем интервале локализации корня не превышает по
модулю значения 1, следовательно выполняется достаточное условие сходимости
метода простых итераций.
Листинг программы:

public class Lab2 {


public static void main(String[] args) {
double a = 0.0; // левая граница отрезка
double b = 0.5; // правая граница отрезка
double eps = 0.0001; // заданная точность
double d;
int n = 0; // количество итераций

double x=0.5; // начальное приближение


System.out.println(" N x xn d");
do
{
double xn=f(x); // вычисляем новое приближение
d=Math.abs(x-xn); // изменение х
n++;
System.out.format(" %2d % .5f % .5f % .5f \n", n, x, xn,
d);
x=xn;
} while(d>eps); // пока не достигли заданной точности

System.out.format("Корень: %.5f\n",x);
System.out.format("Невязка % .5f\n",Math.abs(y(x)));
}
// заданная функция
public static double y(double x) {
return x*x*x+6*x-1;
}

// эквивалентная функция
public static double f(double x) {
return (x*x*x-1)/-6;
}
}

Результат вычислений:

7
Метод Ньютона
Итерации в методе Ньютона осуществляются по формуле:
f ( xn1 )
xn  xn1  , f ( xn 1 )  0
f ( xn 1 )
Метод очень чувствителен к выбору начального приближения.
Если производные f '( x) и f ''( x) сохраняют знак в окрестности корня,
рекомендуется выбирать начальное приближение x0 так, чтобы выполнялось
условие:
f ( x 0 )  f ( x 0 )  0
Это условие итерационной последовательности является достаточным.
Вычислим первую производную функции f (x) , она равна:

f '( x)  3x 2  6

Вычислим вторую производную, она равна:

f ''( x )  6 x

Выберем начальное приближение x0 , исходя из условия f ( x 0 )  f ( x 0 )  0 .


Оно выполняется, например, для значения x0  1 : f (1)  f ''(1)  1  6  6  0 . За
начальное приближение выберем .
Листинг программы:

public class Lab3 {


public static void main(String[] args) {
int n = 0; // количество итераций
double x=1.0; // начальное приближение
double eps=0.0001; // заданная точность
double d;
System.out.println(" N x xn d");
do
{
double xk=x-f(x)/fp(x);
d=Math.abs(xk-x);
n++;
System.out.format(" %d % .5f % .5f % .5f \n", n, x, xk, d);
x=xk;
} while(d>eps);

System.out.format("\nКорень: %.5f\n",x);
System.out.format("Невязка % .5f\n",Math.abs(f(x)));
}
// заданная функция
public static double f(double x) {
return x*x*x+6*x-1;
}
// производная функции
public static double fp(double x) {

8
return 3*x*x+6;
}
}
Результат вычислений:

9
Задание № 3. Численное решение систем линейных алгебраических
уравнений (СЛАУ)

1. Решить СЛАУ методом исключения Гаусса. Привести текст программы на


языке Java и результат решения, а также вид матрицы системы и вектора правой
части после завершения прямого хода метода.

 2 x1  x2  x3  2 x4  2
2 x  2 x  2 x  3x  1
 1 2 3 4
9. 
 2 x1  2 x2  3x3  4 x4  0
 2 x1  2 x2  3x3  5 x4  1

Листинг программы:

public class Gauss {

public static void main(String[] args) {

int n=4; // количество уравнений в СЛАУ


double eps = 0.00001; // точность вычисления
double max;
int k, index;

// матрица коэффициентов при неизвестных


double[][] a = {
{2, 1, 1, 1},
{2, 2, 2, 3},
{2, 2, 3, 4},
{2, 2, 3, 5}
};

// вектор свободных коэффициентов


double[] y = {2, 1, 0, -1};

System.out.println("Заданная матрица");
for(int i=0;i<n; i++){
for(int j=0;j<n; j++){
System.out.format(" % .1f ", a[i][j]);
}
System.out.format(" % .1f\n", y[i]);
}

// вектор результатов
double [] x = new double[n];
k = 0;
while (k < n)
{
// Поиск строки с максимальным a[i][k]
max = Math.abs(a[k][k]);
index = k;
for (int i = k + 1; i < n; i++) {
if (Math.abs(a[i][k]) > max) {
max = Math.abs(a[i][k]);
index = i;
}
}

10
// Перестановка строк
if (max < eps) {
// нет ненулевых диагональных элементов
System.out.println("Решение получить невозможно из-за
нулевого столбца ");
System.out.println(index + " матрицы A");
return;
}
for (int j = 0; j < n; j++) {
double temp = a[k][j];
a[k][j] = a[index][j];
a[index][j] = temp;
}

double temp = y[k];


y[k] = y[index];
y[index] = temp;

// Нормализация уравнений
for (int i = k; i < n; i++) {
temp = a[i][k];
if (Math.abs(temp) < eps)
continue; // для нулевого коэффициента пропустить

for (int j = 0; j < n; j++)


a[i][j] = a[i][j] / temp;

y[i] = y[i] / temp;

if (i == k)
continue; // уравнение не вычитать само из себя

for (int j = 0; j < n; j++)


a[i][j] = a[i][j] - a[k][j];

y[i] = y[i] - y[k];


}
k++;
}

System.out.println("\nВид матрицы после прямого прохода");


for(int i=0;i<n; i++){
for(int j=0;j<n; j++){
System.out.format(" % .2f ", a[i][j]);
}
System.out.format(" % .2f\n", y[i]);
}

// обратная подстановка
for (k = n - 1; k >= 0; k--)
{
x[k] = y[k];
for (int i = 0; i < k; i++)
y[i] = y[i] - a[i][k] * x[k];
}

// вывод результата
System.out.println("\nРезультат");
for(int i=0;i<n;i++)
System.out.format("x[%d] = % .2f\n", i+1, x[i]);

return;
}
}

11
Результат вычислений:

2. Решить СЛАУ методом прогонки. Привести текст программы на языке


Java и результат решения.

1, 25 x1  0, 2 x2  2,3
 1,7 x  2,87 x  x  4
 1 2 3
9. 
 1, 4 x2  4,7 x3  2 x4  3,5
  x3  5 x4  1, 4

Листинг программы:

public class Progonka {

public static void main(String[] args) {

int n=4; // количество уравнений в СЛАУ

double y;
double [] a = new double[n];
double [] b = new double[n];
double [] x = new double[n];

12
// матрица коэффициентов при неизвестных
double[][] matA = {
{1.25, -0.2, 0, 0},
{-1.7, 2.87, -1, 0},
{0, 1.4, 4.7, -2},
{0, 0, -1, 5}
};

// вектор свободных коэффициентов


double[] matB = {2.3, 4, 3.5, 1.4};

// прямой проход
y = matA[0][0];
a[0] = -matA[0][1] / y;
b[0] = matB[0] / y ;
for (int i = 1; i < n-1; i++) {
y = matA[i][i] + matA[i][i - 1] * a[i - 1];
a[i] = -matA[i][i + 1] / y;
b[i] = (matB[i] - matA[i][i - 1] * b[i - 1]) / y;
}

// обратный проход
x[n-1] = (matB[n-1] - matA[n-1][n - 2] * b[n-2]) / (matA[n-1][n-1] +
matA[n-1][n-2] * a[n-2]);
for (int i = n-2; i >= 0; i--) {
x[i] = a[i] * x[i + 1] + b[i];
}

// вывод результата
System.out.println("\nРезультат");
for(int i=0;i<n;i++)
System.out.format("x[%d] = % .2f\n", i+1, x[i]);
}
}

Результат вычислений:

13
Список использованных источников

1. Колдаев, В. Д. Численные методы и программирование. Учебное пособие /


В.Д. Колдаев. - М.: Форум, Инфра-М, 2016. - 336 c.
2. Савитч, Уолтер Язык Java. Курс программирования / Уолтер Савитч. - М.:
Вильямс, 2015. - 928 c.
3. Самарский А.А., Гулин А.В. Численные методы. — М.: Наука, 1989,432 с.
4. Шилдт, Герберт Java 8. Руководство для начинающих / Герберт Шилдт. -
М.: Вильямс, 2015. - 720 c.

14

Вам также может понравиться