МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра Информационные системы ОТЧЕТ по лабораторной работе №12 по дисциплине «Конструирование программ» Студента гр. 7361 Сезин М.Д. Преподаватель Копыльцов А.В. Санкт-Петербург 2019 1. Цель работы. Научиться решать однородного уравнения колебаний струны методом сеток по неявной схеме. 2. Задание для лабораторной работы Уравнение гиперболического типа 2 2u 2 u a f x, t 0 t 2 x 2 (8.10.1) описывает поперечные колебания упругой натянутой струны. Его решение – функция ux, t дает смещение участков струны в поперечном направлении. Решим пример на это уравнение при условии f x, t 0 . Задача состоит в отыскании ux, 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) начальным условиям ux,0 0 x , u t 1 x , 0 x l (8.10.3) t 0 и краевым условиям u0, t 1 t , ul, 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 функции ux, 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. Выводы. Программа была выполнена на языке программирования с++. Мы научились решать однородного уравнения колебаний струны методом сеток по неявной схеме.