Реферат Численные методы решения задачи нахождения температуры
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
СОДЕРЖАНИЕ
Введение.......................................................................................................
Аналитические методы решения уравнений в частных производных...
Численные методы решения уравнений матфизики................................
Метод конечных разностей...............................................................
Метод конечных элементов..............................................................
Дискретизация расчетной области.............................................................
Формирование матрицы неизвестных температур системы линейных уравнений......................................................................................................................
Построение изотерм.....................................................................................
Нахождение температур в любой точке.............................................
Алгоритм построения изотерм............................................................
Характеристика программы........................................................................
Результаты программы................................................................................
Список используемой литературы.............................................................
Приложение..................................................................................................
Листинг программы...........................................................................
1. ВВЕДЕНИЕ
В настоящее время мы наблюдаем широкое применение математических методов в самые различные сферы человеческой деятельности. Это не только технические и экономические науки, где эти методы давно стали главенствующими при исследовании изучаемых процессов или явлений, но и развивающиеся сейчас прикладные науки управления: менеджмент, социально–экономическое прогнозирование, теория оптимального управления и т.д. Математизация различных областей знания сегодня, математическое моделирование как инструмент познания завоёвывает всё новые позиции в различных областях деятельности человека.
Большинство физических законов природы можно сформулировать на языке дифференциальных уравнений с частными производными. Производные в этих уравнениях появляются, потому что они описывают важнейшие физические величины: скорость, ускорение, силу, температуру, трение и т.д. Таким образом, возникают уравнения в частных производными, содержащие неизвестную функцию, которую необходимо определить. Изучением математических моделей физических явлений, описываемых уравнениями в частных производных, занимается математическая физика.
В данной курсовой работе рассматривается одно из самых важных уравнений матфизики – уравнения Лапласа на примере решения задачи Дирихле в заданной плоской области.
Многие установившиеся процессы сводятся к уравнениям Лапласа.
(1)
Ставится задача о нахождении стационарного распределения температуры внутри многоугольника, если задано распределение температуры вдоль его сторон.
Одна из главных трудностей, возникающих при решении этой задачи, обусловлена сложной формой границы расчетной области. Аналитическое решение задачи Дирихле для уравнения (1) удается получить лишь в частных случаях для простейших областей (прямоугольник, круг сектор, шар). Основными методами решения поставленной задачи являются численные методы.
2. АНАЛИТИЧЕСКИЕ МЕТОДЫ РЕШЕНИЯ В ЧАСТНЫХ ПРОИЗВОДНЫХ
Существует целый арсенал методов для решения уравнений в частных производных. Перечислим некоторые из них:
1) Метод разделения переменных
Уравнение с частными производными с n переменными сводится к n обыкновенным дифференциальным уравнениям. Существует множество разнообразных по форме областей, для которых можно в явном виде выписать решение задачи Дирихле для уравнения Лапласа. Например, для прямоугольника.
(рис. 1).
Рис.1 Прямоугольник с температурами на границе
где An , Bn, Cn, Dn – коэффициенты Фурье функций f1(x),f2(x),f3(y),f4(y) равные
2)Метод конформных отображений
Существует способ решения в областях со сложной границей. Этот способ основан на конформных отображениях (рис. 2).
Рис.2 Конформные отображения
При таком отображении уравнение Лапласа в плоскости z переходит снова в уравнение Лапласа, в координатной плоскости w не меняется.
После того, как решение получено в простой области, достаточно подставлять в это решение выражения: u=u(x,y), v=v(x,y) и мы получим решения исходной задачи.
3)введение новой переменной
Исходное уравнение преобразуется к другому уравнению с частными производными для другой неизвестной функцией, которая решается легче, чем исходная.
4)Метод преобразования координат
Исходное уравнение сводится к более простому уравнению в новой системе координат.
5)Вариационные методы
Вместо уравнения с частными производными решается некоторая задача минимизации. Оказывается, что функция, доставляющая минимум некоторому выражению, является решением исходного уравнения.
6)Метод интегральных уравнений
Уравнения с частными производными сводится к интегральному уравнению (уравнению, в котором неизвестная функция стоит под знаком интеграла).
3. ЧИСЛЕННЫЕ МЕТОДЫ РЕШЕНИЯ УРАВНЕНИЙ МАТФИЗИКИ
3.1. МЕТОД КОНЕЧНЫХ РАЗНОСТЕЙ
Для численного решения задач математической физики обычно применяется метод конечных разностей или метод сеток. К сеточным методам относятся те, в которых разыскивается таблица приближенных значений искомой функции в некоторой совокупности точек, называемой сеткой. Отдельные точки называются узлами сетки. Уравнения, которые служат для определения приближенного решения, называют сеточными. Основания для выбора сетки и для получения сеточных уравнений отличают один сеточный метод от другого.
Метод конечных разностей позволяет свести решение дифференциального уравнения к решению алгебраических (разностных) уравнений. Дифференциальная задача аппроксимируется дискретной разностной задачей.
Пусть на плоскости (x, y) задана область D, ограниченная замкнутой кривой L (рис.3). Рассмотрим задачу Дирихле для уравнения Лапласа
(2)
Для решения задачи (2) методом конечных разностей надо в области D+L построить сетку и аппроксимировать на этой сетке уравнение и краевое условие. Искомая функция определяется её значением в узлах сетки.
Узлы сетки, лежащие на границе области, называются граничными, а все остальные – внутренними. Для примера рассмотрим прямоугольную сетку. Они очень удобны при организации вычислительных алгоритмов.
Рис.3 Область D
Используя понятие частной производной, можно записать для малых шагов h1 и h2 (рис.3).
Тогда
В случае квадратной сетки уравнение (2) для нулевого элемента будет иметь вид:
Там, где узлы прямоугольной сетки не являются равноотстоящими, применяют следующие вычислительные шаблоны (рис. 4):
Рис.4 Сетка с разными длинами шага
Уравнение (2) будет иметь вид
Так как вычислительные шаблоны связывают лишь несколько соседних узлов, то матрица коэффициентов системы линейных уравнений для определенных узловых неизвестных оказывается “разряженной”, т.е. содержит много нулевых элементов.
3.2. МЕТОД КОНЕЧНЫХ ЭЛЕМЕНТОВ
Метод конечных элементов (МКЭ) впервые был применен для численного решения дифференциальных уравнений в частных производных в середине 50-х годов ХХ столетия и с тех пор завоевал широкую популярность. О распространении МКЭ можно судить, что в одной из книг было приведено более 7 тыс. ссылок, содержащих указания на его применение в различных областях науки и техники.
Основная идея МКЭ состоит в том, что область расчета делится на конечное число элементов произвольной геометрической формы, и для каждого элемента рассматриваются так называемые базисные , принимающие значения, равные 1 в i-м узле элемента и нулевые во всех других узлах.
Тогда значение искомой функции внутри элемента выражаются через узловые неизвестные в виде:
Наиболее распространенными конечными элементами для двумерных задач являются треугольные элементы с линейными базисными функциями (S – площадь треугольника) (рис. 5):
Рис.5 Треугольник с площадью для расчета МКЭ
Положительное значение площади S обеспечивается нумерацией вершин треугольника против часовой стрелки. Проверим выполнение условия: , если m=n и , если .
Если ввести обозначения
Пусть область расчета D c границей Г покрыта треугольными элементами. Вершины, расположенные внутри области, определяют узловые неизвестные. Для их определяют систему линейных уравнений (рис. 6):
Рис.6 Область D c границей Г
,
где - значения искомой функции в узле j, а коэффициент определяется следующим интегралом:
Внутреннее суммирование ведётся по всем внутренним узлам, принадлежащим k-му элементу, а внешнее – по всем элементам, содержащим узел j. В рассматриваемой системе уравнений число неизвестных равно числу уравнений.
Для треугольных элементов
Матрица коэффициентов системы МКЭ для треугольного элемента будет иметь вид :
Получим коэффициенты системы МКЭ для прямоугольного элемента. Пусть в вершинах 1, 2 и 3 равностороннего треугольника известны значения , и функции, удовлетворяющей условию Лапласа. Центр треугольника соединили с вершинами. Составим систему линейных уравнений МКЭ для этого узла.
Если , то внутри треугольника на прямой
значение функции . Здесь
МКЭ является одним из наиболее эффективных численных методов решения краевых задач. Но, как и любой метод, он имеет свои недостатки. Так, точность полученных значений зависит от триангуляции области. Количество выбранных треугольников, их вид и расположение могут влиять на точность полученных значений. Особенно это относится к решению краевых задач в областях с угловыми точками.
Невозможно дать общие рекомендации по триангуляции произвольной области. Существуют различные способы повышения точности при использовании МКЭ. Один из них – использование нелинейных конечных элементов и элементов специального вида для более точной аппроксимации границы области расчета и искомой функции.
При решении трехмерной задачи Дирихле для уравнения Лапласа
МКЭ область обычно делятся на элементы с линейными базисными функциями (тетраэдры) (рис.7).
Рис.7 Тетраэдр
(i=1,2,3,4)
Неизвестные коэффициенты ,, и определяется из условия , если m=n и , если .
Коэффициенты системы линейных уравнений МКЭ определяется по формуле
Даже с умеренным числом элементов система МКЭ может иметь несколько тысяч неизвестных. Иногда бывает трудно разделить область только на элементы такого типа. Из-за этого тетраэдральные элементы часто смешивают с шестигранными элементами (“кирпичиками”). Для этих элементов базисные функции имеют вид:
(i=1, 2,…, 8)
4. ДИСКРЕТИЗАЦИЯ РАСЧЕНТНОЙ ОБЛАСТИ
В моей курсовой дано решить задачу Дирихле для уравнения Лапласа с координатами области. А(-3,0), B(0,3), C(3,3), D (5,-2).(рис. 8) Решить эту задачу можно используя метод сеток, заключающихся в том, чтобы область покрыть сеткой, и написать уравнение Лапласа для него – сеточное уравнение.
Рис.8 Расчетная область
Для того чтобы применить сеточный метод на области, необходимо построить её дискретизацию, обрисовать область базисной фигурой (в нашем случае, это прямоугольник) (рис. 9).
Рис.9 Дискретизация расчетной области прямоугольной сеткой
Для того чтобы применить сеточный метод, необходимо обрезать внешние края области (рис. 10).
Рис.10 Дискретизация расчетной области прямоугольной сеткой
Согласно сеточному методу, после её дискретизацию, необходимо пронумеровать область с целью создания системы линейных уравнений. По моему мнению, нумерацию удобно применить так: сперва, пронумеровать внутренние точки (области пересечения фигур, покрывающих данную область, внутри него), затем – граничные точки, с целью упрощения алгоритма построения программы на ЭВМ (рис. 11).
Рис.11 Нумерация расчетной области
5. ФОРМИРОВАНИЕ МАТРИЦЫ НЕИЗВЕСТНЫХ ТЕМПЕРАТУР СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ
После нумерации сетки области перейдем к следующему этапу в методе сеток – формирование системы линейных уравнений с неизвестными температурами.
Так как нам ставится задача найти температуру во внутренней точки области, то её решение кроется в том, чтобы составить эту систему. Каждая внутренняя точка области имеет рядом стоящие точки, которые сформирует её.
В методе сеток строится квадратная матрица размерности, равная числу внутренних точек (узлы сетки). И она строится так: узлы прямоугольной сетки не являются равноотстоящими, применяют следующие вычислительные шаблоны
(рис. 12):
Рис.12 Сетка с разными длинами шага
,
где - неизвестные температуры.
Общее уравнение для внутреннего узла будет иметь вид
Так как у нас пронумерована область (см. пред. раздел), то для составления матрицы необходимо занести в основную матрицу коэффициенты внутренних точек, с которыми граничат эти точки, и 0, если внутренняя точка не граничит с ней.
В другую матрицу размерности 1 на количество свободных элементов переносятся значения свободных элементов – элементов внутренней области. И получившиеся 2 матрицы решаются методом Гаусса.
Метод Гаусса состоит в том, чтобы матрицы системы привести к треугольному виду. Это достигается последовательностью исключением неизвестных из уравнений системы. Сначала с первого исключаем второе неизвестное, затес со второго – третье, и т.д. Это процесс называется прямым ходом Гаусса, и он продолжается пока исключится последний элемент системы , то есть приведётся к треугольному виду.
Другой процесс – обратный ход метода Гаусса состоит в последовательном вычислении искомых неизвестных: решая последнее уравнение, находим значении последнего элемента системы. Далее находим значение предпоследнего элемента. Последним найдем 1 неизвестный элемент.
Точность при этом очень высока, так как метод Гаусса – прямой метод. Но возникает проблема в том, что матрица покрыта 0, и эта система считается другими методами, но точность желает знать наилучшего результата. Поэтому выбирается оптимальное количество неизвестных (в нашем случае, температур), при котором достигается более высокая точность нахождения температур в любой точке.
6. ПОСТРОЕНИЕ ИЗОТЕРМ
6.1. НАХОЖДЕНИЕ ТЕМПЕРАТУР В ЛЮБОЙ ТОЧКЕ
Наша область обустроена прямоугольниками и треугольниками. Для того чтобы вычислить температуру в любой его точки, нужно проверить к какой фигуре принадлежит точка.
Рассмотрим алгоритм нахождения температуры в треугольнике. Для того чтобы решить задачу (принадлежит ли данная точка треугольнику?), надо сосчитать общую площадь треугольника, и затем площади треугольников, получившихся после соединения каждой вершины с заданной точкой. Если площади треугольника и треугольников, полученных после объединения, совпадают с заданной точностью, то точка принадлежит этому треугольнику, иначе – нет.
Зная координаты трех вершин (x1, y1), (x2, y2), (x3, y3) и их температуры, мы можем вычислить следующую систему:
После её решения мы получим коэффициенты a, b и с – полином. Записывая координаты точки в него, мы найдем температуру в этой точке.
Другим методом решения задачи нахождения неизвестной температуры в треугольнике является написание коэффициента .
Строятся базисные функции (рис. 13):
Рис.13 Треугольник с площадью для расчета температуры в любой его точке
,
где S – площадь треугольника, и его можно вычислить следующим образом:
Зная базисные функции треугольника и их температуры (рис. 13), то мы можем найти температуру для данной точки:
Рассмотрим алгоритм нахождения температуры в прямоугольнике. Для того чтобы решить задачу (принадлежит ли данная точка прямоугольнику?), нужно знать координаты 4-x вершин (x1,y1), (x2,y2), (x3,y3), (x4,y4) , если
x>=x1, y>=y1, y<=y3, x<=x3 (3)
(рис. 14). Точка (x,y) принадлежит прямоугольнику, если выполняется условие (3), иначе – нет.
Рис.14 Прямоугольник для расчета температуры в любой его точке
Для того чтобы вычислить температуру в точке нужно вычислить по следующей формуле:
6.2. АЛГОРИТМ ПОСТРОЕНИЯ ИЗОТЕРМ
Нам дана область и разбита сетка на узлы, мы можем построить изотерму. Каждый узел в моей сетки состоит из отрезков. И эти отрезки будут нас интересовать.
Пусть даны 2 узла (x1,y1), (x2,y2) и их температуры. Для того чтобы решить задачу (принадлежит ли данная температура отрезку?), надо сравнить их температуры, если данная температура находится ,то найдется точка с этой данной температурой T (рис. 15).
Рис. 15 Вычисление температуры на отрезке
Наша T (температура) изменяется по линейному закону .
Для того чтобы определить координату точки для данной температуры необходимо воспользоваться следующими формулами:
Проходя все отрезки области, мы получим таблицу значений координат данной области для заданной температуры. По этой таблице построим точки, соединим прямой линией и получим теоретическую изотерму.
7. ХАРАКТЕРИСТИКА ПРОГРАММЫ
Представленная программа служит для решения задачи Дирихле для уравнения Лапласа. Она написана на языке Турбо Паскаль, работает на платформе DOS, требует аппаратной поддержки видеостандарта EGAVGA (640х480х16 цветов), около 2,25 Мб оперативной памяти.
Её возможности – для данной курсовой работы представить графическую интепритацию дискретизации; составления таблиц полученных значений температур во внутренних и внешних узлах данной области; для удобства создана папка DATA, в которой содержится текстовый документ Result.txt (при сохранении документов возникает вероятность запутаться в нахождении файла, а здесь – папка, которая выделяется на общем фоне); удобным выставлением информации о полученных температурах в любой точке области; графической инициализацией и отсортированным по координате X значений, определяющих теоретическую изотерму, с возможностью графического сравнения её с реальной.
Структура программы проста - использование 1 – для дискретизации области, 2 – для получения данных о температуре в любой точки области, 3 – для получения данных по изотермам. При использовании программы используем 1, затем 2 для получения полного доступа к программе из-за проведения определенных расчетов для области с целью наилучшего восприятия информации. Для перемещения по вычислениям используется любая клавиша.
Теперь перейдем к более подробному описанию программы: в 1 пункте – четыре рисунка дискретизации области, вывод температуры во внутренних и внешних точках области, сообщением о создании файла с результатами, полученных при вычислениях; во 2 пункте вы вводите координату точки, через некоторое мгновение появится температура внутри области и оценкой с реальной температурой, в противном случае – о некорректности введенных параметрах; в 3 пункте – постройка изотермы выполняется при вводе температуры, затем добавляются координаты точек, имеющих эту температуру, и её графическая интепритация с возможностью проверки – рисованием линии, отражающую реальную картину.
8. РЕЗУЛЬТАТЫ ПРОГРАММЫ
Моя программа позволяет вывести следующие параметры: температура во внутренних и внешних узлах сетки приведены в таблице 1, выведением информации о температуре в любой его точке, результаты построения изотерм.
1) температура во внутренних и внешних узлах сетки
Таблица 1
Температура во внутренних и внешних узлах сетки
N | x | y | T | P (%) |
1 | 0.0 | 2.0 | -6.00 | 0 |
2 | 1.0 | 2.0 | -5.00 | 0 |
3 | 2.0 | 2.0 | -2.00 | -3.6e-12 |
4 | 3.0 | 2.0 | 3.00 | 0 |
5 | -1.0 | 1.0 | -2.00 | 3.6E-12 |
6 | 0.0 | 1.0 | -2.00 | 7.3E-12 |
7 | 1.0 | 1.0 | 0.00 | 4.5E-12 |
8 | 2.0 | 1.0 | 4.00 | 7.3E-12 |
9 | 3.0 | 1.0 | 10.00 | 2.9E-11 |
10 | -2.0 | 0.0 | 0.00 | 2.3E-13 |
11 | -1.0 | 0.0 | -1.00 | 1.8E-12 |
12 | 0.0 | 0.0 | 0.00 | 1.7E-12 |
13 | 1.0 | 0.0 | 3.00 | 0 |
14 | 2.0 | 0.0 | 8.00 | 0 |
15 | 3.0 | 0.0 | 15.00 | 1.5E-11 |
16 | 4.0 | 0.0 | 24.00 | 2.9E-11 |
17 | 2.0 | -1.0 | 10.00 | 1.5E-11 |
18 | 3.0 | -1.0 | 18.00 | 0 |
19 | 4.0 | -1.0 | 28.00 | 0 |
20 | -3.0 | 0.0 | 3.00 | 0 |
21 | -2.0 | 1.0 | 0.00 | 0 |
22 | -1.0 | 2.0 | -5.00 | 0 |
23 | 0.0 | 3.0 | -12.00 | 0 |
24 | 1.0 | 3.0 | -12.00 | 0 |
25 | 2.0 | 3.0 | -10.00 | 0 |
26 | 3.0 | 3.0 | -6.0 | 0 |
27 | 3.4 | 2.0 | 5.6 | 0 |
28 | 3.8 | 1.0 | 16.2 | 0 |
29 | 4.0 | 0.5 | 21.3 | 0 |
30 | 4.2 | 0.0 | 26.0 | 0 |
31 | 4.6 | -1.0 | 35.0 | 0 |
32 | 5.0 | -2.0 | 43.0 | 0 |
33 | 4.0 | -1.8 | 29.7 | 0 |
34 | 3.0 | -1.5 | 18.8 | 0 |
35 | 2.0 | -1.3 | 10.2 | 0 |
36 | 1.0 | -1.0 | 4.0 | 0 |
37 | 0.0 | -0.8 | 0.2 | 0 |
38 | -1.0 | -0.5 | -1.3 | 0 |
39 | -2.0 | -0.3 | -0.3 | 0 |
2) выведением информации о температуре в любой его точке
Нахождение температуры в любой точке области
Введите x:0.5
Введите y:0.6
T=-0.000 t(точная)=-0.010
Относительная погрешность =100.00 %
при x=0.500 y=0.600
3) результаты построения изотерм (рис. 16, рис.17)
Рис.16 Изотерма T=1
Рис.17 Изотерма T=6
9. СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
А.А.Самарский. Введение в численные методы – М.: Наука. Главная редакция физико-математической литературы, 1982. – 272 с.
Ж. Кнуцман. Численные методы. Перевод с франц./ Под редакцией Д. П. Костырова. Главная редакция физико-математической литературы, 1979. – 160 с.
В.М. Вержбицкий. Численные методы (линейная алгебра и нелинейные уравнения): Учебное пособие для вузов. – М.: Высшая школа, 2000. – 266 с.: ил.
Л.И. Турчак. Основы численных методов. Учебное пособие. – М.: Наука. Главная редакция физико-математической литературы, 1987. – 320 с.
10. ПРИЛОЖЕНИЕ
10.1.Листинг программы
Program Kursach;
uses CRT,Graph;
type masik=array [1..19,1..20] of real;
function gx(x:real;mx:integer):integer;
begin
gx:=trunc(mx*x)+trunc(getmaxx/2);
end;
function gy(y:real;my:integer):integer;
begin
gy:=trunc(getmaxY/2)-Trunc(my*y);
end;
procedure L(x1,y1,x2,y2,color:integer);
begin
setcolor(color);
line(x1,y1,x2,y2);
end;
procedure init_graph;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode <> grOk then
begin
writeln ('ne syshestvyet!!');
exit;
end;
end;
procedure ris;
begin
L (gx(-7,50),gy(0,50),gx(7,50),gy(0,50),2);
L (gx(0,50),gy(3,50),gx(-3,50),gy(0,50),2);
L (gx(5,50),gy(-2,50),gx(-3,50),gy(0,50),2);
L (gx(5,50),gy(-2,50),gx(3,50),gy(3,50),2);
L (gx(3,50),gy(3,50),gx(0,50),gy(3,50),2);
L (gx(-7,50),gy(0,50),gx(7,50),gy(0,50),15);
L (gx(0,50),gy(-7,50),gx(0,50),gy(7,50),15);
L (gx(-7,50),gy(0,50),gx(7,50),gy(0,50),15);
setcolor (12);
outtextxy (gx(-0.3,50),gy(3.3,50),'B(0,3)');
outtextxy (gx(-3.5,50),gy(-0.3,50),'A(-3,0)');
outtextxy (gx(2.7,50),gy(3.3,50),'C(3,3)');
outtextxy (gx(4.5,50),gy(-2.05,50),'D(5,-2)');
outtextxy (gx(2.55,50),gy(-3.4,50),'Cледующее->любая клава!!!');
setcolor (15);
outtextxy (gx(6.2,50),gy(-0.1,50),'X');
outtextxy (gx(0.1,50),gy(4.45,50),'Y');
setcolor (11);
outtextxy (gx(-6.2,50),gy(-0.1,50),'-6');
outtextxy (gx(-5.2,50),gy(-0.1,50),'-5');
outtextxy (gx(-4.2,50),gy(-0.1,50),'-4');
outtextxy (gx(-3.2,50),gy(-0.1,50),'-3');
outtextxy (gx(-2.2,50),gy(-0.1,50),'-2');
outtextxy (gx(-1.2,50),gy(-0.1,50),'-1');
outtextxy (gx(0.1,50),gy(-0.1,50),'0');
outtextxy (gx(0.95,50),gy(-0.1,50),'1');
outtextxy (gx(1.95,50),gy(-0.1,50),'2');
outtextxy (gx(2.95,50),gy(-0.1,50),'3');
outtextxy (gx(3.95,50),gy(-0.1,50),'4');
outtextxy (gx(4.95,50),gy(-0.1,50),'5');
outtextxy (gx(5.95,50),gy(-0.1,50),'6');
outtextxy (gx(0.1,50),gy(4.05,50),'4');
outtextxy (gx(0.1,50),gy(3.05,50),'3');
outtextxy (gx(0.1,50),gy(2.05,50),'2');
outtextxy (gx(0.1,50),gy(1.05,50),'1');
outtextxy (gx(0.1,50),gy(-1.05,50),'-1');
outtextxy (gx(0.1,50),gy(-2.05,50),'-2');
outtextxy (gx(0.1,50),gy(-3.05,50),'-3');
outtextxy (gx(0.1,50),gy(-4.05,50),'-4');
end;
procedure setka;
var h,t:integer;
begin
for t:=-7 to 7 do
L (gx(t,50),gy(7,50),gx(t,50),gy(-7,50),5);
for h:=-7 to 7 do
L (gx(-7,50),gy(h,50),gx(7,50),gy(h,50),5);
end;
procedure dizkretizaciya;
begin
L (gx(-2,50),gy(1,50),gx(-2,50),gy(-0.25,50),8);
L (gx(-1,50),gy(2,50),gx(-1,50),gy(-0.5,50),8);
L (gx(0,50),gy(3,50),gx(0,50),gy(-0.75,50),8);
L (gx(1,50),gy(3,50),gx(1,50),gy(-1,50),8);
L (gx(2,50),gy(3,50),gx(2,50),gy(-1.25,50),8);
L (gx(3,50),gy(3,50),gx(3,50),gy(-1.5,50),8);
L (gx(4,50),gy(0.5,50),gx(4,50),gy(-1.75,50),8);
L (gx(1,50),gy(-1,50),gx(4.6,50),gy(-1,50),8);
L (gx(-3,50),gy(0,50),gx(4.2,50),gy(0,50),8);
L (gx(-2,50),gy(1,50),gx(3.8,50),gy(1,50),8);
L (gx(-1,50),gy(2,50),gx(3.4,50),gy(2,50),8);
end;
procedure linia;
begin
init_graph;
ris ;
outtextxy(gx(-3.25,50),gy(3.9,50),'Постройка фигуры');
outtextxy(gx(-3.25,50),gy(3.8,50),'----------------');
readkey;clrscr;clearviewport;
setka;
ris;
outtextxy(gx(-4.25,50),gy(3.9,50),'Постройка сетки шаг=1');
outtextxy(gx(-4.25,50),gy(3.8,50),'---------------------');
readkey;
clrscr;
cleardevice;
ris;
outtextxy(gx(-6.25,50),gy(3.9,50),'Постройка дискретизации области шаг=1');
outtextxy(gx(-6.25,50),gy(3.8,50),'-------------------------------------');
dizkretizaciya;
readkey;
clrscr;
clearviewport;
ris;
outtextxy(gx(-6.3,50),gy(3.9,50),'Постройка дискретизации области шаг=1');
outtextxy(gx(-6.3,50),gy(3.8,50),'-------------------------------------');
outtextxy(gx(-6.3,50),gy(3.7,50),' внутренние/внешние точки');
outtextxy(gx(-6.3,50),gy(3.6,50),' ------------------------');
dizkretizaciya;
setcolor(6);
outtextxy(gx(-0.1,50),gy(2.2,50),'1');
outtextxy(gx(0.9,50),gy(2.2,50),'2');
outtextxy(gx(1.9,50),gy(2.2,50),'3');
outtextxy(gx(2.9,50),gy(2.2,50),'4');
outtextxy(gx(-1.1,50),gy(1.2,50),'5');
outtextxy(gx(-0.1,50),gy(1.2,50),'6');
outtextxy(gx(0.9,50),gy(1.2,50),'7');
outtextxy(gx(1.9,50),gy(1.2,50),'8');
outtextxy(gx(2.9,50),gy(1.2,50),'9');
outtextxy(gx(-2.1,50),gy(0.2,50),'10');
outtextxy(gx(-1.1,50),gy(0.2,50),'11');
outtextxy(gx(-0.1,50),gy(0.2,50),'12');
outtextxy(gx(0.9,50),gy(0.2,50),'13');
outtextxy(gx(1.9,50),gy(0.2,50),'14');
outtextxy(gx(2.9,50),gy(0.2,50),'15');
outtextxy(gx(3.7,50),gy(0.2,50),'16');
outtextxy(gx(1.9,50),gy(-0.8,50),'17');
outtextxy(gx(2.9,50),gy(-0.8,50),'18');
outtextxy(gx(3.9,50),gy(-0.8,50),'19');
outtextxy(gx(-3.2,50),gy(0.2,50),'20');
outtextxy(gx(-2.2,50),gy(1.2,50),'21');
outtextxy(gx(-1.2,50),gy(2.2,50),'22');
outtextxy(gx(-0.3,50),gy(3.1,50),'23');
outtextxy(gx(0.8,50),gy(3.2,50),'24');
outtextxy(gx(1.8,50),gy(3.2,50),'25');
outtextxy(gx(3.1,50),gy(3.1,50),'26');
outtextxy(gx(3.5,50),gy(2.1,50),'27');
outtextxy(gx(3.9,50),gy(1.2,50),'28');
outtextxy(gx(4.1,50),gy(0.6,50),'29');
outtextxy(gx(4.3,50),gy(0.2,50),'30');
outtextxy(gx(4.65,50),gy(-0.9,50),'31');
outtextxy(gx(5.012,50),gy(-1.8,50),'32');
outtextxy(gx(3.95,50),gy(-1.85,50),'33');
outtextxy(gx(2.95,50),gy(-1.55,50),'34');
outtextxy(gx(1.95,50),gy(-1.35,50),'35');
outtextxy(gx(-0.1,50),gy(-0.8,50),'37');
outtextxy(gx(0.95,50),gy(-1.07,50),'36');
outtextxy(gx(-1.1,50),gy(-0.6,50),'38');
outtextxy(gx(-2.1,50),gy(-0.3,50),'39');
readkey;
closegraph;
end;
type mas1=array[1..19] of real;
var
A:masik;
B:mas1;
i,j:integer;
{***************************************************}
{Решение системы хранится в массиве В }
procedure GAUS(n:integer;var A:masik; var B:mas1);
var
l,k:integer;
r,buf:real;
begin
l:=0;
FOR i:=1 TO n do
begin
k:=i;
R:=ABS(A[i, i]);
for j:=i+1 to n do
if ABS(A[j, i])>=R then
begin
k:=j;
R:=ABS(A[j, i]);
end;
IF R = 0 THEN begin l:=1; i:=n+1; end;
IF k<>i THEN
begin
buf:=B[k];
b[k]:=B[i];
b[i]:=buf;
FOR j:=i TO n do
begin
buf:=A[k, j];
a[k,j]:=a[i, j];
a[i,j]:=buf;
end;
end;
R:=A[i, i]; B[i]:=B[i]/R;
FOR j:=i TO n do A[i, j]:=A[i, j]/R;
FOR k:=i+1 TO n do
begin
R:=A[k, i];
B[k]:=B[k]-R*B[i];
FOR j:=i TO n do A[k, j]:=A[k, j]-R*A[i, j];
end;
end;
IF l=1 THEN
begin
WriteLn('Система не имеет решений');
exit;
end;
FOR i:=n-1 DOWNTO 1 do
FOR j:=i+1 TO n do B[i]:=B[i]-A[i, j]*B[j];
WriteLn('Решение системы:');
FOR i:=1 TO n do Writeln(' ',B[i]:7:5);
writeln (' Следующее->любая клава!!!');
end;
procedure treygol(t1,t2,t3,x1,y1,x2,y2,x3,y3,x,y:real);
var
S1,g,S2,S3,D,Sl,lippa,a,b,c,S,T:real;
begin
s1:=abs(x*(y2-y3)-y*(x2-x3)+x2*y3-x3*y2);
s2:=abs(x1*(y-y3)-y1*(x-x3)+x*y3-x3*y);
s3:=abs(x1*(y2-y)-y1*(x2-x)+x2*y-x*y2);
D:=s1+s2+s3;
SL:=abs(x1*(y2-y3)-y1*(x2-x3)+x2*y3-x3*y2);
if abs(sl-d)<=0.0001
then begin
S:=x1*(y2-y3)-y1*(x2-x3)+x2*y3-x3*y2;
a:=((x-x3)*(y2-y3)-(y-y3)*(x2-x3))/s;
b:=((x-x1)*(y3-y1)-(y-y1)*(x3-x1))/s;
c:=((x-x2)*(y1-y2)-(y-y2)*(x1-x2))/s;
T:=a*T1+b*T2+c*T3;
lippa:=sqr(x)-x*y-sqr(y)+2*x-y;
clrscr;writeln;writeln;
writeln (' T=',T:3:3,' t(точная)=',lippa:3:3);
if (lippa=0) then
writeln(' Относительная погрешность =',abs(T-lippa)*100:1:2,' %')
else
writeln(' Относительная погрешность =',abs((T-lippa)/lippa)*100:1:2,' %');
writeln (' при x=',x:3:3,' y=',y:3:3);
end
else exit;
end;
procedure isk_k(t1,t3,t4,x1,y1,x3,y3,x4,y4,x,y:real);
var
tkv,lippa,hx,hy,dl,x2,y2,t2:real;
begin
hx:=x3-x4;hy:=y3-y1;
dl:=1/(hx*hy);
y2:=y1;x2:=x1+hx;
t2:=sqr(x2)-x2*y2-sqr(y2)+2*x2-y2;
if (x>=x1) and (y>=y1) and (y<=y3) and (x<=x3) then begin
tkv:=dl*((x-x2)*(y-y4)*t1-(x-x1)*(y-y4)*t2+(x-x1)*(y-y1)*t3-(x-x2)*(y-y1)*t4);
lippa:=sqr(x)-sqr(y)-x*y+2*x-y;
clrscr;writeln;writeln;
writeln (' T=',Tkv:3:3,' t(точная)=',lippa:3:3);
if (lippa=0) then
writeln(' Относительная погрешность =',abs(tkv-lippa)*100:1:2,' %')
else
writeln(' Относительная погрешность =',abs((tkv-lippa)/lippa)*100:1:2,' %');
writeln (' при x=',x:3:3,' y=',y:3:3);
end
else exit;
end;
function tconstx(t0,x1,y1,t1,x2,y2,t2:real):real;
var x0,y0:real;
begin
if ((t0>t1) and (t0
x0:=(x2-x1)/(t2-t1)*t0-(t1*x2-t2*x1)/(t2-t1);
tconstx:=x0;
end
else tconstx:=-100;
end;
function tconsty(t0,x1,y1,t1,x2,y2,t2:real):real;
var x0,y0:real;
begin
if ((t0>t1) and (t0
y0:=(y2-y1)/(t2-t1)*t0-(t1*y2-t2*y1)/(t2-t1);
tconsty:=y0;
end
else tconsty:=-100;
end;
procedure kvadrat(t1,t2,t3,t4,x1,y1,x2,y2,x3,y3,x4,y4,x,y:real);
var
tkv,lippa:real;
begin
if (x>=x1) and (y>=y1) and (y<=y3) and (x<=x3) then begin
tkv:=(x-x2)*(y-y4)*t1-(x-x1)*(y-y4)*t2+(x-x1)*(y-y1)*t3-(x-x2)*(y-y1)*t4;
lippa:=sqr(x)-sqr(y)-x*y+2*x-y;
clrscr;writeln;writeln;
writeln (' T=',Tkv:3:3,' t(точная)=',lippa:3:3);
if (lippa=0) then
writeln(' Относительная погрешность =',abs(Tkv-lippa)*100:1:2,' %')
else
writeln(' Относительная погрешность =',abs((Tkv-lippa)/lippa)*100:1:2,' %');
writeln (' при x=',x:3:3,' y=',y:3:3);
end
else exit;
end;
type ma=array[1..120,1..2] of real;
type mp=array[1..5000] of real;
type mx=array[1..50,1..2] of real;
type md=array[1..100,1..2] of real;
procedure pryamougol(vib:integer);
label G,g1,g2,g3,g4;
var
i,j,n,k,k1,kf,k5,L,k2,k3,k4:integer;
f,ff:integer;
xx,yy,h1x0,y0,buf,buf1,buf2,h1,h2,h3,h4,kf1,kf2,kf3,kf4:real;
m,mi,mix:^mx;
p,pr:^ma;
w,wx1:^mp;
st:string;
x:array [1..39] of real;
y:array [1..39] of real;
t:array [1..39] of real;
pogr:array [1..19] of real;
pogr_2:array [1..19] of real;
a:masik; my:text;tt:real;
tabl:array [1..19,1..5] of byte;
r:array [1..19,1..5] of byte;
begin
if (vib=1) then
begin
linia;
clrscr;
for i:=20 to 39 do
begin
if (i>=20) and (i<=23)
then begin
x[i]:=i-23;y[i]:=x[i]+3;
end;
if (i>=24) and (i<=26)
then
begin
x[i]:=i-23;y[i]:=3;
end;
if (i>=27) and (i<=28)
then
begin
y[i]:=29-i;x[i]:=(y[i]-10.5)/-2.5;
end;
if i=29 then
begin
x[i]:=4;y[i]:=-2.5*x[i]+10.5;
end;
if (i>=30) and (i<=32)
then begin
y[i]:=30-i;x[i]:=(y[i]-10.5)/-2.5;
end;
if (i>=33) and (i<=39) then
begin
x[i]:=37-i;y[i]:=-0.25*x[i]-0.75;
end;
t[i]:=sqr(x[i])-x[i]*y[i]-sqr(y[i])+2*x[i]-y[i];
end;
k:=0;
for j:=5 downto 1 do begin
yy:=-2+j;
for i:=1 to 8 do begin
xx:=-3+i;
if (yy<3) and (yy>-0.25*xx-0.75) and (yy<-2.5*xx+10.5) and (yy
begin
k:=k+1;x[k]:=xx;y[k]:=yy;
end;end;end;
gotoxy (2,2);
write('Внутренние-внешние точки');
gotoxy (2,3);
write (' --------------------------------------');
gotoxy (2,4);
write (' | N | x | y | T | P |');
gotoxy (2,5);
write (' --------------------------------------');
for i:=1 to 19 do begin
gotoxy(3,i+5);write ('| ',i);
gotoxy(10,i+5);write('|');
gotoxy(13,i+5);write (x[i]:1:1);
gotoxy(19,i+5);write('|');
gotoxy(22,i+5);write (y[i]:1:1);
gotoxy(28,i+5);write('| * | * |');
end;
gotoxy(2,25);
write(' --------------------------------------');
gotoxy(41,2);
writeln(' --------------------------------------');
gotoxy(41,3);
writeln(' | N | x | y | T | P |');
gotoxy(41,4);
writeln(' --------------------------------------');
for i:=20 to 39 do begin
gotoxy(41,i-15);
write(' | ',i);
gotoxy(49,i-15);write('|');
gotoxy(52,i-15);
write(x[i]:1:1);
gotoxy(56,i-15);write('|');
gotoxy(59,i-15);
write(y[i]:1:1);
gotoxy(65,i-15);write('|');
gotoxy(68,i-15);
write(t[i]:1:1);
gotoxy(75,i-15);write('|');
gotoxy(76,i-15);
write(' 0 |');
end;
gotoxy(41,25);
write(' --------------------------------------');
gotoxy(3,26);
write(' Следующее->любая клава!!!');
readkey;
clrscr;
for i:=1 to 19 do
b[i]:=0;
for i:=1 to 19 do tabl[i][1]:=i;
tabl[1][2]:=22;tabl[1][3]:=2;tabl[1][4]:=23;tabl[1][5]:=6; {+}
tabl[2][2]:=1;tabl[2][3]:=3;tabl[2][4]:=24;tabl[2][5]:=7;
tabl[3][2]:=2;tabl[3][3]:=4;tabl[3][4]:=25;tabl[3][5]:=8;
tabl[4][2]:=3;tabl[4][3]:=27;tabl[4][4]:=26;tabl[4][5]:=9;
tabl[5][2]:=21;tabl[5][3]:=6;tabl[5][4]:=22;tabl[5][5]:=11;
tabl[6][2]:=5;tabl[6][3]:=7;tabl[6][4]:=1;tabl[6][5]:=12;
tabl[7][2]:=6;tabl[7][3]:=8;tabl[7][4]:=2;tabl[7][5]:=13;
tabl[8][2]:=7;tabl[8][3]:=9;tabl[8][4]:=3;tabl[8][5]:=14;
tabl[9][2]:=8;tabl[9][3]:=28;tabl[9][4]:=4;tabl[9][5]:=15;
tabl[10][2]:=20;tabl[10][3]:=11;tabl[10][4]:=21;tabl[10][5]:=39;
tabl[11][2]:=10;tabl[11][3]:=12;tabl[11][4]:=5;tabl[11][5]:=38;
tabl[12][2]:=11;tabl[12][3]:=13;tabl[12][4]:=6;tabl[12][5]:=37;
tabl[13][2]:=12;tabl[13][3]:=14;tabl[13][4]:=7;tabl[13][5]:=36;
tabl[14][2]:=13;tabl[14][3]:=15;tabl[14][4]:=8;tabl[14][5]:=17;
tabl[15][2]:=14;tabl[15][3]:=16;tabl[15][4]:=9;tabl[15][5]:=18;
tabl[16][2]:=15;tabl[16][3]:=30;tabl[16][4]:=29;tabl[16][5]:=19;
tabl[17][2]:=36;tabl[17][3]:=18;tabl[17][4]:=14;tabl[17][5]:=35;
tabl[18][2]:=17;tabl[18][3]:=19;tabl[18][4]:=15;tabl[18][5]:=34;
tabl[19][2]:=18;tabl[19][3]:=31;tabl[19][4]:=16;tabl[19][5]:=33;
for i:=1 to 19 do begin
for j:=1 to 19 do
a[i][j]:=0;
b[i]:=0;
end;
for i:=1 to 19 do
begin
k:=tabl[i,1];k1:=tabl[i,2];k2:=tabl[i,3];
k3:=tabl[i,4];k4:=tabl[i,5];
h1:=abs(x[k]-x[k1]);h2:=abs(x[k]-x[k2]);
h3:=abs(y[k]-y[k3]);h4:=abs(y[k]-y[k4]);
a[k,k]:=-(1/(h1*h2)+1/(h3*h4));
kf1:=1/(h1*(h2+h1));kf2:=1/(h2*(h1+h2));
kf3:=1/(h3*(h4+h3));kf4:=1/(h4*(h3+h4));
if k1>19 then
b[k]:=b[k]-kf1*t[k1]
else
a[k,k1]:=kf1;
if k2>19 then
b[k]:=b[k]-kf2*t[k2]
else
a[k,k2]:=kf2;
if k3>19 then
b[k]:=b[k]-kf3*t[k3]
else
a[k,k3]:=kf3;
if k4>19 then
b[k]:=b[k]-kf4*t[k4]
else
a[k,k4]:=kf4;
end;
for i:=1 to 19 do begin {+}
for J:=1 to 19 do
write(' ',a[i][j]:1:1);
writeln;end; writeln;
clrscr;
GAUS(19,a,b);
for I:=1 to 19 do t[i]:=b[i];
readkey;
clrscr;
for i:=1 to 19 do
pogr[i]:=x[i]*x[i]-x[i]*y[i]-y[i]*y[i]+2*x[i]-y[i];
for i:=1 to 19 do
pogr_2[i]:=b[i]-pogr[i];
gotoxy(2,2);
write('Внутренние-внешние точки');
gotoxy (2,3);
write ('--------------------------------------');
gotoxy (2,4);
write ('| N | x | y | T | P |');
gotoxy (2,5);
write ('--------------------------------------');
for i:=1 to 19 do begin
gotoxy(2,i+5);write ('| ',i);
gotoxy(7,i+5);write('|');
gotoxy(9,i+5);write (x[i]:1:1);
gotoxy(13,i+5);write('|');
gotoxy(16,i+5);write (y[i]:1:1);
gotoxy(20,i+5);write('|');
gotoxy(22,i+5);write(b[i]:1:2);
gotoxy(28,i+5);write('|');
gotoxy(30,i+5);write(pogr_2[i]:1);
gotoxy(39,i+5);write('|');
end;
gotoxy(2,25);
write('--------------------------------------');
gotoxy(41,2);
writeln(' --------------------------------------');
gotoxy(41,3);
writeln(' | N | x | y | T | P |');
gotoxy(41,4);
writeln(' --------------------------------------');
for i:=20 to 39 do begin
gotoxy(41,i-15);
write(' | ',i);
gotoxy(49,i-15);write('|');
gotoxy(52,i-15);
write(x[i]:1:1);
gotoxy(56,i-15);write('|');
gotoxy(59,i-15);
write(y[i]:1:1);
gotoxy(65,i-15);write('|');
gotoxy(68,i-15);
write(t[i]:1:1);
gotoxy(75,i-15);write('|');
gotoxy(76,i-15);
write(' 0 |');
end;
gotoxy(41,25);
write(' --------------------------------------');
gotoxy(3,26);
write(' Следующее->любая клава!!!');
readkey;clrscr;
writeln(' Создается Файл!!!');
writeln(' Создается фалй с вычислениями!!');
writeln(' Создана папка "DATA". Создан в нем "result.txt"');
{$I-}
MkDir('data');
if IOResult <> 0 then begin
Writeln('Такая "DATA" директория существует!!!');
writeln;
goto G;
end
else begin
writeln (' Создана папка "DATA"!!!');
G:
Assign(my,'data/result.txt');
rewrite(my);
writeln (my,' Номера вычислительных шаблонов');
writeln(my);
for i:=1 to 19 do begin
for j:=1 to 5 do write(my,' ',tabl[i][j]);
writeln(my);end;writeln (my,'Следующее->любая клава!!!');
writeln (my, ' Формирование системы:');
for i:=1 to 19 do begin {+}
for J:=1 to 19 do
write(my,' ',a[i][j]:1:4);
writeln(my);end; writeln(my);
for i:=1 to 19 do
write(my,' ',b[i]:1:1);writeln(my);
writeln (my,' Следующее->любая клава!!!');
writeln(my,' Внутренние и внешние точки');
writeln (my,'--------------------------------------');
writeln (my,'| N | x | y | T | P |');
writeln (my,'--------------------------------------');
for i:=1 to 19 do begin
write (my,i); write(my,' ');
write (my,x[i]:1:1); write(my,' ');
write (my,y[i]:1:1); write(my,' ');
write(my,b[i]:1:2); write(my,' ');
write(my,pogr_2[i]:1); write(my,' ');
writeln(my);
end;
writeln(my,' --------------------------------------');
writeln(my,' | N | x | y | T | P |');
writeln(my,' --------------------------------------');
for i:=20 to 39 do begin
write(my,' ',i);
write(my,' ');write(my,x[i]:1:1);
write(my,' ');write(my,y[i]:1:1);
write(my,' ');write(my,t[i]:1:1);
write(my,' ');write(my,' 0 ');
writeln(my);
end;
writeln(my,' --------------------------------------');
writeln (my,'Следующее->любая клава!!!');
close(my);writeln;writeln;
writeln (' Файл "Result.txt" создан в папке "DATA"');
writeln (' Следующее->любая клава!!!');
readkey;
end;
{$I+}
end
else
begin
if vib=2 then begin
clrscr;
writeln('Нахождение температуры в любой точке области');
for i:=1 to 19 do
for j:=1 to 5 do r[i][j]:=tabl[i][j];
writeln;
write('Введите x:');readln(xx);writeln;
write('Введите y:');readln(yy);
if (yy<=3) and
(yy>=-0.25*xx-0.75) and
(yy<=xx+3) and
(yy<=-2.5*xx+10.5) then begin
if (xx=0) then begin
kvadrat(t[1],t[2],t[24],t[23],x[1],y[1],x[2],y[2],x[24],y[24],x[23],y[23],xx,yy);
kvadrat(t[6],t[7],t[1],t[2],x[6],y[6],x[7],y[7],x[1],y[1],x[2],y[2],xx,yy);
kvadrat(t[12],t[13],t[7],t[6],x[12],y[12],x[13],y[13],x[7],y[7],x[6],y[6],xx,yy);
isk_k(t[37],t[13],t[12],x[37],y[37],x[13],y[13],x[12],y[12],xx,yy);
end
else begin
treygol(t[1],t[22],t[23],x[1],y[1],x[22],y[22],x[23],y[23],xx,yy);
kvadrat(t[1],t[2],t[24],t[23],x[1],y[1],x[2],y[2],x[24],y[24],x[23],y[23],xx,yy);
kvadrat(t[2],t[3],t[25],t[24],x[2],y[2],x[3],y[3],x[25],y[25],x[24],y[24],xx,yy);
kvadrat(t[3],t[4],t[26],t[25],x[3],y[3],x[4],y[4],x[26],y[26],x[25],y[25],xx,yy);
treygol(t[4],t[26],t[27],x[4],y[4],x[26],y[26],x[27],y[27],xx,yy);
treygol(t[22],t[21],t[5],x[22],y[22],x[21],y[21],x[5],y[5],xx,yy);{+}
kvadrat(t[5],t[6],t[1],t[22],x[5],y[5],x[6],y[6],x[1],y[1],x[22],y[22],xx,yy);
kvadrat(t[6],t[7],t[2],t[1],x[6],y[6],x[7],y[7],x[2],y[2],x[1],y[1],xx,yy);
kvadrat(t[7],t[8],t[3],t[2],x[7],y[7],x[8],y[8],x[3],y[3],x[2],y[2],xx,yy);
kvadrat(t[8],t[9],t[4],t[3],x[8],y[8],x[9],y[9],x[4],y[4],x[3],y[3],xx,yy);
treygol(t[9],t[28],t[4],x[9],y[9],x[28],y[28],x[4],y[4],xx,yy);
treygol(t[27],t[4],t[28],x[27],y[27],x[4],y[4],x[28],y[28],xx,yy);
treygol(t[21],t[20],t[10],x[21],y[21],x[20],y[20],x[10],y[10],xx,yy);{+}
kvadrat(t[10],t[11],t[5],t[21],x[10],y[10],x[11],y[11],x[5],y[5],x[21],y[21],xx,yy);
kvadrat(t[11],t[12],t[6],t[5],x[11],y[11],x[12],y[12],x[6],y[6],x[5],y[5],xx,yy);
kvadrat(t[12],t[13],t[7],t[6],x[12],y[12],x[13],y[13],x[7],y[7],x[6],y[6],xx,yy);
kvadrat(t[13],t[14],t[8],t[7],x[13],y[13],x[14],y[14],x[8],y[8],x[7],y[7],xx,yy);
kvadrat(t[14],t[15],t[9],t[8],x[14],y[14],x[15],y[15],x[9],y[9],x[8],y[8],xx,yy);
treygol(t[15],t[16],t[9],x[15],y[15],x[16],y[16],x[9],y[9],xx,yy);
treygol(t[9],t[29],t[16],x[9],y[9],x[29],y[29],x[16],y[16],xx,yy);
treygol(t[28],t[29],t[9],x[28],y[28],x[29],y[29],x[9],y[9],xx,yy);
treygol(t[16],t[30],t[29],x[16],y[16],x[30],y[30],x[29],y[29],xx,yy);
treygol(t[10],t[20],t[39],x[10],y[10],x[20],y[20],x[39],y[39],xx,yy); {+}
treygol(t[10],t[11],t[39],x[10],y[10],x[11],y[11],x[39],y[39],xx,yy);
treygol(t[38],t[11],t[39],x[38],y[38],x[11],y[11],x[39],y[39],xx,yy);
treygol(t[38],t[11],t[12],x[38],y[38],x[11],y[11],x[12],y[12],xx,yy);
treygol(t[38],t[12],t[37],x[38],y[38],x[12],y[12],x[37],y[37],xx,yy);
treygol(t[13],t[12],t[37],x[13],y[13],x[12],y[12],x[37],y[37],xx,yy);
treygol(t[36],t[13],t[37],x[36],y[36],x[13],y[13],x[37],y[37],xx,yy);
kvadrat(t[36],t[17],t[14],t[13],x[36],y[36],x[17],y[17],x[14],y[14],x[13],y[13],xx,yy);
kvadrat(t[17],t[18],t[15],t[14],x[17],y[17],x[18],y[18],x[15],y[15],x[14],y[14],xx,yy);
kvadrat(t[18],t[19],t[16],t[15],x[18],y[18],x[19],y[19],x[16],y[16],x[15],y[15],xx,yy);
treygol(t[16],t[19],t[31],x[16],y[16],x[19],y[19],x[31],y[31],xx,yy);
treygol(t[16],t[30],t[31],x[16],y[16],x[30],y[30],x[31],y[31],xx,yy);
treygol(t[36],t[35],t[17],x[36],y[36],x[35],y[35],x[17],y[17],xx,yy);{+}
treygol(t[35],t[18],t[17],x[35],y[35],x[18],y[18],x[17],y[17],xx,yy);
treygol(t[35],t[18],t[34],x[35],y[35],x[18],y[18],x[34],y[34],xx,yy);
treygol(t[34],t[18],t[19],x[34],y[34],x[18],y[18],x[19],y[19],xx,yy);
treygol(t[34],t[33],t[19],x[34],y[34],x[33],y[33],x[19],y[19],xx,yy);
treygol(t[33],t[31],t[19],x[33],y[33],x[31],y[31],x[19],y[19],xx,yy);
treygol(t[33],t[31],t[32],x[33],y[33],x[31],y[31],x[32],y[32],xx,yy);
end;end
else writeln('Точка не находится в данной области!!!');
writeln;
writeln (' Следующее->любая клава!!!');readkey;
end
else begin
if (vib=3) then begin
clrscr;
writeln(' Семейство изотерм!!!');
write('t=');readln(h1);
New(pr);j:=0;
for i:=1 to 39 do
if (t[i]=h1) then begin
j:=j+1;pr^[j][1]:=x[i];pr^[j][2]:=y[i];end;
for i:=1 to 19 do begin
j:=j+1;
pr^[j][1]:=tconstx(h1,x[i],y[i],t[i],x[r[i][3]],y[r[i][3]],t[r[i][3]]);
pr^[j][2]:=tconsty(h1,x[i],y[i],t[i],x[r[i][3]],y[r[i][3]],t[r[i][3]]);
j:=j+1;
pr^[j][1]:=tconstx(h1,x[i],y[i],t[i],x[r[i][5]],y[r[i][5]],t[r[i][5]]);
pr^[j][2]:=tconsty(h1,x[i],y[i],t[i],x[r[i][5]],y[r[i][5]],t[r[i][5]]);
j:=j+1;
pr^[j][1]:=tconstx(h1,x[i],y[i],t[i],x[r[i][4]],y[r[i][4]],t[r[i][4]]);
pr^[j][2]:=tconsty(h1,x[i],y[i],t[i],x[r[i][4]],y[r[i][4]],t[r[i][4]]);
j:=j+1;
pr^[j][1]:=tconstx(h1,x[i],y[i],t[i],x[r[i][2]],y[r[i][2]],t[r[i][2]]);
pr^[j][2]:=tconsty(h1,x[i],y[i],t[i],x[r[i][2]],y[r[i][2]],t[r[i][2]]);
end;
for i:=20 to 39 do
begin
j:=j+1;
pr^[j][1]:=tconstx(h1,x[i],y[i],t[i],x[i+1],y[i+1],t[i+1]);
pr^[j][2]:=tconsty(h1,x[i],y[i],t[i],x[i+1],y[i+1],t[i+1]);
end;
j:=j+1;
pr^[j][1]:=tconstx(h1,x[20],y[20],t[20],x[39],y[39],t[39]);
pr^[j][2]:=tconsty(h1,x[20],y[20],t[20],x[39],y[39],t[39]);
j:=j+1;
pr^[j][1]:=tconstx(h1,x[20],y[20],t[20],x[21],y[21],t[21]);
pr^[j][2]:=tconsty(h1,x[20],y[20],t[20],x[21],y[21],t[21]);
for i:=1 to j-1 do begin
for k:=1 to j-1 do begin
IF pr^[k][1]>pr^[k+1][1] then begin
buf1:=pr^[k][1];buf2:=pr^[k][2];
pr^[k][1]:=pr^[k+1][1];pr^[k][2]:=pr^[k+1][2];
pr^[k+1][1]:=buf1;pr^[k+1][2]:=buf2;
end;
end;
end;
New (p);k:=0;
for i:=1 to j do begin
if (pr^[i][1]=-100) then continue
else begin
k:=k+1;p^[K][1]:=pr^[i][1];p^[K][2]:=pr^[i][2];
end;end;
Dispose(pr);
New (mi);k4:=0;
for i:=1 to k do
if (abs(p^[i][2]-3)<0.01) or (abs(p^[i][2]+0.25*p^[i][1]+0.75)<0.01) or
(abs(p^[i][2]-p^[i][1]-3)<0.01)
or (abs(p^[i][2]+2.5*p^[i][1]-10.5)<0.01) then begin
k4:=k4+1;mi^[k4][1]:=p^[i][1];mi^[k4][2]:=p^[i][2];
end
else begin
if (abs(p^[i][1]-trunc(p^[i][1]))<0.01) or
(abs(p^[i][2]-trunc(p^[i][2]))<0.01) then begin
k4:=k4+1;mi^[K4][1]:=p^[i][1];mi^[K4][2]:=p^[i][2];
end;end;
Dispose(p);
New(m);K5:=0;
for i:=1 to k4 do
if i=1 then goto G2
else
if (abs(mi^[i][2]-3)<0.01) or (abs(mi^[i][2]+0.25*mi^[i][1]+0.75)<0.01) or
(abs(mi^[i][2]-mi^[i][1]-3)<0.01)
or (abs(mi^[i][2]+2.5*mi^[i][1]-10.5)<0.01) then begin
k5:=k5+1;m^[k5][1]:=mi^[i][1];m^[k5][2]:=mi^[i][2];
end
else begin
if (abs(mi^[i][1]-mi^[i-1][1])<0.001) or (abs(mi^[i][2]-mi^[i-1][2])<0.001)
then continue
else begin
g2:
k5:=k5+1;m^[k5][1]:=mi^[i][1];m^[k5][2]:=mi^[i][2];
end;end;
for i:=1 TO K5 DO BEGIN
gotoxy(2,2+i);
write (' x=',m^[i][1]:1:3);
gotoxy(15,2+i);writeln('y=',m^[i][2]:1:3);
END;
writeln ('Следующее->любая клава!!!');
Dispose(mi);
readkey;
clrscr;
init_graph;
ris;dizkretizaciya; setcolor(14);
line(100,100,120,100);
Str(h1:1:3,st);setcolor(15);
outtextxy(125,97,'- изотерма T='+st);
setcolor(12);
readkey;
for i:=1 to k5 do
if i=1 then goto g4
else begin
setcolor(14);
if (abs(m^[i][1]-m^[i-1][1])<=sqrt(2)+0.02) then begin
line(gx(m^[i][1],50),gy(m^[i][2],50),gx(m^[i-1][1],50),gy(m^[i-1][2],50));
g4:
setcolor(14);
circle(gx(m^[i][1],50),gy(m^[i][2],50),1);
end;end;
dispose(m);
setcolor(9);
line(20,70,50,70);setcolor(15);
outtextxy(55,67,'- точная изотерма T='+st);
readkey;
New(w);New(wx1);
yy:=-2;f:=0;
repeat
xx:=-3;yy:=yy+0.01;
repeat
buf:=sqr(xx)-sqr(yy)-xx*yy+2*xx-yy;
if (yy<=3) and
(yy>=-0.25*xx-0.75) and
(yy<=xx+3) and
(yy<=-2.5*xx+10.5) then begin
if abs(buf-h1)<=0.03 then begin
f:=f+1;w^[f]:=yy;
wx1^[f]:=xx;
end;end;
xx:=xx+0.01;
until (xx>=5.02);
until (yy>=3.005);
for i:=1 to f-1 do begin
for j:=1 to f-1 do begin
IF wx1^[j]>wx1^[j+1] then begin
buf1:=wx1^[j];buf2:=w^[j];
wx1^[j]:=wx1^[j+1];w^[j]:=w^[j+1];
wx1^[j+1]:=buf1;w^[j+1]:=buf2;
end;
end;
end;
for i:=1 to f do
putpixel (gx(wx1^[i],50),gy(w^[i],50),9);
dispose(w);dispose(wx1);readkey;
closegraph;
end
else begin
writeln(' Следующее->любая клава!!!');readkey;
end;end;end;end;
procedure menu;
Label M;
var
vibor:char;u,v:integer;
begin
u:=0;v:=0;
M:
clrscr;
writeln (' Меню:1.Создание рисунков/сетки/температур во внутренних точках;');
writeln (' 2.Нахождение температуры в любой точке области');
writeln (' 3.Семейство изотерм Выход-любая клава');
write(' Введите действие:');
readln(vibor);
case vibor of
'1':begin
pryamougol(1);u:=1;goto M;
end;
'2':begin
if u=1 then begin
pryamougol(2);v:=1;goto M;end
else begin
writeln(' Ошибка!!!Нажми 1-й пункт');
readkey;goto M;
end;
end;
'3':begin
if u=1 then begiN
if v=1 then begin
pryamougol(3);goto M;end
else begin
writeln(' Ошибка!!!Нажми 2-й пункт'); readkey;goto M;
end;
end
else begin
writeln(' Ошибка!!!Нажми 1-й пункт'); readkey;goto M; end;
end;else exit;end;end;
begin
clrscr;menu;end.