Uploaded by Максим Сезин

Лабораторная №12

advertisement
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра Информационные системы
ОТЧЕТ
по лабораторной работе №12
по дисциплине «Конструирование программ»
Студента гр. 7361
Сезин М.Д.
Преподаватель
Копыльцов А.В.
Санкт-Петербург
2019
1. Цель работы.
Научиться решать однородного уравнения колебаний струны методом
сеток по неявной схеме.
2. Задание для лабораторной работы
Уравнение гиперболического типа
2
 2u
2  u

a
 f  x, t 
0
t 2
x 2
(8.10.1)
описывает поперечные колебания упругой натянутой струны. Его
решение – функция ux, t  дает смещение участков струны в поперечном
направлении.
Решим пример на это уравнение при условии f x, t   0 . Задача состоит в
отыскании
ux, t  ,
функции
удовлетворяющей
в
прямоугольнике
 при t  0 уравнению
D   x, t 
0  x  l , 0  t  T 

2
 2u
2  u
,

a
0
t 2
x 2
(8.10.2)
начальным условиям
ux,0   0 x ,
u
t
 1 x , 0  x  l
(8.10.3)
t 0
и краевым условиям
u0, t   1 t , ul, t    2 t , 0  t  T .
(8.10.4)
Для реализации разностной схемы решения задачи (8.10.2) – (8.10.4)
построим в области D сетку xi  ih, i  0,1,..., n, l  hn , t j  j , j  0,1,..., m, T  m и
аппроксимируем
x , t , i  1,2,..., n  1,
i
j
производные
с
j  1,2,..., m  1
от
помощью
решения
центральных
в
узлах
разностных
отношений (8.5.11) и (8.5.12) на пятиточечном шаблоне, изображенном на с.
206. Этот шаблон не требует выполнения какого-либо соотношения между
шагами h и  для обеспечения устойчивости решения.
Получим приближенное уравнение
ui , j 1  2ui , j  ui , j 1

2
 a02
ui 1, j 1  2ui , j 1  ui 1, j 1
h2
.
(8.10.5)
Погрешность замены дифференциального уравнения (8.10.2) разностным
(8.10.5) составляет величину


O h2  2 .
h
 ,
a0 
Полагая
получаем
трехслойную разностную схему


ui 1, j 1  2  2 ui , j 1  ui 1, j 1  2 ui , j 1  2ui , j .
(8.10.6)
Эта схема называется трехслойной потому, что связывает между собой
приближенные значения u i , j функции ux, t  на трех временных слоях с
номерами j  1, j и j  1 .
Система
линейных
алгебраических
уравнений
(8.10.6)
обладает
трехдиагональной матрицей и решается методом прогонки. Например, при
j  1 система уравнений (8.10.6) приобретает вид


ui 1, 2  2  2 ui , 2  ui 1, 2  2 ui ,0  2ui ,1  .
(8.10.7)
Значения u i ,0 известны из начальных условий (8.10.3), а для определения
u i ,1 можно исполь-
зовать один из возможных приемов, например,
u i ,1  u i ,0  1 xi , i  0,1,..., n .
(8.10.8)
3. Результаты выполнения программы
Задание № 1. Найти приближенное решение однородного уравнения
гиперболического типа
шагом h    0.1 .
 2u  2u

t 2 x 2
в квадрате D   x, t  0  x  1, 0  t  1 с


4. Исходный код программы
#include
#include
#include
#include
#include
"pch.h"
<cmath>
<math.h>
<iostream>
<iomanip>
using namespace std;
double function(double **array, double a, double b,
double c, double d, int e, int f);
int main()
{
double lambda = 0.1, h, tau;
double a, b, c = 0, d, k;
int nx, nt;
a = 0;
b = 1;
d = 1;
k = 1;
nx = 10;
h = 0.1;
tau = 0.1;
nt = 10;
double ex = 2.718;
lambda = 1;
double **u = new double*[nt];
for (int i = 0; i < nt; i++)
{
u[i] = new double[nx];
}
function(u, a, h, tau, lambda, nx, nt);
system("Pause");
return 0;
}
double function(double **u, double a, double h, double
tau, double lambda, int nx, int nt)
{
double x, x0 = 0, t0 = 0;
double t = 0;
int k = 0;
x = x0;
for (int j = 0; j < nt; j++)
{
for (int i = 0; i < nx; i++)
{
u[j][i] = 0;
}
}
u[0][0] = x0 * (2 * x0 - 0, 5);
for (int i = 0; i < nx; i++)
{
x = (i - 1) * h;
u[i][0] = 0.4*pow((x+0.5),2);
u[i][1] = u[i][0] + h * x*sin(x+0.6);
}
for (int j = 0; j < nt; j++)
{
t = (j - 1) * h;
u[0][j] = t * t;
u[1][j] = 1, 5;
}
for (int i = 1; i < nx; i++)
{
for (int j = 1; j < nt; j++)
{
u[i][j] = u[i - 1][j] / 2;
}
}
for (int i = 0; i < nx; i++)
{
x = (i - 1) * h;
u[i][1] = u[i][0] + h * (cos(2 * x));
}
for (int j = 0; j < nt; j++)
{
for (int i = 0; i < nx; i++)
{
cout << setw(9) << round(u[j][i] * 1000000)
/ 1000000 << " ";
}
cout << endl;
}
return 0;
}
5. Выводы.
Программа
была
выполнена
на
языке
программирования
с++.
Мы научились решать однородного уравнения колебаний струны методом
сеток по неявной схеме.
Download