Академический Документы
Профессиональный Документы
Культура Документы
РГР Ананьев3
РГР Ананьев3
Вычислительная математика
Отчет по расчётно-графическим работам
Вариант 5
Проверили:
Сеченых П.А.
Кринецкий О.Е.
Москва 2020
Содержание отчёта
1. Метод Гаусса.......................................................................................................................................................4
Блок схема:..........................................................................................................................................................4
Код программы:..................................................................................................................................................5
Вывод программы:.............................................................................................................................................6
2. Метод прогонки:.................................................................................................................................................7
Блок схема:..........................................................................................................................................................8
Код программы:..................................................................................................................................................8
Вывод программы:...........................................................................................................................................10
3. Итерационные методы(СЛАУ):.....................................................................................................................11
Блок схемы:.......................................................................................................................................................12
Код программы:................................................................................................................................................14
Вывод программы:...........................................................................................................................................14
4. Метод вращений:..............................................................................................................................................21
Блок схема:........................................................................................................................................................22
Код программы:................................................................................................................................................22
Вывод программы:...........................................................................................................................................22
5. Нелинейные уравнения:..................................................................................................................................29
Блок схема:........................................................................................................................................................29
Графики:............................................................................................................................................................32
Код программы:................................................................................................................................................33
Вывод программы:...........................................................................................................................................33
6. Нелинейные системы:......................................................................................................................................34
Блок схема:........................................................................................................................................................36
График:..............................................................................................................................................................37
Код программы:................................................................................................................................................37
Вывод программы:...........................................................................................................................................41
7. Полиномы Лагранжа и Ньютона:.................................................................................................................43
Блок схема:........................................................................................................................................................43
Графики:............................................................................................................................................................44
Код программы:................................................................................................................................................44
Вывод программы:...........................................................................................................................................44
8. Сплайн-интерполяция:....................................................................................................................................46
Блок схема:........................................................................................................................................................47
Графики:............................................................................................................................................................48
Код программы:................................................................................................................................................48
2
Вывод программы:...........................................................................................................................................50
9. Метод наименьших квадратов:......................................................................................................................51
Блок схема:........................................................................................................................................................52
Графики:............................................................................................................................................................52
Код программы:................................................................................................................................................53
Вывод программы:...........................................................................................................................................57
10. Численное дифференцирование:..................................................................................................................57
Блок схема:........................................................................................................................................................58
Код программы:................................................................................................................................................58
Вывод программы:...........................................................................................................................................58
11. Численное интегрирование:.........................................................................................................................60
Блок схема:........................................................................................................................................................61
Код программы:................................................................................................................................................61
Вывод программы:...........................................................................................................................................64
12. Задача Коши(ДУ1п):......................................................................................................................................65
Блок схема:........................................................................................................................................................66
Графики:............................................................................................................................................................66
Код программы:................................................................................................................................................67
Вывод программы:...........................................................................................................................................70
13. Краевая задача:...............................................................................................................................................71
Блок схема:........................................................................................................................................................71
Графики:............................................................................................................................................................72
Код программы:................................................................................................................................................72
Вывод программы:...........................................................................................................................................72
3
1. Метод Гаусса
Решить СЛАУ методом Гаусса.
Блок схема:
4
Код программы:
package com.company;
import java.util.Scanner;
System.out.println();
5
}
System.out.println();
System.out.println();
//Вывод
Вывод программы:
6
2. Метод прогонки:
Решить СЛАУ методом прогонки.
7
Блок схема:
Код программы:
package com.company;
8
{0, 0, 0, 1, 7} };
/*double[] x = { 0 };
double[] a = { 0 };
double[] b = { 0 };
double[] c = { 0 };
if (i == 5 - 1) {
a[i] = sys[i][i - 1];
b[i] = sys[i][i];
c[i] = 0.0;
}
if (i != 0 && i != 5 - 1) {
a[i] = sys[i][i - 1];
b[i] = sys[i][i];
c[i] = sys[i][i + 1];
}
}
System.out.println();
System.out.println();
9
x[5 - 1] = Q[5];
Вывод программы:
10
3. Итерационные методы(СЛАУ):
Решить СЛАУ с точностью 0.01, используя метод простых итераций и метод Зейделя.
Проанализировать количество итераций, необходимое для достижения заданной точности.
11
Блок схемы:
12
Рис. 2 Метод Зейделя
13
Код программы:
package com.company;
//Привидение к виду
//Вывод системы
System.out.println("Система");
System.out.println();
System.out.println();
//Вычисление нормы
14
for (int i = 0; i < systemSize; i++) {
for (int j = 0; j < systemSize; j++) {
Norma_1[i] += abs(a[i][j]);
Norma_2[i] += abs(a[j][i]);
Norma_b[i] = abs(B[i]);
}
}
if (Norm < 1) //Так как ||B|| < 1, то итерационный процесс будет сходиться к
точному решению системы
{
System.out.println(" ");
System.out.println();
15
while (delta > EPS_CONST) {
ESP = pow(Norm, n) / (1 - Norm) * max_b; //Вычисление погрешности
System.out.print("Итерация N" + (n+1) + ": ");
if (n != 0) {
delta = max(max(abs(Iterations[n][0] - Iterations[n - 1][0]),
abs(Iterations[n][1] - Iterations[n - 1][1])), abs(Iterations[n][2] - Iterations[n -
1][2]));
}
n++;
System.out.print(" " + ceil(ESP * 100000)/100000);
System.out.print(" " + ceil(delta * 100000)/100000);
System.out.println();
System.out.println();
System.out.print("___________________________________________________________________
________\n");
System.out.print("Метод Зейделя:\n");
//Метод Зейделя
Temp = 0;
n = 1; //Номер итерации
int Zeidel;
16
Norma_b[i] = 0;
}
}
//Перестановка
//Привидение к виду
System.out.print("Система:\n\n");
//Вывод системы
System.out.print("\n\n");
//Вычисление нормы
max_1 = Norma_1[0];
max_2 = Norma_2[0];
max_b = Norma_b[0];
17
if (Norma_1[i] > max_1) {
max_1 = Norma_1[i];
}
System.out.print("Норма B: ");
System.out.print(Norm);
System.out.print("\n");
System.out.print("Норма бэтта: ");
System.out.print(max_b);
System.out.print("\n");
if (Norm < 1) //Так как ||B|| < 1, то итерационный процесс будет сходиться к
точному решению системы
{
System.out.print(" ");
for (int i = 0; i < systemSize; i++)
{
System.out.printf("%15s", "x");
System.out.printf("%s", i + 1);
}
System.out.printf("%17s", "ESP");
System.out.printf("%17s", "Delta");
System.out.print("\n\n");
//Начальный вектор
System.out.print("\n");
delta = Integer.MAX_VALUE;
18
if (j >= i) Zeidel = n - 1;
else Zeidel = n;
Temp += A[i][j] * Iterations[Zeidel][j];
}
Iterations[n][i] += (Temp + B[i]);
System.out.printf("%15f", Iterations[n][i]);
Temp = 0;
}
if (n != 0) {
delta = max(max(abs(Iterations[n][0] - Iterations[n - 1][0]),
abs(Iterations[n][1] - Iterations[n - 1][1])), abs(Iterations[n][2] - Iterations[n -
1][2]));
}
n++;
System.out.printf("%15f", ESP);
System.out.printf("%15f", delta);
System.out.print("\n");
}
}
}
}
Вывод программы:
19
20
4. Метод вращений:
Используя метод вращений, найти собственные значения и собственные векторы
симметрических матриц с точностью 0.05.
21
Блок схема:
Код программы:
#include "stdio.h"
#include <iostream>
#include "math.h"
22
result = false;
break;
}
}
if (!result) { break; }
}
return result;
}
int wrachenie(double** coefficients, int numberOfEquation,
double** solution, double precision) {
int result = 1;
int i, j, k;
int maxI, maxJ;
double max, fi;
double** matricaPoworota;
matricaPoworota = new double* [numberOfEquation];
for (i = 0; i < numberOfEquation; i++) {
matricaPoworota[i] = new double[numberOfEquation];
}
double** temp;
temp = new double* [numberOfEquation];
for (i = 0; i < numberOfEquation; i++) {
temp[i] = new double[numberOfEquation];
}
double fault = 0.0;
for (i = 0; i < numberOfEquation; i++) {
for (j = i + 1; j < numberOfEquation; j++) {
fault = fault + coefficients[i][j] * coefficients[i][j];
}
}
fault = sqrt(2 * fault);
while (fault > precision) {
max = 0.0;
for (i = 0; i < numberOfEquation; i++) {
for (j = i + 1; j < numberOfEquation; j++) {
if (coefficients[i][j] > 0 && coefficients[i][j] > max) {
max = coefficients[i][j];
maxI = i;
maxJ = j;
}
else if (coefficients[i][j] < 0 && -coefficients[i][j] > max) {
max = -coefficients[i][j];
maxI = i;
maxJ = j;
}
}
}
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
matricaPoworota[i][j] = 0;
}
matricaPoworota[i][i] = 1;
}
if (coefficients[maxI][maxI] == coefficients[maxJ][maxJ]) {
matricaPoworota[maxI][maxI] = matricaPoworota[maxJ][maxJ] =
matricaPoworota[maxJ][maxI] = sqrt(2.0) / 2.0;
matricaPoworota[maxI][maxJ] = -sqrt(2.0) / 2.0;
}
else {
fi = 0.5 * atan((2.0 * coefficients[maxI][maxJ]) /
(coefficients[maxI][maxI] - coefficients[maxJ][maxJ]));
matricaPoworota[maxI][maxI] = matricaPoworota[maxJ][maxJ] = cos(fi);
matricaPoworota[maxI][maxJ] = -sin(fi);
matricaPoworota[maxJ][maxI] = sin(fi);
}
23
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
temp[i][j] = 0.0;
}
}
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
for (k = 0; k < numberOfEquation; k++) {
temp[i][j] = temp[i][j] + matricaPoworota[k][i] *
coefficients[k][j];
}
}
}
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
coefficients[i][j] = 0.0;
}
}
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
for (k = 0; k < numberOfEquation; k++) {
coefficients[i][j] = coefficients[i][j] +
temp[i][k] * matricaPoworota[k][j];
}
}
}
fault = 0.0;
for (i = 0; i < numberOfEquation; i++) {
for (j = i + 1; j < numberOfEquation; j++) {
fault = fault + coefficients[i][j] * coefficients[i][j];
}
}
fault = sqrt(2 * fault);
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
temp[i][j] = 0.0;
}
}
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
for (k = 0; k < numberOfEquation; k++) {
temp[i][j] = temp[i][j] + solution[i][k] * matricaPoworota[k]
[j];
}
}
}
for (i = 0; i < numberOfEquation; i++) {
for (j = 0; j < numberOfEquation; j++) {
solution[i][j] = temp[i][j];
}
}
result++;
}
return result;
}
void main()
{
setlocale(LC_ALL, "rus");
int i, j;
int size = 3;
double** coefficients, ** solution, precision;
24
coefficients = new double* [size];
solution = new double* [size];
for (i = 0; i < size; i++) {
coefficients[i] = new double[size];
solution[i] = new double[size];
}
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
solution[i][j] = 0;
}
solution[i][i] = 1;
}
coefficients[0][0] = 0;
coefficients[0][1] = -7;
coefficients[0][2] = 7;
coefficients[1][0] = -7;
coefficients[1][1] = -9;
coefficients[1][2] = -5;
coefficients[2][0] = 7;
coefficients[2][1] = -5;
coefficients[2][2] = -1;
precision = 0.05;
if (!isSimmetrial(coefficients, size)) {
cout << "Матрица не симметричная";
}
else {
int steps = wrachenie(coefficients, size, solution, precision);
for (i = 0; i < size; i++) {
cout << "\nСобственный вектор лямбда " << i + 1 << ":\n";
for (j = 0; j < size; j++) {
cout << solution[j][i] << "\n";
}
}
cout << "\nСобственные значения:\n";
for (i = 0; i < size; i++) {
cout << coefficients[i][i] << "\n";
}
cout << "\nОбщее число шагов: " << steps;
}
cout << "\nPress \"Enter\" to continue..." << endl;
getchar();
}
25
Вывод программы:
26
5. Нелинейные уравнения:
Найти один из корней уравнения f(x)=0, используя метод простой итерации, метод секущих
и метод Ньютона, с точностью 0.001. Построить графики функций f(x), f’(x), f”(x) а также ϕ(x) и
ϕ’(x). Начальное приближение и границы отрезка определить графически.
Блок схема:
27
Рис. 2 Метод простых итераций
28
Рис. 3 Метод секущих
29
Графики:
30
Код программы:
package com.company;
//Метод Ньютона
x = a;
while (abs(function(x)) > EPS)
x = x - (function(x) / function_derivative(x));
System.out.print("Метод Ньютона: ");
System.out.print(x);
System.out.print("\n\n");
a = 1;
b = 2;
x = acos(0.5 - 0.25*x);
while (abs(function(x)) > EPS)
x = acos(0.5 - 0.25*x);
System.out.print("Метод простых итераций: ");
System.out.print(x);
System.out.print("\n\n");
a = -1.0;
b = -0.7;
//Метод секущих
x0 = a;
x = b;
while (abs(function(x)) > EPS) {
x = x - ((function(x) * (x - x0)) / (function(x) - function(x0)));
}
System.out.print("Метод хорд и секущих: ");
System.out.print(x);
System.out.print("\n\n");
}
}
31
Вывод программы:
32
6. Нелинейные системы:
Решить систему нелинейных уравнений с точностью 0.0001, используя метод Ньютона,
метод простой итерации и метод Зейделя. Построить графики функций. Начальное приближение
определить графически.
5 2
33
Блок схема:
34
График:
Код программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RGR6
{
public partial class Graphics : Form
{
double x;
public Graphics()
{
InitializeComponent();
for (double x = 0; x < 1; x += 0.001)
{
this.x = Math.Round(x * 1000) / 1000;
chart1.Series[0].Points.AddXY(F2(this.x), this.x);
}
for (double y = -1; y < 3; y += 0.001)
{
this.x= Math.Round(y * 1000) / 1000;
chart1.Series[1].Points.AddXY(this.x, F1(this.x));
}
Form1 form = new Form1();
form.Show();
double F1(double y)
{
return Math.Cos(y) + 1;
35
}
double F2(double x)
{
return Math.Log10(x + 1) + 2;
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
using System.Globalization;
namespace RGR6
{
public partial class Form1 : Form
{
const int SIZE = 2;
double[][] J =new double[SIZE][];
double EPS_CONST = 0.0001;
int tab = 15;
public Form1()
{
InitializeComponent();
for (int i = 0; i < SIZE; i++)
J[i] = new double[SIZE];
Newton();
richTextBox1.AppendText("\n----------------------------------------------------------------------
---------------------\n");
Iter();
richTextBox1.AppendText("\n----------------------------------------------------------------------
---------------------\n");
Zeidel();
}
double F11(double y)
{
return Math.Cos(y)+1;
36
}
double F22(double x)
{
return Math.Log10(x + 1) + 2;
}
double DF1_dx()
{
return 1;
}
double DF1_dy(double y)
{
return -Math.Sin(y);
}
double DF2_dx(double x)
{
return -1/((x+1)*Math.Log(10));
}
double DF2_dy()
{
return 1;
}
void Newton()
{
richTextBox1.AppendText("Метод Ньютона:\n");
int iter = 0;
double xo, xn, yo, yn, def;
xo = xn = 0.8;
yo = yn = 2;
double[] vs = new double[SIZE];
double[] tt = new double[SIZE];
richTextBox1.AppendText(" i".PadLeft(2) + "x1(n)".PadLeft(tab + 2) + "x1(n-
1)".PadLeft(tab + 3) + "x2(n)".PadLeft(tab + 1)
+ "x2(n-1)".PadLeft(tab + 3) + "\n");
while (true)
{
J[0][0] = DF2_dy();
J[0][1] = (-1) * DF2_dx(xo);
J[1][0] = (-1) * DF1_dy(yo);
J[1][1] = DF1_dx();
def = DF1_dx() * DF2_dy() - DF2_dx(xo) * DF1_dy(yo);
vs[0] = F1(xo, yo);
vs[1] = F2(xo, yo);
for (int i = 0; i < SIZE; i++)
{
tt[i] = 0;
for (int j = 0; j < SIZE; j++)
tt[i] += vs[j] * J[j][i];
tt[i] /= def;
}
xn = xo - tt[0];
yn = yo - tt[1];
richTextBox1.AppendText((iter + 1).ToString().PadLeft(2) + " " +
(xo).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(xn).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(yo).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(yn).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) + "\n");
if (iter!=0 && Math.Abs(xn - xo)<EPS_CONST && Math.Abs(yn - yo) < EPS_CONST)
break;
xo = xn;
37
yo = yn;
iter++;
}
richTextBox1.AppendText($"Кол-во итераций = {iter + 1}");
}
void Iter()
{
richTextBox1.AppendText("Метод простых итераций:\n");
int iter = 0;
double xo, xn, yo, yn;
xo = xn = 0.8;
yo = yn = 2;
richTextBox1.AppendText(" i".PadLeft(2) + "x1(n)".PadLeft(tab + 2) + "x1(n-
1)".PadLeft(tab + 3) + "x2(n)".PadLeft(tab + 1)
+ "x2(n-1)".PadLeft(tab + 3) + "\n");
while (true)
{
xn = F11(yo);
yn = F22(xo);
richTextBox1.AppendText((iter + 1).ToString().PadLeft(2) + " " +
(xo).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(xn).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(yo).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(yn).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) + "\n");
if (iter != 0 && Math.Abs(xn - xo) < EPS_CONST && Math.Abs(yn - yo) < EPS_CONST)
break;
xo = xn;
yo = yn;
iter++;
}
richTextBox1.AppendText($"Кол-во итераций = {iter + 1}");
}
void Zeidel()
{
richTextBox1.AppendText("Метод Зейделя:\n");
int iter = 0;
double xo, xn, yo, yn;
xo = xn = 0.8;
yo = yn = 2;
richTextBox1.AppendText(" i".PadLeft(2) + "x1(n)".PadLeft(tab + 2) + "x1(n-
1)".PadLeft(tab + 3) + "x2(n)".PadLeft(tab + 1)
+ "x2(n-1)".PadLeft(tab + 3) + "\n");
while (true)
{
xn = F11(yo);
yn = F22(xn);
richTextBox1.AppendText((iter + 1).ToString().PadLeft(2) + " " +
(xo).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(xn).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(yo).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) +
(yn).ToString("0.00000", CultureInfo.InvariantCulture).PadLeft(tab) + "\n");
if (iter != 0 && Math.Abs(xn - xo) < EPS_CONST && Math.Abs(yn - yo) < EPS_CONST)
break;
xo = xn;
yo = yn;
iter++;
}
richTextBox1.AppendText($"Кол-во итераций = {iter + 1}");
}
}
}
38
Вывод программы:
Метод Ньютона
Метод Ньютона:
i x1(n) x1(n-1) x2(n) x2(n-1)
1 0.80000 0.82046 2.00000 2.26021
2 0.82046 0.26089 2.26021 2.12669
3 0.26089 0.52850 2.12669 2.19285
4 0.52850 0.37483 2.19285 2.14060
5 0.37483 0.48888 2.14060 2.17428
6 0.48888 0.41313 2.17428 2.15076
7 0.41313 0.46480 2.15076 2.16606
8 0.46480 0.43065 2.16606 2.15565
9 0.43065 0.45364 2.15565 2.16251
10 0.45364 0.43839 2.16251 2.15790
11 0.43839 0.44859 2.15790 2.16096
12 0.44859 0.44181 2.16096 2.15891
13 0.44181 0.44634 2.15891 2.16027
14 0.44634 0.44332 2.16027 2.15936
15 0.44332 0.44533 2.15936 2.15997
16 0.44533 0.44399 2.15997 2.15956
17 0.44399 0.44489 2.15956 2.15983
18 0.44489 0.44429 2.15983 2.15965
19 0.44429 0.44469 2.15965 2.15977
20 0.44469 0.44442 2.15977 2.15969
21 0.44442 0.44460 2.15969 2.15975
22 0.44460 0.44448 2.15975 2.15971
23 0.44448 0.44456 2.15971 2.15974
Кол-во итераций = 23
-------------------------------------------------------------------------------------------
Метод простых итераций:
i x1(n) x1(n-1) x2(n) x2(n-1)
1 0.80000 0.58385 2.00000 2.25527
2 0.58385 0.36773 2.25527 2.19971
3 0.36773 0.41173 2.19971 2.13600
4 0.41173 0.46441 2.13600 2.14975
5 0.46441 0.45285 2.14975 2.16566
6 0.45285 0.43960 2.16566 2.16222
7 0.43960 0.44246 2.16222 2.15824
8 0.44246 0.44576 2.15824 2.15910
9 0.44576 0.44505 2.15910 2.16010
10 0.44505 0.44422 2.16010 2.15988
11 0.44422 0.44440 2.15988 2.15963
12 0.44440 0.44461 2.15963 2.15969
13 0.44461 0.44456 2.15969 2.15975
Кол-во итераций = 13
39
-------------------------------------------------------------------------------------------
Метод Зейделя:
i x1(n) x1(n-1) x2(n) x2(n-1)
1 0.80000 0.58385 2.00000 2.19971
2 0.58385 0.41173 2.19971 2.14975
3 0.41173 0.45285 2.14975 2.16222
4 0.45285 0.44246 2.16222 2.15910
5 0.44246 0.44505 2.15910 2.15988
6 0.44505 0.44440 2.15988 2.15969
7 0.44440 0.44456 2.15969 2.15974
8 0.44456 0.44452 2.15974 2.15972
Кол-во итераций = 8
40
7. Полиномы Лагранжа и Ньютона:
Используя таблицу значений Yi функции y f(x) , вычисленных в точках Xi , i 0 ,..., 3
построить интерполяционные полиномы Лагранжа и Ньютона, проходящие через точки Xi , Yi} .
Привести полиномы к каноническому виду и вычислить значение погрешности интерполяции в
точке X*. Построить графики.
Блок схема:
41
Графики:
Код программы:
package com.company;
42
System.out.printf("%25s", function(X4) + " ");
System.out.printf("%25s", function(X) + " ");
System.out.printf("%s", "\n\n");
double L1 = 0;
double L2 = 0;
//Полином Лагранжа
L1 += function(X1) * ((X - X2) * (X - X3) * (X - X4)) / ((X1 - X2) * (X1 -
X3) * (X1 - X4));
L1 += function(X2) * ((X - X1) * (X - X3) * (X - X4)) / ((X2 - X1) * (X2 -
X3) * (X2 - X4));
L1 += function(X3) * ((X - X1) * (X - X2) * (X - X4)) / ((X3 - X1) * (X3 -
X2) * (X3 - X4));
L1 += function(X4) * ((X - X1) * (X - X2) * (X - X3)) / ((X4 - X1) * (X4 -
X2) * (X4 - X3));
//Полином Ньютона
L2 += function(X1) + function1(X1, X2, function(X1), function(X2)) * (X - X1)
+
function2(X1, X2, X3, function(X1), function(X2), function(X3)) * (X
- X1)*(X - X2) +
function3(X1, X2, X3, X4, function(X1), function(X2), function(X3),
function(X4)) * (X - X1)*(X - X2)*(X - X3);
System.out.print("\nПолином Ньютона L2 = ");
System.out.print(L2);
System.out.print("\n");
System.out.print("Погрешность: ");
System.out.print(Math.abs(function(X) - L2));
System.out.print("\n\n");
43
Вывод программы:
44
8. Сплайн-интерполяция:
Построить кубический сплайн для функции, заданной в узлах интерполяции, предполагая, что
сплайн имеет нулевую кривизну при x x0 и x x4. Вычислить значение функции в точке x X*.
Построить график.
Блок схема:
45
Графики:
Код программы:
package com.company;
int i, Cut = 0;
double X = 0.8; //Заданное значение
double[] x = { 0.1, 0.5, 0.9, 1.3, 1.7 }; //Таблица
double[] y = { -2.3026, -0.69315, -0.10536, 0.26236, 0.53063 }; //Таблица
double[] h = new double[SIZE]; //Шаг
double[] Y = new double[SIZE]; //Замена правой части
double[] m = new double[SIZE];
double[] Q = new double[SIZE]; //Прогоночные коэффициенты
double[] P = new double[SIZE]; //Прогоночные коэффициенты
//Вычисление шага h
for (i = 1; i < SIZE; i++)
{
h[i] = x[i] - x[i - 1]; //Вычисляем шаги
}
//Вычисляем Y, P, Q
46
for (i = 1; i < SIZE - 1; i++)
{
Y[i] = ((y[i + 1] - y[i]) / h[i + 1]) - ((y[i] - y[i - 1]) / h[i]);
P[i + 1] = (-1 * h[i + 1]) / (2 * (h[i] + h[i + 1]) + P[i] * h[i]);
Q[i + 1] = (6 * Y[i] - h[i] * Q[i]) / (2 * (h[i] + h[i + 1]) + P[i] *
h[i]);
}
//Вычисляем m
for (i = SIZE - 1; i > 1; i--)
m[i - 1] = P[i] * m[i] + Q[i];
47
System.out.print("(");
System.out.print(X);
System.out.print(") = ");
System.out.print(S);
System.out.print("\n");
Вывод программы:
48
9. Метод наименьших квадратов:
Для таблично заданной функции путем решения нормальной системы МНК найти
приближающие многочлены a) 1-ой и б) 2-ой степени. Для каждого из приближающих
многочленов вычислить сумму квадратов ошибок. Построить графики приближаемой функции и
приближающих многочленов.
49
Блок схема:
Графики:
50
Код программы:
package com.company;
//int i, j;
double Temp;
double error = 0;
char[] abc = { 'a', 'b', 'c' };
//Пункт 1(a)
System.out.print("1) Приближенный многочлен первой степени:\n\n");
//Считаем левую часть системы
for (int j = 0; j < z1; j++)
for (int i = 0; i < z1; i++)
{
int p = 3 - i - j - 1;
if (p == 0)
system[i][j] = n;
else
system[i][j] = Sum(x, p);
}
//Считаем правую часть системы
for (int i = 0; i < z1; i++)
{
b[z1 - i - 1] = Sum1(x, y, i);
51
}
System.out.print("Полученная система: \n");
//Вывод полученной системы
for (int i = 0; i < z1; i++)
{
for (int j = 0; j < z1; j++)
{
System.out.printf("%8s", system[i][j]);
}
System.out.print(" | ");
System.out.print(b[i]);
System.out.print("\n");
}
System.out.print("\n\n");
//Вывод a, b, c
for (int i = z1 - 2; i >= 0; i--)
{
for (int j = z1 - 1; j > i; j--)
{
system[i][j] *= b[j];
b[i] -= system[i][j];
}
}
for (int i = 0; i < z1; i++) {
System.out.print(abc[i]);
System.out.print(" = ");
System.out.print(b[i]);
System.out.print("\n");
}
52
//Вычислим сумму квадратов ошибок
for (int i = 0; i < n; i++)
{
error += Math.pow(y[i] - b[0] * x[i] - b[1], 2);
}
System.out.print("Сумма квадратов ошибок = ");
System.out.print(error);
System.out.print("\n");
//Пункт 2(б)
System.out.print("___________________________________________________________________
_______\n\n2) Приближенный многочлен второй степени:\n\n");
//Считаем левую часть системы
//2 строчка
for (int i = j + 1; i < z2; i++)
{
Temp = -1 * system[i][j];
53
for (int k = 0; k < z2; k++)
{
system[i][k] += system[j][k] * Temp;
}
b[i] += b[j] * Temp;
}
}
//Вывод a, b, c
for (int i = z2 - 2; i >= 0; i--)
{
for (int j = z2 - 1; j > i; j--)
{
system[i][j] *= b[j];
b[i] -= system[i][j];
}
}
for (int i = 0; i < z2; i++)
{
System.out.print(abc[i]);
System.out.print(" = ");
System.out.print(b[i]);
System.out.print("\n");
}
error = 0;
//Вычислим сумму квадратов ошибок
for (int i = 0; i < n; i++)
{
error += Math.pow(y[i] - b[0] * Math.pow(x[i], 2) - b[1] * x[i] - b[2],
2);
}
System.out.print("Сумма квадратов ошибок = ");
System.out.print(error);
System.out.print("\n");
double S = 0;
for (int i = 0; i < n; i++)
S += pow(x[i], q);
return S;
}
double S = 0;
for (int i = 0; i < n; i++)
54
S += pow(x[i], q) * y[i];
return S;
}
Вывод программы:
55
10. Численное дифференцирование:
Вычислить первую и вторую производную от таблично заданной функции yi f(xi), i 0, 1, 2, 3, 4 в
точке x X*.
Блок схема:
56
Код программы:
package com.company;
int SIZE = 5;
int j = 0;
double X, h, fc, fl, fr, f2;
double[] x = { 0.0, 1.0, 2.0, 3.0, 4.0 };
double[] y = { 0.0, 1.0, 1.4142, 1.7321, 2.0 };
Вывод программы:
57
58
11. Численное интегрирование:
XK
Блок схема:
59
Код программы:
package com.company;
do
{
double[] x = new double[11];
double[] y = new double[11];
System.out.print("При h");
System.out.print(p + 1);
System.out.print(" = ");
System.out.print(h);
System.out.print(":");
System.out.print("\n\n");
int n = (int) ((xk - x0) / h); //Кол-во отрезков
System.out.print("Кол-во отрезков = ");
System.out.print(n);
System.out.print("\n");
//Считаем все X
x[0] = x0;
for (int i = 1; i <= n; i++)
{
if (x[i] <= xk)
x[i] = x[i - 1] + h;
}
//Выводим таблицу
System.out.print("\n Таблица:");
System.out.print("\n");
System.out.print(" Xi: ");
for (int i = 0; i <= n; i++)
{
System.out.printf("%10s", x[i]);
}
System.out.printf("%10s", "\n");
60
for (int i = 0; i <= n; i++)
{
System.out.printf("%10s", ceil(y[i] * 10000)/10000);
}
System.out.printf("%10s", "\n\n");
if (p == 0)
s11 = s1;
//Метод Симпсона
s2 = 0;
sum = 0;
double sum1 = 0;
for (int i = 1; i <= n - 1; i += 2)
{
sum += y[i];
}
for (int k = 2; k <= n - 2; k += 2)
{
sum1 += y[k];
}
s2 = h / 3 * (y[0] + 4 * sum + 2 * sum1 + y[n]);
System.out.print(" Метод Симпсона: ");
System.out.print(s2);
System.out.print("\n\n");
if (p == 0)
s21 = s2;
s3 = 0;
for (int i = 0; i < n; i++)
{
s3 += function(x0 + h * (i + 0.5));
}
s3 *= h;
if (p == 0)
s31 = s3;
h = 0.25; //h2
61
p++;
} while (p != 2);
Вывод программы:
62
12. Задача Коши(ДУ1п):
Решить задачу Коши для обыкновенного дифференциального уравнения первого порядка на
указанном отрезке с заданным шагом h методами Эйлера, Эйлера-Коши, Рунге-Кутты (четвёртого
63
порядка точности) и Адамса (четвёртого порядка точности). Полученное численное решение
сравнить с точным. Построить графики точного и численного решения. Определить погрешность
решения.
Блок схема:
64
Графики:
Код программы:
package com.company;
double h = 0.1;
double x_0 = 0, x_i = 1;
double[] x = new double[SIZE];
double[] y = new double[SIZE];
double x0 = 0;
double y0 = -1;
//Метод Эйлера
System.out.print("Метод Эйлера:\n");
x[0] = x0;
y[0] = y0;
System.out.printf("%12s", "X");
System.out.printf("%8s", "Y");
System.out.printf("%20s", "Точное решение");
System.out.printf("%s", "\n");
65
for (i = 0; i < SIZE; i++)
{
System.out.printf("%s", "i = ");
System.out.printf("%2d", i);
System.out.print(" ");
System.out.printf("%7f", x[i]);
System.out.printf("%10f", y[i]);
System.out.printf("%14f", f(x[i]));
System.out.printf("%s", "\n");
}
System.out.printf("%s", "____________________________________\n\n");
x[0] = x0;
y[0] = y0;
System.out.printf("%12s", "X");
System.out.printf("%8s", "Y");
System.out.printf("%20s", "Точное решение");
System.out.printf("%s", "\n");
for (i = 0; i < SIZE; i++)
{
System.out.printf("%s", "i = ");
System.out.printf("%2d", i);
System.out.print(" ");
System.out.printf("%7f", x[i]);
System.out.printf("%10f", y[i]);
System.out.printf("%14f", f(x[i]));
System.out.printf("%s", "\n");
}
System.out.printf("%s", "____________________________________\n\n");
//Метод Рунге-Кутты
System.out.printf("%s", "Метод Рунге-Кутты:\n");
System.out.printf("%12s", "X");
System.out.printf("%8s", "Y");
System.out.printf("%20s", "Точное решение");
System.out.printf("%s", "\n");
66
for (i = 0; i < SIZE; i++)
{
System.out.printf("%s", "i = ");
System.out.printf("%2d", i);
System.out.print(" ");
System.out.printf("%7f", x[i]);
System.out.printf("%10f", y[i]);
System.out.printf("%14f", f(x[i]));
System.out.printf("%s", "\n");
}
System.out.printf("%s", "____________________________________\n\n");
//Метод Адамса
System.out.printf("%s", "Метод Адамса:\n");
67
Вывод программы:
68
13. Краевая задача:
Решить краевую задачу для обыкновенного дифференциального уравнения 2-го порядка,
используя конечно-разностный метод. Оценить погрешность численного решения путем
сравнения с точным решением. Построить графики точного и численного решения.
Блок схема:
69
Графики:
Код программы:
package com.company;
int j;
double x_0 = 0, x_i = PI/4; //Границы из моего №7
double h;
//Условия
double R = 1, S = 0, T = 1; //Левая граница отрезка
double V = 0, W = 1, Z = 1; //Правая граница отрезка
x[0] = x_0;
70
for (int i = 1; i < SIZE; i++)
x[i] = x[i - 1] + h;
d[0] = T;
d[SIZE - 1] = -1*Z;
double X;
//Заполняем левую часть системы
for (int i = 1; i < SIZE - 1; i++)
{
j = i - 1;
X = x[i];
Systems[i][j] = a(X, h);
Systems[i][j + 1] = b(X, h);
Systems[i][j + 2] = c(X, h);
}
71
double[] Q = new double[SIZE+1];
72
y[SIZE - 1] = Q[SIZE];
for (int i = SIZE - 2; i >= 0; i--)
{
y[i] = Q[i + 1] + P[i + 1] * y[i + 1];
}
Вывод программы:
73
74