Сохрани и опубликуйсвоё исследование
О проекте | Cоглашение | Партнёры
Выпускная квалификационная работа 01.03.02 Прикладная математика и информатика
Источник: Белгородский государственный университет - национальный исследовательский университет (НИУ «БелГУ»)
Комментировать 0
Рецензировать 0
Скачать - 3,4 МБ
Enter the password to open this PDF file:
-
4 ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ» ( Н И У « Б е л Г У » ) ИНСТИТУТ (ФАКУЛЬТЕТ) Инженерных технологий и естественных наук Кафедра Общей математики Численное решение смешанной задачи для параболического уравнения дробного порядка Выпускная квалификационная работа студента очной формы обучения направления подготовки 01.03.02 «Прикладная математика и информатика (код, наименование направления подготовки) 4 курса группы 07001206 Филимонов Михаил Алексеевич Научный руководитель: ____________________ (Профессор Глушак А.В.) БЕЛГОРОД 2016
5 ОГЛАВЛЕНИЕ Введение 7 1. Краевые задачи для нагруженного уравнения теплопроводности с конвенцией ................................................................................................................. 18 1.1. Первая краевая задача для стационарного нагруженного уравнения дифузии ............................................................................................................... 18 1.2. Построение разностной схемы. Устойчивость и сходимость ................ 19 1.3. Первая краевая задача для нагруженного стационарного уравнения .. 21 1.4. Построение разностной схемы. Устойчивость и сходимость ................ 25 1.5. Третья краевая задача для нагруженного стационарного уравнения .... 27 1.6. Построение разностной схемы. Устойчивости и сходимости ............... 28 1.7. Первая краевая задача для нагруженного уравнения .............................. 32 1.8. Разностные схемы. Устойчивость и сходимость ..................................... 34 1.9. Нелокальная краевая задача первого рода ............................................... 36 1.10. Построение разностных схем. Устойчивость и сходимость ................ 41 1.11. Нелокальная краевая задача второго рода ............................................. 42 1.12. Построение разностных схем. Устойчивость и сходимость ................ 43 2. Обзор объектно-ориентированного языка программирования C# .................. 44 2.1. История развития языка программирования C# ................................... 44 2.2. Основные возможности языка C# ............................................................. 45 2.3. Структура программы на языке C#. ....................................................... 47 2.4. Сопоставления типов-значений и ссылочных типов ............................ 48 2.5. Элементарные типы языка C#. ................................................................ 49 2.6. Оператор перечисления ........................................................................... 50
6 2.7 Операторы typeof и sizeof в языке программирования C#..........................50 2.8 Оператор Struct языка программирования C#..............................................51 2.9 Пространства имен…………………………………………………………..52 2.10 Оператор блока в языке C#...........................................................................53 2.11 Описание локальной переменной в языке C#.............................................54 2.12 Преимущества языка программирования C#..............................................55 2.13 Недостатки языка программирования C#...................................................55 3. Численное решение уравнения с дродной производной ................................ 51 3.1 Алгоритм, способы и методы реализации численного решения уравнения с дробной производной ................................................................... 51 3.2. Вычисление приближенного значения решения при различных начальных параметрах задачи .......................................................................... 59 Заключение ................................................................................................................ 62 Список использованной литературы ....................................................................... 63 Приложение 1 ............................................................................................................ 65
7 Введение Дифференциальные уравнения являются неотъемлемой частью не только математики, но и физики, математической биологии, химии и так далее. Например, вопросы, связанные с процессом диффузии частиц в турбулентной плазме влаги в почвах и грунтах, а также с процессом распространения тепла в тонком нагретом стержне, если задан закон изменения общего количества тепла стержня, приводят к нагруженным дифференциальным уравнениям и нелокальным задачам для дифференциальных уравнений математической физики. Нелокальные задачи типа Бицадзе-Самарского для уравнений Лапласа и теплопроводности сведены к локальным задачам для нагруженных уравнений. Этот факт используется в ряде работ для численного решения нелокальных задач математической физики. Рассматривая толщу почвы от поверхности земли до уровня грунтовых вод, видно, что в данной зоне влагоперенос, в случае движения влаги в вертикальном направлении под воздействием силы тяжести и капиллярного давления, описывается диффузионной моделью (0.1) где, – диффузивности; объемная влажность почвы; – коэффициент – коэффициент влагопроводности. Чудновский А.Ф. в одной из своих работ обратил внимание на недостаточно критический подход к формулировке граничных условий и впервые сформулировал задачу с нелокальным условием: , (0.2) (0.3) . (0.4)
8 Нелокальное условие (0.2) означает, что в поток влаги через поверхность равен содержанию влаги в активном слое почвы от 0 до α. Камынин Л.И. в своей работе рассматривал для параболического уравнения второго порядка общего вида нелокальное условие вида где – известные функции. Также Самарским А.А. была поставлена задача с нелокальным условием общего вида для параболических уравнений: При изучении популяционных моделей возникает другой класс нелокальных условий. Пусть – плотность численности популяции возраста времени . Тогда в момент является решением нелокальной задачи (0.5) (0.6) (0.7) где – начальное возрастное распределение, а условие (0.7) называется законом рождаемости. Здесь следует заметить, что задачи, возникающие в математической биологии, как правило нелокальные. Метод Фурье доказывает существование единственности решения нелокальной задачи
9 К результатам работы Самарского А.А. близко примыкают результаты Шополова Н.Н. Ознакомившись с работами Ильина В.А. и Моисеева Е.И. «Нелокальная задача для оператора Штурма-Лиувилля в дифференциальной и разностной трактовках» и «Нелокальная краевая задача второго рода для оператора Штурма-Лиувилля» для обыкновенного дифференциального уравнения , изучены нелокальные задачи: где – фиксированные точки интервала (0.1); где – поток через сечение , – постоянные числа. В этих же работах получены априорные оценки в нормах дифференциальной и разностной трактовках. в Равномерно сходящиеся разностные схемы для нелокальной задачи построены следующим образом: В работе Ионкина Н.И. «Разностные схемы повышенного порядка точности для одной неклассической краевой задачи» построены схемы повышенного порядка точности для решения нелокальной задачи
10 Гордезиани Д.Г. в ряде своих работ для решения нелокальных задач использовал иной подход, который заключается в сведении нелокальных задач использовал иной подход, который заключается в сведении нелокальных задач к локальным с помощью итерационного метода. При этом дается оценка скорости сходимости итерационного метода. При этом дается оценка скорости сходимости итерационного процесса. Идея обобщения понятия дифференцирования на нецелые возникла с самого зарождения дифференциального исчесления, первые работы в этом направлении принадлежат Г.Лейбницу, Я. Бернулли, Л.Эйлеру и Ж.Фурье. В 1832 – 1837 г.г. появляется серия работ Лиувилля, сделавших его создателем теории дробного исчисления. В работах Б.Римана, Х.Хольмгрена, А.Летникова, А.Грюнвальда было продолжено изучение производных любого порядка. Что касается дифференциальных уравнений дробного порядка, то к первым работам по данной теории следует отнести L.O`Shaughnessy, S.Mandelbrojt. Задачу типа Коши для уравнения рассмотрели E.Pitcher, W.E.Sewell в своей работе, в которой они доказали теорему существования и единственности решения рассматриваемой задачи. В дальнейшем эти результаты были значительно обобщены в работы M.A.Bassam, A.Z.Al.Abedeen, H.L.Arora, где получен ряд результатов, аналогичных теоремам из теории обыкновенных дифференциальных уравнений. В работе А.М.Нахушева изучена задача Штурма-Лиувилля для дифференциального уравнения дробного порядка
11 – непрерывные на [0, 1] функции. Для этого уравнения редуцируются многие прямые и обратные задачи для уравнения смешанного гиперболо-параболического типа. Т.С. Алероев в своих работах исследовал спектр задачи Дирихле для дифференциального уравнения Показано, что задача не имеет отрицательных собственных значений. Еще раньше А.М. Нахушевым было показано, что число является собственным значением задачи для этого уравнения тогда и только тогда, когда является нулем функции Миттаг-Леффлера Целью работы является постановка и исследование: краевых задач для нагруженного уравнения теплопроводности и дифференциальной и разностной трактовке, нелокальных краевых задач типа Бицадзе-Самарского и Самарского-Ионкина для уравнения теплопроводности с переменными коэффициентами в дифференциальной трактовке; краевых задач для волнового уравнения с дробно-производной по времени в дифференциальной трактовке, а так же нахождение численного решения смешанной задачи для параболического уравнения дробного порядка и реализация его на ЭВМ, опираясь на научные литературные источники, а также опыт и знания полученные во время обучения. В работе используется: метод энергетических неравенств и свойств функции Грина при получении априорных оценок для решений рассматриваемых дифференциальных и разностных задач, методы теории
12 дифференциальных уравнений с частными производными и операторов дробного интегро-дифференцирования. Также в работе рассматриваются основные особенности, функции и операторы языка программирования C#, его преимущества и недостатки, на котором реализуется практическая часть работы. Работа несет теоретический и практический характер. К теоретической части относится теория нагруженных уравнений и нелокальных краевых задач для стационарного и не стационарного уравнения теплопроводности с переменным коэффициентом, опираясь на литературные источники и научные статьи. В практической части реализация численного решения смешанной задачи для параболического уравнения дробного порядка на ЭВМ. Методы исследования могут быть применены для решения широкого класса краевых задач для дифференциальных уравнений параболического типа. Разностные схемы, построенные для рассматриваемых задач, могут быть использованы при решении прикладных задач, приводящих к данным уравнениям. Основное содержание работы Глава 1. Посвящена исследованию краевых задач для нагруженного стационарного и нестационарного уравнения управления теплопроводности. Нелокальных краевых задач первого и второго пода для уравнений теплопроводности с переменными коэффициентами. 1. Первая краевая задача для стационарного нагруженного уравнения диффузии. Первая краевая задача: (0.8) (0.9)
13 где – фиксированная точка интервала (0,1). Если считать, что коэффициенты уравнения (0.8) удовлетворяют условиям гладкости, , где – класс функции, имеющих непрерывные на отрезке [0,1] производные до порядка n включительно. Для решения задачи (0.8) – (0.9) справедлива априорная оценка (0.10) Из которой следует единственность и непрерывная зависимость решения задачи (0.8) – (0.9) от входных данных. На отрезке [0,1] введем равномерную сетку , с шагом , – сеточная функция, заданная на . Если дифференциальной задаче (0.8) – (0.9) поставим в соответствие разностную схему второго порядка аппроксимации, то (0.11) Для решения задачи (0.11) получен дискретный аналог априорной оценки (0.10): (0.12) Из которой следует сходимость решения разностной задачи к решению дифференциальной задачи (0.8) – (0.9) со скоростью . 2. Первая краевая задача для нагруженного стационарного уравнения теплопроводности с конвекцией. Рассматривая первую краевую задачу для нагруженного уравнения (0.13) (0.14)
14 где – фиксированная точка интервала (0, 1), Можно считать, что коэффициенты уравнения (0.13) удовлетворяют условиям гладкости, . Если выполнено условие , то для решения задачи (0.13) справедлива априорная оценка . Из априорной оценки следует единственность и непрерывная зависимость решения задачи (0.13) – (0.14) от входных данных. Дифференциальной задаче (0.13) – (0.14) поставим в соответствие разностную схему второго порядка аппроксимации (0.15) где . Если выполнено условие , то справедлива оценка (0.16) Из априорной оценки (0.16) следует сходимость решения разностной задачи к решению дифференциальной задачи (0.13) – (0.14) со скоростью . 3. Третья краевая задача для нагруженного стационарного уравнения теплопроводности с конвенцией. Рассматрим третью краевую задачу:
15 (0.17) , где Возможно поставить в соответствие задаче (0.17) разностную схему второго порядка аппроксимации. (0.18) где Если выполнено условие , где , то для решения задачи (0.18) справедлива априорная оценка Откуда следует сходимость разностной схемы в равномерной метрике со скоростью 4. Первая краевая задача для нагруженного уравнения теплопроводности с конвенцией. Первая краевая задача: (0.19) (0.20)
16 где – фиксированная точка (0, 1). Для решения задачи (0.19) – (0.20) справедлива априорная оценка (0.21) где Из априорной оценки (0.21) следует единственность и непрерывная зависимость решения задачи (0.19) – (0.20) от входных данных. В вводится сетка с шагами Дифференциальной задаче (0.19) – (0.20) можно поставить в соответствие разностную задачу (0.22) где Теорема 1. Пусть выполнены условия Тогда при всех справедлива априорная оценка (0.23) где не зависит от и . Из оценки (0.23) следует сходимость решения разностной задачи (0.22) со скоростью на слое. в сеточной норме
17 5. Нелокальная краевая задача первого рода. В прямоугольнике можно изучить краевую задачу (0.24) (0.25) (0.26) где , всюду на Дальше можно задачи предполагать (0.24) – существование решения (0.26); Для решения задачи (0.24) – (0.26) справедлива априорная оценка (0.27) Из априорной оценки (0.27) следует единственность и непрерывная зависимость решения задачи (0.24) – (0.26) от входных данных. Дифференциальную задачу (0.24) – (0.26) можно заменить разностной схемой (0.28) (0.29) (0.30) Где Теорема 2. Если выполнены условия , всюду на , то при для
18 решения разностной задачи (0.28)–(0.30) справедлива априорная оценка (0.31) где – известное число не зависящее от и . Из оценки (0.31) следует устойчивость и сходимость разностной схемы (0.28) – (0.30) к решению дифференциальной задачи (0.24) – (0.26) со скоростью в смысле нормы . 6. Нелокальная краевая задача второго рода Дана краевая задача (0.32) (0.33) (0.34) Для решения задачи (0.32) – (0.34) справедлива априорная оценка (0.35) Из априорной оценки (0.35) следует единственность и непрерывная зависимость решения задачи (0.32) – (0.34) от входных данных. Дифференциальной задаче (0.32) – (0.34) можно поставить в соответствие разностную схему (0.36) (0.37) (0.38) где
19 Разностная схема (0.36) – (0.38) имеет порядок аппроксимации , и совпадает с разностной схемой при для уравнения с постоянными коэффициентами. Теорема 3. Если выполнены условия , всюду на при для решения , то разностной задачи (0.36)-(0.38) справедлива априорная оценка (0.39) где – известная постоянная не зависящая от и . Глава 2. В данной главе рассматриваются вопросы, относящиеся к понятиям аппарата, истории развития, а также преимущества и недостатки языка программирования C# в сравнении с другими объектно- ориентированными языками программирования и его прародителями. Рассматриваются особенности и расширенные возможности данного языка программирования. Таким образом, определено место языка программирования C# в семействе подобных ему языков и общей классификации. Стоит отметить, что исследование языка программирования C# следует проводить в сравнении с аналогами, прежде всего, с такими хорошо известными языками программирования, как Java и Visual Basic. Первый представляет собой потенциально независимое от программной платформы (и операционной системы) средство создания программного обеспечения, а второй – относительно простой в освоении объектно-ориентированный язык программирования производства компании Microsoft. Исследование основных выразительных возможностей синтаксиса языка программирования C# иллюстрируется примерами фрагментов
20 программ с необходимыми комментариями. Особое внимание стоит уделить общей структуре программы на языке C#. Сравнительный анализ языка C# в семействе современных языков ООП должен сопровождаться выводами относительно преимуществ и недостатков принципов реализации и синтаксиса языка. Глава 3. В данной главе описывается алгоритм и постановка задачи, а также методы с помощью которых составляется программа реализующая численные решение смешанной задачи дифференциального уравнения дробного порядка. Глава поделена на две части. В первой части указаны вспомогательные библиотеки, составляющие подпрограммы и вспомогательные модули, а также основные формулы и вычисления, исходя из которых, реализуется сама программа. Во второй части описаны примеры вычисления и полученные графики функции при различных значениях параметров. Также приведены примеры когда решение может или не может существовать и какие графики отображаются в тех или иных случаях.
21 Глава 1 Краевые задачи для нагруженного уравнения теплопроводности с конвенцией 1.1 Первая краевая задача для стационарного нагруженного уравнения диффузии. Рассматрим первую краевую задачу (1.1) (1.2) где -фиксированная точка интервала (0,1). Можно считать, что коэффициенты уравнения (1.1) удовлетворяют условиям гладкости, гладкости несколько Условия завышены, они потребуются при построении разностных схем второго порядка аппроксимации. Сначала можно получить априорную оценку для решения задачи (1.1)(1.2). Для чего умножим уравнение (1.1) скалярно на : (1.3) Из тождества (1.3), с учетом граничных условий (1.2), получается (1.4) Так как то из равенства (1.4) можно найти
22 или при (1.5) Чтобы оценить через норму , можно записать представление (1.6) где -функция Грина оператора . Из представления (1.6) можно найти (1.7) В силу того, что из (1.7) получается (1.8) Из (1.5) и (1.8), очевидно, следует оценка (1.9) где – известное положительное число. Аналогично, методом энергетических неравенств используя оценки (1.8) и (1.9) легко получить априорную оценку (1.10) 1.2 Построение разностной схемы. Устойчивость и сходимость На отрезке [0,1] можно ввести равномерную сетку , с шагом Поставляя , - сеточная функция, заданная на дифференциальной задаче (1.1)-(1.2) разностную схему второго порядка аппроксимации в . соответствие
23 (1.11) Умножая уравнение (1.11) скалярно на : (1.13) Оценивая слагаемые, входящие в тождество (1.12): (1.13) Можно записать представление (1.14) где -разностная функция Грина. С помощью представления (1.14) можно алгебраических уравнений относительно неизвестных получить систему : (1.15) Из системы (1.15) можно найти
24 (1.16) (1.17) Так как , то из (1.16) и (1.17) следует (1.18) Подставляя (1.13), (1.18) в тождество (1.12) при соответствующем выборе , можно получить (1.19) Умножая уравнение (1.11) скалярно на и используя оценку (1.19), находится (1.20) Если ввести обозначение . Тогда для погрешности имеется задача (1.21) Применяя оценки (1.19), (1.20) к решению задачи (1.21), получается 1.3 Первая краевая задача для нагруженного стационарного уравнения Первая краевая задача для нагруженного уравнения выглядит следующим образом: (1.22) где -фиксированная точка интервала (0, 1), ,
25 Считая, что коэффициенты уравнения (1.22) удовлетворяют условиям гладкости, Условия гладкости несколько защищены, они потребуются при построении разностных схем второго порядка аппроксимации. Сначала следует получить априорную оценку для решения задачи (1.22). Для чего нужно умножить уравнение (1.22) скалярно на : (1.23) после чего можно преобразовать слагаемые, входящие в равенство (1.23) где - произвольное положительное число. Подставляя последнее соотношение в тождество (1.23), можно найти (1.24) Так как то из (1.25) при получается, что (1.25) Как видно из равенства (1.25), для получения априорной оценки в норме необходимо оценить через норму правой части уравнения (1.22). Перепишем задачу (1.22) несколько иначе: (1.26)
26 Решение задачи (1.26) можно записать с помощью функции Грина оператора (1.27) Из представления (1.28) можно найти (1.28) Чтобы получить оценку для через -норму правой части уравнения (1.22), достаточно получить оценку производной функции Грина. Выражение для функции Грина может быть получено в явном виде: (1.29) где -решения следующих задач Коши: По аналогии с [61] можно положить сначала . Тогда функция Грина определяется согласно формуле (1.30), Так как находятся в явном виде , то (1.30) Пусть теперь . Положим -функция Грина для случая где Для получаем задачу
27 (1.31) В силу принципа максимума , то есть (1.32) Можно взять производную по Тогда для от обеих частей уравнения (1.31). получим задачу (1.33) Можно записать представление решения задачи (1.33): Откуда с помощью (1.30) и (1.32) можно найти Так как то получаем оценку (1.34) Возвращаясь к равенству (1.28), при выполнении условия , имеем (1.35) где -известное положительное число. Из оценки (1.25) с помощью (1.35) можно найти Пусть еще дополнительно выполнены условия Тогда справедлива оценка
28 где -некоторое положительное число. Замечание. Если условие нарушено, то задача (1.22), вообще говоря, некорректно поставлена. Пример. Здесь . Функция является решением рассмотренной однородной задачи. 1.4 Построение разностной схемы. Устойчивость и сходимость На отрезке [0, 1] введена равномерная сетка , с шагом Дифференциальной -сеточная функция, заданная на . задаче поставить (1.22)-(1.23) можно в соответствие разностную схему второго порядка аппроксимации , где , (1.37) . Шаг сетки условие выдран достаточно малым, чтобы выполнить . Можно умножить уравнение (1.37) скалярно на y: (1.38) . Входящие в тождество (1.38) суммы следует преобразовать:
29 Если подставить последние соотношения в (1.38) при , то можно получить оценку (1.39) Из (1.39) видно, что для получения априорной оценки необходимо оценить через норму правой части разностной функцией Грина . Для этого можно воспользоваться , которая определяется из условий С помощью функции Грина можно записать представление (1.40) Из представления (1.40) находится (1.41) Так как для функции Грина справедливы равномерные оценки
30 для всех , то из представления (1.41) можно вывести оценку при . (1.42) С помощью (1.42) из (1.39) можно получить окончательную оценку , где - (1.43) положительная постоянная, не зависящая от . Из оценки (1.43) следует сходимость схемы (1.37) со скоростью при к решению исходной задачи (1.22)-(1.23) в сеточной норме . 1.5 Третья краевая задача для нагруженного стационарного уравнения Третья краевая задача: (1.44) где Путем поиска решения задачи в виде и где соответственно решения краевых задач, можно к решению задачи (1.44) подойти иначе. (1.45)
31 (1.46) С помощью решения задач (1.45) и (1.46) решение задачи (1.44) записывается в виде (1.47) Численное решение задачи (1.44) сводится к двум прогонкам для нахождения и . При вычислении , следует воспользоваться формулами второго порядка аппроксимации [25]: где -шаг сетки, , . Так как вычисление производных по формулам , может привести к существующей потере точности, то нужно воспользоваться формулами потокового варианта метода прогонки [20]. 1.6 Построение разностной схемы. Устойчивости и сходимости. Предлагаемый выше подход для численного решения краевых задач для обыкновенных дифференциальных уравнений не переносится на случай уравнений с частными производными. Поэтому построим непосредственно для исходной задачи (1.44) разностную схему второго порядка аппроксимации.
32 (1.48) где Можно заметить, что повышая порядок аппроксимации разностной схемы до второго порядка для нагруженных дифференциальных уравнений естественным образом можно придти к разностной краевой задаче с нелокальным условием (1.48). Решение задачи (1.48) будем искать в виде (1.49) где -решения следующих задач: (1.50) (1.51) Из (1.49)-(1.51) можно найти (1.52) Решения , находятся обычным образом с помощью формул прогонки. Для нахождения надо воспользоваться формулой (1.52). Для оценки решения задачи (1.48) нужно ввести разностную функцию Грина , определяемую условиями [61]:
33 Функция Грина может быть представлена в виде где и Если находятся из условий , то (1.53) Из (1.53) получается, что где -функция Грина оператора при . Если обозначить , то , (1.54) (1.55) В силу принципа максимума имеется , где Взяв левую разностную производную по (1.54). Тогда, для , получается , . от обеих частей уравнения
34 Построение функции , является решением задачи Тогда в силу теоремы сравнения [61] имеется . Учитывая полученные оценки из неравенства Решение задачи (1.51) с помощью функции Грина может быть представлено в форме Откуда следует Из определения (1.52) следует априорная оценка Откуда следует сходимость разностной схемы в равномерной метрике со скоростью .
35 1.7 Первая краевая задача для нагруженного уравнения Первая краевая задача: (1.56) (1.57) (1.58) где -фиксированная точка (0, 1). Уравнение (1.56) можно скалярно умножить на : (1.59) Входящие в тождество (1.59) интегралы можно преобразовать следующим образом: (1.60) Подставляя (1.60) в тождество (1.59) и выбирая , можно найти:
36 (1.61) Так как то из неравенства (1.61) получается (1.62) где Проинтегрируя неравенство (1.62) по от 0 до , затем применяя лемму 1.1 из [39], можно получить априорную оценку (1.63) где Из априорной оценки (1.63) следует единственность и непрерывная зависимость решения задачи (1.56)-(1.58) от входных данных. 1.8 Разностные схемы. Устойчивость и сходимость В введем сетку с шагами Дифференциальной задаче соответствие разностную задачу , (1.56)-(1.58) . можно поставить в
37 (1.64) где , . Для того, чтобы получить априорную оценку для решения задачи (1.64) следует умножить уравнение (1.64) скалярно на : (1.65) где Далее идет преобразование слагаемых входящих в (1.65): (1.66) где Следует оценить слагаемые в правой части выражения (1.66): Правую часть (1.65) следует оценить обычным образом:
38 Подставляя полученные оценки в тождество (1.65) и выбирая , можно найти (1.67) где Лемма 1. Для функции , заданной на сетке , справедливо неравенство (1.68) где -произвольная постоянная. Из (1.67) и (1.68) следует При малом (1.69) где и известные положительные постоянные. Далее следует просуммировать (1.69) по от 0 до : Или (1.70) На основании леммы 4 из (1.70) находится априорная оценка (1.72)
39 где -некоторая постоянная, зависящая от . Итак, справедлива следующая теорема Теорема 1. Пусть выполнены условия . Тогда при всех справедлива априорная оценка , (1.73) где -не зависит от и . Из оценки (1.73) следует сходимость решения разностной задачи (1.64) со скоростью в сеточной норме на слое . 1.9 Нелокальная краевая задача первого рода В прямоугольнике рассматривается краевая задача (1.74) (1.75) (1.76) где , всюду на . В дальнейшем можно предполагать существование решения задача (1.74)-(1.76); и . Условия гладкости несколько завышены, они понадобятся при построении разностных схем второго порядка аппроксимации.
40 С помощью леммы 2 доказывается следующее утверждение Лемма 2. Для любой функции справедливы неравенства: (1.77) (1.78) где – произвольное положительное число, Доказательство. При . , следует неравенство (1.79) Проинтегрировав неравенство (1.79) по от 0 до , приходим к неравенству (1.80) Из неравенства (1.80) при следует неравенство (1.77), где . Проинтегрировав очевидное неравенство по от 0 до приходим к неравенству С учетом (1.77) из последнего неравенства следует неравенство Из этого неравенства при следует неравенство (1.78), где . Для того, что бы получить априорную
41 оценку для решения задачи (1.74)-(1.76) следует умножить уравнение (1.74) на и проинтегрировать по от 0 до : . (1.81) Преобразование слагаемых, входящих в тождество (1.81): (1.82) Подставив (1.82) в тождество (1.81), можно прийти к неравенству . Следует проинтегрировать неравенство (1.83) по (1.83) от 0 до (1.84)
42 Откуда следует неравенство (1.85) В силу неравенств (1.77) м (1.78) из (1.85) получается Из последнего неравенства при , следует неравенство (1.86) где . Проигнорировав неравенство (1.86) по от 0 до , и применив лемму, получается (1.87) Из неравенств (1.78) и (1.87) следует априорная оценка (1.88) Действительно, из неравенства (1.87) следуют неравенства: (1.89) (1.90) Из неравенства (1.78) при имеется (1.91) Проинтегрировав (1.91) по от 0 до можно придти к неравенству (1.92)
43 Из неравенств (1.89), (1.90) и (1.92) следует оценка (1.88). Из априорной оценки (1.88) следует единственность и непрерывная зависимость решения задачи (1.74)-(1.76) от входных данных. Стоит обратить внимание, что при при всех всюду на и , из (1.84) можно получить более точное неравенство, аналогичное неравенству (1.87) не пользуясь леммой 2. Предложенным в этом пункте методом можно получить оценку аналогичную оценке (1.88) в случае нелокального условия , где -фиксированное число. При этом первое краевое условие можно заменить условием . 1.10 Построение разностных схем. Устойчивость и сходимость. В прямоугольнике можно ввести сетку , где Дифференциальную задачу (1.74)-(1.76) можно заменить разностной схемой , (1.93) (1.94) (1.95) где . Разностная схема (1.93)-(1.95), имеет порядок аппроксимации Лемма 3. Для любой функции заданной на сетке , справедливы неравенства (1.96)
44 (1.97) где - произвольное число, Доказательство. Справедливо неравенство (1.98) Далее следует умножить неравенство (1.98) на и просуммировать по от 0 до (1.99) Из (1.99), при следует неравенство (1.96), где Справедливо неравенство Умножив на и просуммирорав неравенство (1.100) по от до , и учитывая неравенство (1.96), можно придти к неравенству (1.97), где . Можно предполагать, что . В этом случае . Из леммы 3 вытекает Теорема 2. Если выполнены условия , всюду на , то при для реше- ния разностной задачи (1.93)-(1.95) справедлива априорная оценка где - известное число не зависящее от и .
45 Из оценки (1.101) следует устойчивость и сходимость разностной схемы (1.93)-(1.95) к решению дифференциальной задачи (1.74)-(1.76) со скоростью в смысле нормы . Аналогично дифференциальной задаче (1.74)-(1.76), для разностной задачи (1.93)-(1.95), при на и можно получить более точное неравенство вида (1.108) не пользуясь неравенствами леммы 2. 1.11 Нелокальная краевая задача второго рода В этом пункте рассматривается нелокальная краевая задача второго рода в дифференциальной форме В задаче (1.74)-(1.76) граничные условия (1.75) можно заменить граничными условиями и рассмотреть нелокальную краевую задачу (1.74), (1.76), (1.109). Если предполагать существование решения указанной выше нелокальной краевой задачи, то для того, чтобы получить априорную оценку для решения данной задачи следует умножить уравнение (1.74) на и проинтегрировать по от 0 до . Затем следует ряд преобразований, которые позволяют получить априорную оценку Из априорной оценки (1.118) следует единственность и непрерывная зависимость решения задачи (1.74), (1.76), (1.109) от входных данных. Можно получить априорную оценку аналогичную (1.118), в случае нелокального условия , где - фиксированное
46 число. Для чего неравенство (1.112) проинтегрируем по неравенствами аналогичными неравенствам (1.114) при и воспользуемся . 1.12 Построение разностных схем. Устойчивость и сходимость Дифференциальной задаче (1.74), (1.76), (1.109) можно поставить в соответствие разностную схему Разностная схема (1.119)-(1.121) имеет порядок аппроксимации и совпадает с разностной схемой предложенной в работе [15] при для уравнения с постоянными коэффициентами. Аналогично предыдущему, устанавливается Теорема 3. Если выполнены условия , всюду на для решения , то при разностной задачи (1.119)-(1.121) справедлива априорная оценка где - известная постоянная не зависящая от и .
47 Глава 2 Обзор объектно-ориентированного языка программирования C#. 2.1 История развития языка программирования C# C# (произносится «си шарп») — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270. Исторически, корни С – образных языков программирования, которые в дальнейшем привели к появлению C#, ведут к 60-м годам, к тому моменту, когда появился распространенным язык программирования представителем Этот язык является императивных языков B. ранних программирования. Язык B появился в 1963 году, основным создателем которого является Массачусетса К. (MIT). Томпсон Самой из Технологического главной целью университета разработки языка программирования B была реализация операционной системы UNIX. Язык PL/I, который уже существовал на тот момент и применялся для мейнфреймов производства компании IBM, являлся достаточно громоздким и не подходил для реализации поставленной задачи, что дало толчок для поиска новых решений ученых-практиков, который привел к появлению на свет более практичного и менее громоздкого языка B. В 1972 году, на основе языка B был изобретен новый язык С, который и по сей день является одним из основных языков программирования. Авторами нового языка программирования являлись, по большей части, те же люди, который разрабатывали язык В. В список разработчиков входят: Кен Томпсон и Деннис Ричард, которые работали, в тот момент, в исследовательской лаборатории компании AT&T. По сути язык С является расширенным языком В, за счет явного использования типов, структур и ряда
48 новых операций. Стоит также отметить, что языки и теории с типами имеют существенные преимущества перед бестиповами аналогами. В течении следующих 12 лет, после появления языка С, в 1984 году Б. Страуструп выступил с проектом ООП-расширения языка С, в котором вводится понятие класса как объекта данных. Рик Маскитти, сотрудник все той же организации, для нового языка предложил название С++. Более чем через 15 лет, в 2000 году, корпорация Microsoft выпустила язык С++ нового поколения, под девизом: «всякая сущность есть объект», и назвала его C#. Основанием нового языка является строгая компонентная архитектура. Стоит отметить, что язык C# реализует передовые механизмы обеспечения безопасности кода. 2.2 Основные возможности языка C# Язык C# унаследовал целый ряд конструктивных синтаксических механизмов и особенности реализации от своих прародителей, а именно: C++, Visual Basic и Java. Но, несмотря на это, возможности нового языка не ограничиваются суммой возможностей его исторических предшественников. Если не обращать внимания на существенные различия между компонентной объектной моделью основного стандарта Microsoft для компонентного проектирования и реализации программного обеспечения COM и моделью Java Beans, базовый стандарт Sun Microsystem для компонент, зависимой от языка реализации, язык программирования C# имеет много общего с языком Java. А также, много черт язык программирования C# унаследовал от свое прародителя Visual Basic, который был создан корпорацией Microsoft. Данные языки имеют сходство в построении алгоритма, в семантике, а также в некоторых элементах синтаксиса.
49 Наиболее характерные черты сходства языков программирования C# и Java, прежде всего, это то, что оба языка относятся к категории объектноориентированных и предполагают единственность наследования. Также стоит отметить, что у языков C# и Java схожи механизмы интерфейсов, обработки исключительных ситуаций и нитей. Сходным образом, в данных языках, происходит сборка мусора и пространства имен, а также оба языка программирования характеризуются строгой динамической загрузкой и типизацией кода при выполнении программы. Что касается сходства с языком программирования С++, то язык C# включает в себя унаследованные «перегруженные» операторы, множество особенностей синтаксиса, а также небезопасные арифметические операции с плавающей точкой. К числу принципиально важных решений, которые компания Microsoft реализовала в языке программирования C#, можно отнести: свойства, как средство инкапсуляции данных, что характерно также для ООП; обработка событий, в которой имеются расширения, в том числе в части обработки исключений, в частности оператор try; характерный для идеологии Microsoft.NET, компонентноориентированный подход к программированию; соответствующая для идеологии Microsoft.NET унифицированная; система типизации; делегаты; операторы индекса для обращения к элементам классаконтейнера, индексаторы; перегруженные операторы; аналогичный оператору из Visual Basic, обработка всех элементов классов-коллекций, оператор foreach; механизмы для преобразования типов boxing и unboxing;
50 средства оперирования метаданными в COM-модели, атрибуты; набор элементов с доступом по одинаковым количествам столбцов и строк или по номеру индекса, прямоугольные массивы. 2.3 Структура программы на языке C# Как и все языки программирования, язык C# имеет свою, обобщенную структуру программы, которая показана на рисунке 1. Рисунок 1 – обобщенная структура программы. Данная схема говорит о том, что программа на языке C# может состоять из одного или нескольких файлов, которые содержат исходный код программы, имеющие разрешение .CS, где «FileNameN.cs» наименование файла с кодом. На языке программирования C#, файл с исходным кодом может содержать или не содержать пространства имен. На рисунке 1 приведен пример файла «FileName2.cs» в котором содержатся сразу три пространства имен, а именно пространства «A», «B» и «С», «FileName1.cs» и «FileNames2.cs» их не содержат. в то время когда
51 Также стоит отметить, что пространство имен может как содержать, так и не содержать описания классов. В примере, указанном выше, пространство имен «В» содержит три описания классов: «Х», «Y» и «Z». Следовательно, пространства имен «А» и «С» не содержат ни одного описания классов. 2.4 Сопоставления типов-значений и ссылочных типов Реализованные в различных средах разработки программного обеспечения Microsoft.NET, механизмы boxing и unboxing, которые были упомянуты выше, используются для преобразования типов выражений языков программирования из типов-значений в ссылочные и обратно. Для более подробного рассмотрения реализации двух основных семейств типов данных, указанных выше, стоит рассматривать случай одного из простейшего объекта языка C# - переменную. Также, как и названия, переменная в случае использования типовзначений собственно содержит значение, однако, если используются ссылочные типы, то содержится не само значение, а ссылка на него. Если переменная определена как тип-значение, то местом хранения такой переменной является стек. В случае, когда переменная определена как ссылочный тип, то местом для хранения является «куча», которая необходима для динамического выделения и освобождения памяти для хранения переменной произвольным образом. Значением, которым инициализируется переменная по умолчанию, в случае определения посредством типа-значения, для целого или вещественного типа данных, является 0, для логического типа данных, является false, '\0' для строкового типа данных и null в случае определения посредством ссылочного типа.
52 Таким образом, можно сделать вывод, что при выполнении оператора присваивания в случае переменной-ссылки копируется ссылка, а в случае переменной-значения – значение. 2.5 Элементарные типы языка C#. На рисунке 2 представлена таблица сопоставления элементарных типов языка C# с типами языка SML Рисунок 2 – сопоставление элементарных типов языка C# с элементарными типами языка SML Ознакомившись с элементарными типами указанных языков программирования, можно сделать вывод, что система типизации языка C# на много богаче по сравнению с языком программирования SML. Также стоит отметить, что зачастую названия типов совпадают или являются подобными друг другу, а также, что каждому типу языка SML соответствует некоторый тип C#. Также, стоит отметить, что верхним иерархическим элементом является пространство имен System в которую входит система типизации Microsoft.NET, отображающая программирования. все типы, указанных выше, языков
53 2.6 Оператор перечисления Константные объекты в комбинаторной логике можно моделировать с помощью комбинатора-канцелятора К с характеристикой К x y = x. Стоит обратить внимание, что способ описания констант, который применяется в C#, ориентирован на написание безопасного кода, так как в нем содержится обязательная инициализация. Enum – оператор перечисления языка программирования C#, который представляет собой список поименованных констант. Его описание производится в пространстве имен с, необходимой для константы, областью видимости: enum Color {red, blue, green} enum Access {personal=1, group=2, all=4} enum Access1 : byte {personal=1, group=2, all=4} После описания, пример использования константы имеет следующий вид: Color c = Color.blue; Также, стоит отметить, что для уже перечислимых констант необходимо указывать полное имя: Access a = Access.personal | Access.group; if((Access.personal & a) != 0) Console.WriteLine("access granted"); 2.7 Операторы typeof и sizeof в языке программирования C# В языке C#, как и в языке SML, реализована возможность определения типа для какого либо объекта. Оператор typeof используется для реализации такой возможности. Typeof возвращает дескриптор заданного типа. GetType – операция, возвращающая дескриптор типа для заданного объекта, например: о.GetType() Пример использования оператора typeof:
54 Type t = typeof(int); Console.WriteLine(t.Name); Тип рассматриваемого выражения, выше приведенного примера, определяется системой как Int32, что соответствует данным из таблицы сравнения отображения элементарных типов, отображенной на рисунке 2. Что касается оператора sizepf, то он возвращает размер элемента данного типа в байтах. Оператор sizeof можно применить только к типамзначениям, а также, за счет того, что размер структур имеет возможность изменяться в зависимости от среды реализации, используется только в блоках небезопасного кода. Исходный код компилируется командой csc /unsafe xxx.cs. Блоки небезопасного кода, в языке программирования C#, выделяется ключевым словом unsafe. Пример использования оператора sizeof: unsafe { Console.WriteLine(sizeof(int)); Console.WriteLine(sizeof(MyEnumType)); Console.WriteLine(sizeof(MyStructType)); } 2.8 Оператор Struct языка программирования C# Структуры – это одни из важнейших видов основных объектов языка C#. Если вернуться к соотношению с языком SML, то стоит отметить, что в нем, как и в языках функционального программирования с примитивной системой типизации, имеются аналоги структур, которыми могут служить списки. Одной из самых распространенных структур является Point, которая моделирует точку на заданной плоскости: struct Point { public int x, y; public Point (int x, int y)
55 { this.x = x; this.y = y; } public void MoveTo (int a,int b) {x=a; y=b;} } В данном случае рассматривается пример, где координаты точек x и y являются целочисленными, с помощью которых определяется место положение на плоскости, а также являются атрибутами объекта или полями структуры. Операция Point – это операция, которая является функцией инициализации объекта, другими словами это конструктор. Указатель this, который был унаследован от С++, является ссылкой на текущий объект. Метод MoveTo – это операция, которая изменяет текущее местоположение точки на пару целочисленных координат. Для того, что бы можно было использовать объект-структуру, нужно проинициализировать объект-значение в стеке с помощью конструктора, и только после этого можно вызывать метод MoveTo: Point p = new Point(3, 4); p.MoveTo(10, 20); 2.9 Пространства имен Как известно, в языке программирования SML переменные могут быть описаны либо глобально, либо локально. Локальное описание в теле функции подразумевает описание, которое распространяется на весь текст функции. Глобальное описание подразумевает описание, распространяющееся на весь текст программы. Язык программирования C# имеет более сложную структуру. В нем используется такое понятие, как область описания, под которой понимается некий фрагмент программы, к которому относится данное описание.
56 В языке C# объекты могут быть описаны: в блоке, куда входят локальные переменные; в перечислении, куда входят перечисляемые константы; в классе, структуре или интерфейсе, куда входят поля, методы, свойства и т.д. в пространстве, куда входят классы, делегаты, перечисления и т.д. Однако стоит отметь, что ни в коем случае не допускается двукратное описание в пределах одной области, а так же последовательность описаний является произвольной. Исключениями являются некие локальные переменные, которые необходимо описывать до первого использования. А также стоит учитывать, что любой идентификатор виден только из своей области описания, и, что область видимости можно изменять с помощью модификаторов, таких как private,protected. Пространства имен, которые содержатся в разных файлах, но при этом имеют один и тот же идентификатор, составляют одну и ту же область описания. 2.10 Оператор блока в языке C# Как упоминалось ранее, множество характерных особенностей было унаследовано от языка С языком программирования C#, не смотря, но то, что последний реализует объектно-ориентированный подход. Одной из таких особенностей является блок операторов. Блок операторов – это последовательность операторов разделенных символами «;». Аналогом такого оператора является функция, функционального программирования. В C# существует несколько видов блоков: void foo (int x) { // блок методов ... локальные переменные ... в языках
57 { // вложенный блок ... локальные переменные ... } for (int i = 0; ...) { // блок структурированных операторов ... локальные переменные ... } } В описанном выше случае, рассматриваются структурированные блоки, объединяющие операторы и методы. Для сохранения семантики, глубину вложенности блока желательно сохронять в зависимости от велечины табуляции. 2.11 Описание локальной переменной в языке C# Локальные переменные в языке программирования C# описываются следующим образом: void foo(int a) { int b; if (...) { int b; // ошибка: переменная b уже описана в другом блоке int c; // пока все в порядке, однако ... int d; } else { int a; // ошибка: переменная а уже описана во внешнем блоке int d; // конфликтов с переменной d из предыдущего блока нет } for (int i=0;...) {...} for (int i=0;...) {...} // все в порядке: нет конфликтов с // переменной i из предыдущего цикла int c; // ошибка: c уже описана в данном пространстве имен }
58 Функция foo, в данном случае, с одним целочисленным аргументом а не возвращает значения. Проблемы описаний переменных возникают в случаях множественного описания внутри одного и того же блока или пространства имен. Стоит отметить очередное сходство языка C# с языком SML, а именно тот случай, что операторы if и else описываются одинаково и имеют один и тот же смысл. Оператор for является оператором цикла. 2.12 Преимущества языка программирования C# Необходимо отметить, что язык программирования C# претендует на подлинную объектную ориентированность. Другими словами любая языковая сущность может быть объектом. Также C# реализовывает компонентно-ориентированный подход к программированию, который уменьшает машинно-архитектурную зависимость результирующего программного кода, а также переносимости, большей гибкости и легкости повторного использования. При сравнении с языками С и С++ отмечается изначальная ориентация на безопасность кода, что является одним из важнейших отличий. Важным преимуществом языка C# является система типизации, которая унифицирована и максимально близка по масштабу и гибкости к Common Type System. Также C# максимально эффективно интегрирован со средой Microsoft.NET, поэтому он является «родным» для создания приложений в данной среде. 2.13 Недостатки языка программирования C# Несмотря на все достоинства, язык программирования C# имеет не простой синтаксис, а блочная система не всегда способствует удобству
59 чтения кода, а объем концептуальных идей довольно мал и составляет всего 10% от общего объема конструкции языка. Также отмечается невысокая производительность компилятора и среды разработки. Например, по сравнению со своим предшественником – языком С, компиляция производится примерно в 100 раз медленнее. Несмотря на то, что ведутся работы по обеспечению совместимости с операционными системами Linux и FreeBSD, на сегодняшний день программы, которые написаны на языке C#, не работоспособны под управлением альтернативных операционных систем.
60 Глава 3. Численное решение уравнения с дробной производной. 3.1 Алгоритм, способы и методы реализации численного решения уравнения с дробной производной. Для реализации численного решения уравнения с дробной производной на языке С# было решено поделить программу на три подпрограммы выполняющие свои функции. Также используется два вспомогательных модуля для построения графиков: Surface3DRenderer и ZedGraph.dll. Прежде чем приступить к описанию кода, необходимо разработать алгоритм реализации программной части. В первую очередь необходимо задать границы пространственной переменной и длина шага по времени. Для функции необходимо задать начальные и граничные значения (3.1) и (3.2) с параметрами задачи : Значения на первом временном слое функции находятся с помощью метода прогонки по известным значениям нулевого временного слоя функции по формуле (3.3): После чего реализуется поочередное вычисление значений функций с последующим построением графика численного решения. Помимо двух вспомогательных модулей для построения графика, упомянутых выше, в программе используются стандартные библиотеки Windows framework 3.5 и свободные библиотеки zedgraph.dll.
61 Программа предназначена для реализации построения численного решения смешанной задачи для дифференциального уравнения дробного порядка по основной формуле (3.4): где , - дробная производная Герасимова-Капуто по переменно , снабженное начальным условием (3.1) и граничным условием (3.2). Пользователь может задавать множество параметров и формировать различные смешанные задачи для уравнения при различных параметрах , . Как было сказано, программа состоит из трех подпрограмм. Первая подпрограмма реализует ввод начальных (3.1) и граничных значений (3.2), рассчитывая их значения неизвестной функции . Вторая и третья подпрограммы отвечают за непосредственное вычисление неизвестной функции , а также отвечают за моделирование в двухмерном и трехмерном пространствах соответственно, при помощи вспомогательных модулей. Также использована библиотека для работы со специальными функциями, в частности с гамма-функциями. При моделировании, построение двухмерного графика производится сразу после нахождения значения на текущем временном слое. Однако, построение трехмерного графика производится наоборот, то есть график строится только после того, как найдены все значения на всех заданных временных слоях. В форме трехмерного моделирования есть двухмерного графика на любом временном шаге. возможность просмотра
62 3.2 Вычисление приближенного значения решения при различных начальных параметрах задачи Предположим, что , длина шага по времени составляет , при количестве шагов по времени пространству , и длина шага по , при количестве шагов по пространству Отрезок интегрирования , а начальное значение . . В силу того, что выбранное начальное значение соответствует условию не существования решения, при задачи разрушается, что видно на рисунке 3. Рисунок 3 – , численное решение смешанной
63 Для того, что бы решение существовало необходимо выполнять условия согласования ортогональность в на начальные данные, начальной функции которые означают и собственной функции оператора Лапласа, соответствующей собственному значению . Однако вид графика вычисляемого решения приводит к выводу, в случае, когда решения смешанной задачи не существует. На рисунке 4 и рисунке 5 показано, что при соответствующей задачи Коши соответствует. Рисунок 4 – решения
64 Рисунок 5 -
65 Заключение В дипломной работе были рассмотрены примеры смешанных задач дифференциального уравнения дробного порядка, а также примеры использования их в реальной жизни. Также рассматривалась история развития языка программирования C#, его преимущества и недостатки выявленные в сравнении со своими предшественниками и другими языками программирования, были рассмотрены его структура, основные функции и библиотеки. Таким образом, используя знания, которые отображены в первой и второй главах, был составлен алгоритм написания программы реализующей численное решение смешанной задачи дифференциального уравнения дробного порядка, был составлен сам код программы, который представлен в приложении, а также был предоставлен пример вычисления с параметрами при которых существует и при которых не существует решение.
66 Список использованной литературы 1. Малугин В.А. Математика для экономистов: Математический анализ. Курс лекций. Учеб. пособие для студентов вузов. –М.: Эксмо, 2005. –272с. 2. Шипачев В.С. Высшая математика. Учебник для вузов. -М. Высшая школа, 2005. –479с. 3. Сборник задач по математике для вузов. Учеб. пособие для студентов вузов. /Абрамова В.В., Бикчурина Л.Ж., Валеева М.И. и др.; под ред. Котляра Л.М., Углова А.Н.; 5-е изд., перераб. и доп. -Наб. Челны: ИНЭКА, 2006. –472с. (Гриф Министерства образования и науки РФ) 4. Берман Г.Н. Сборник задач по курсу математического анализа. Учеб. пособие для вузов -СПб.: Профессия, 2007. -432с. 5. Данко П.Е., Попов А.Г., Кожевникова Т.Я. Высшая математика в упражнениях и задачах. В 2-х частях. Учеб. пособие для вузов. Часть 1. -М: Высшая школа, 2008. -304с. 6. Данко П.Е., Попов А.Г., Кожевникова Т.Я. Высшая математика в упражнениях и задачах. В 2-х частях. Учеб. пособие для вузов. Часть 2. -М: Высшая школа, 2008. -415с. 7. Зимина О.В., Кириллов А.И., Сальникова Т.А. Высшая математика: решебник. -М.: ФИЗМАТЛИТ, 2003. -368с. 8. Красс М.С. Математика для экономических специальностей. Учебник. –М.: Изд-во: «ДЕЛО», 2003. -704с. 9. Кремер Н.Ш., Путко Б.А., Тришин И.М., Фридман М.Н. Высшая математика для экономистов. Учебник для студентов вузов. -М.: ЮНИТИ-ДАНА, 2007. 479с. 10.Малугин В.А. Математика для экономистов: Математический анализ. Задачи и упражнения. Учеб. пособие для студентов вузов. –М.: Эксмо, 2006. -288с. 11.Шипачѐв В.С. Задачи по высшей математике: Учеб. пособие для вузов. –М.: Высш. шк., 2002. -304с. 12.Владимирский Б.М., Горстко А.Б., Ерусалимский Я.М. Математика. Общий курс. Учебник. –СПб.: «Лань», 2006. -960с. 13.Кремер Н.Ш., Тришин И.М., Путко Б.А. и др. Практикум по высшей математике для экономистов. Учеб. пособие для вузов. -М.: ЮНИТИ-ДАНА, 2002. -423с. 14.Клименко Ю.И. Высшая математика для экономистов в примерах и задачах. –М.: «Экзамен», 2006. -734с.
67 15.Письменный Д.Т. Конспект лекций по высшей математике. Часть 1. – М.:Рольф, 2000. -288с. 16.Письменный Д.Т. Конспект лекций по высшей математике. Часть 2. – М.:Рольф, 2000. -256с. 17.Лунгу К.Н., Письменный Д.Т., Федин С.Н., Шевченко Ю.А. Сборник задач по высшей математике. 1 курс. –М.: Рольф, 2001. -576с. 18.Лунгу К.Н., Норин В.П., Письменный Д.Т., Шевченко Ю.А. Сборник задач по высшей математике. 2 курс. –М.: Айрис-пресс, 2004. -592с. 19.Сборник задач по высшей математики для экономистов. Учебное пособие/Под ред. В.И.Ермакова. –М.:ИНФРА-М, 2002. -575с. 20.Солодовников А.С., Бабайцев В.А., Браилов А.В., Шандра И.Г. Математика в экономике. Учебник. В 2-х частях. Ч.2. –М.: Финансы и статистика, 2000. 376с. 21. Visual C#. NET Step by Step, Microsoft Press, 2003. ISBN: 0-7356-1909-3. 22. Liberty J. Programming C#, 3d edition. O'Reilly & Associates, 2003, 710 pages. ISBN: 0596004893. 23. Pratt T.W., Zelkovitz M.V. Programming languages, design and implementation (4th ed.).- Prentice Hall, 2000. 24.Appleby D., VandeKopple J.J. Programming languages, paradigm and practice (2nd ed.).- McGraw-Hill, 1997. 25.Gilmore S. Programming in Standard ML ’97: a tutorial introduction. http:/www.dcs.ed.ac.uk/home/stg.
68 Приложение 1 Подпрограмма 1: Осуществляет ввод начальных и граничных значений для неизвестной функции u. // используемые библиотеки среды net framework 3.5 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using MyLabsFormsApplication._0_TOOLS; using SpecialFunction; namespace MyLabsFormsApplication.Drobnaya {public partial class Form_parameters : Form { double[][] U; double[][] CHI; public delegate void delegate_close(); public event delegate_close _close; int test_shag = 0; bool optovy_podshet = false; public Form_parameters() { InitializeComponent(); Load += new EventHandler(Form1_Load); } private Form_parameters_FormClosed_1 (object sender, FormClosedEventArgs e) void { if (this._close != null) { _close();} } void Form1_Load(object sender, EventArgs e) // свойства класса начальных значений { this.function_U0._LABEL = ―U(x,0)’‘; this.function_U0._ADD(―e(-(x2/2))’‘); this.function_U0._ADD(―Sin(x)’‘); this.function_U0._ADD(―Sin(2x)’‘); this.function_U0._INDEX(1); // свойства класса граничных условий this.functioN_GRAN._LABEL = ―Гр. усл.’‘; this.functioN_GRAN._ADD(―0’‘); this.functioN_GRAN._ADD(―1’‘); this.functioN_GRAN._INDEX(0);
69 // свойства класса параметров моделирования this.tau_h1._X_MIN = 0; this.tau_h1._X_MAX = 1; this.tau_h1._N = 32; this.tau_h1._N_TIME = 250; } private void button1_Click(object sender, EventArgs e) // инициализация массива решений { this.U = new double[(Int32)this.tau_h1._N_TIME][]; for (int i = 0; i < (Int32)this.tau_h1._N_TIME; i++) { U[i] = new double[(Int32)this.tau_h1._N + 1]; } this.function_U0._H = (double)tau_h1._H; this.function_U0._TAU = (double)tau_h1._TAU; this.function_U0._N = (int)tau_h1._N; this.function_U0._N_TIME = (int)tau_h1._N_TIME; this.function_U0._x_min = (double)tau_h1._X_MIN; this.function_U0._x_max = (double)tau_h1._X_MAX; this.function_U0._FILL_ARRAYS(); this.U[0] = this.function_U0._FUNCTION; // граничные условия this.functioN_GRAN._H = (double)tau_h1._H; this.functioN_GRAN._TAU = (double)tau_h1._TAU; this.functioN_GRAN._N = (int)tau_h1._N; this.functioN_GRAN._N_TIME = (int)tau_h1._N_TIME; this.functioN_GRAN._x_min = (double)tau_h1._X_MIN; this.functioN_GRAN._x_max = (double)tau_h1._X_MAX; this.functioN_GRAN._FUNCTION = this.U; this.functioN_GRAN._FILL_ARRAYS(); this.U = this.functioN_GRAN._FUNCTION; // вызов формы пошагового моделирования MyLabsFormsApplication.Drobnaya.Form_drobnaya oForm = new Drobnaya.Form_drobnaya((Int32)this.tau_h1._N, (Int32)this.tau_h1._N_TIME , (double)this.tau_h1._TAU, (double)this.tau_h1._H , (double)this.tau_h1._X_MIN , (double)this.tau_h1._X_MAX , U,
70 (double)this.numericUpDown_lambda.Value, (double)this.numericUpDown_alpha.Value); oForm.ShowDialog(); private void button_all_Click(object sender, EventArgs e) { int N = (Int32)this.tau_h1._N; double H = (double)this.tau_h1._H; double X_MIN = (double)this.tau_h1._X_MIN; double X_MAX = (double)this.tau_h1._X_MAX; double TAU = (double)this.tau_h1._TAU; int N_TIME = (Int32)this.tau_h1._N_TIME; double lambda = (double)this.numericUpDown_lambda.Value; double HH = Math.Pow(H, 2); double alpha = (double)this.numericUpDown_alpha.Value; // инициализация массива решений this.U = new double[(Int32)this.tau_h1._N_TIME][]; for (int i = 0; i < (Int32)this.tau_h1._N_TIME; i++) { U[i] = new double[(Int32)this.tau_h1._N + 1]; } // начальные значения this.function_U0._H = (double)tau_h1._H; this.function_U0._TAU = (double)tau_h1._TAU; this.function_U0._N = (int)tau_h1._N; this.function_U0._N_TIME = (int)tau_h1._N_TIME; this.function_U0._x_min = (double)tau_h1._X_MIN; this.function_U0._x_max = (double)tau_h1._X_MAX; this.function_U0._FILL_ARRAYS(); this.U[0] = this.function_U0._FUNCTION; // граничные условия this.functioN_GRAN._H = (double)tau_h1._H; this.functioN_GRAN._TAU = (double)tau_h1._TAU; this.functioN_GRAN._N = (int)tau_h1._N; this.functioN_GRAN._N_TIME = (int)tau_h1._N_TIME; this.functioN_GRAN._x_min = (double)tau_h1._X_MIN; this.functioN_GRAN._x_max = (double)tau_h1._X_MAX; this.functioN_GRAN._FUNCTION = this.U; this.functioN_GRAN._FILL_ARRAYS(); this.U = this.functioN_GRAN._FUNCTION; this.CHI = new double[N_TIME][]; for (int i = 0; i < N_TIME; i++) { CHI[i] = new double[N + 1]; } double DIAGONAL = 0; double DIAG_PM_ONE = 0; double G_alpha = Math.Pow(TAU, alpha) * SpecialFunction.gamma(2.0 - alpha);
71 double temp_const = 0; double[] alfa; double[] betta; alfa = new double[N + 1]; betta = new double[N + 1]; for (int T = 1; T < this.tau_h1._N_TIME; T++) { for (int i = 0; i < N + 1; i++) { if ( Math.Abs(U[T - 1][i]) > (double)this.numericUpDown_ogr.Value ) { if (optovy_podshet) { test_shag = T; return; } Else { MessageBox.Show(―Очень сильный рост решения на шаге ― + T.ToString() + ―. Попробуйте изменить праметры задачи.’‘); return; } } } Sum_init(T); if (this.radioButton_yavno.Checked) DIAGONAL = lambda + (2/HH); DIAG_PM_ONE = -(1/HH); } if (this.radioButton_neyavno.Checked) { temp_const = CONST(T, T - 1, alpha); DIAGONAL = lambda + 2 * ((temp_const + G_alpha) / (temp_const *HH)); DIAG_PM_ONE = -((temp_const + G_alpha) / (temp_const * HH)); } // Вычисление методом прогонки if (this.radioButton_progonka.Checked) { ProgonkaMethod Solution_PROGONKA = new ProgonkaMethod((uint)N); Solution_PROGONKA.RightPart[0] = 0; for (int i = 1; i < N; i++) { Solution_PROGONKA.RightPart[i] = PRAVAYA_CHAST(T, i); } for (int i = 1; i < N - 1; i++) { Solution_PROGONKA.Matrix[i][i] = DIAGONAL; Solution_PROGONKA.Matrix[i][i - 1] = DIAG_PM_ONE; Solution_PROGONKA.Matrix[i][i + 1] = DIAG_PM_ONE; } Solution_PROGONKA.Matrix[0][0] = DIAGONAL; Solution_PROGONKA.Matrix[1][0] = DIAG_PM_ONE; Solution_PROGONKA.Matrix[N - 1][N - 2] = DIAG_PM_ONE; Solution_PROGONKA.Matrix[N - 1][N - 1] = DIAGONAL; Solution_PROGONKA.SolveMatrix(); for (int i = 1; i < N; i++) { U[T][i] = Solution_PROGONKA.Answer[i]; } } // Вычисление модифицированным методом прогонки
72 if (this.radioButton_progon_my.Checked) { alfa[2] = 1 / (HH * lambda + 2); betta[2] = (PRAVAYA_CHAST(T, 1) * HH) / (HH * lambda + 2); for (int i = 3; i <= N; i++) { alfa[i] = 1 / (lambda * HH + 2 - alfa[i - 1]); betta[i] = (HH * PRAVAYA_CHAST(T, i - 1) + betta[i - 1]) / (lambda * HH + 2 alfa[i - 1]); } U[T][N - 1] = (HH * PRAVAYA_CHAST(T, N - 1) + betta[N - 1]) / (lambda * HH + 2 - alfa[N - 1]); for (int i = N - 2; i > 0; i–) { U[T][i] = U[T][i + 1] * alfa[i + 1] + betta[i + 1]; } } // Вычисление методом Гаусса if (this.radioButton_gauss.Checked) { GausMethod Solution_GAUS Solution_GAUS.RightPart[0] = 0; = new GausMethod((uint)N, (uint)N); for (int i = 1; i < N; i++) { Solution_GAUS.RightPart[i] = PRAVAYA_CHAST(T, i); } for (int i = 1; i < N - 1; i++) { Solution_GAUS.Matrix[i][i] = DIAGONAL; Solution_GAUS.Matrix[i][i - 1] = DIAG_PM_ONE; Solution_GAUS.Matrix[i][i + 1] = DIAG_PM_ONE; } Solution_GAUS.Matrix[0][0] = DIAGONAL; Solution_GAUS.Matrix[1][0] = DIAG_PM_ONE; Solution_GAUS.Matrix[N - 1][N - 2] = DIAG_PM_ONE; Solution_GAUS.Matrix[N - 1][N - 1] = DIAGONAL; Solution_GAUS.SolveMatrix(); for (int i = 1; i < N; i++) { U[T][i] = Solution_GAUS.Answer[i]; } } } if (e == null) { test_shag = N_TIME - 2; return; } // Вызов формы построения трехмерного и двухмерного графика по готовому массиву решения MyLabsFormsApplication.TOOLS.Plot_FIVE oForm = new TOOLS.Plot_FIVE(U, ―U[x,t]’‘, N_TIME, (N + 1) * H, N + 1, N_TIME, H, X_MIN, X_MAX, 1); oForm.ShowDialog(); }
73 private double CONST(double k, double l, double alpha) { double result = 0; result = Math.Pow(k - l, 1 - alpha) - Math.Pow(k - l - 1, 1 - alpha); return result; } private void Sum_init(int Ti) { int N = (Int32)this.tau_h1._N; double H = (double)this.tau_h1._H; double X_MIN = (double)this.tau_h1._X_MIN; double X_MAX = (double)this.tau_h1._X_MAX; double TAU = (double)this.tau_h1._TAU; int N_TIME = (Int32)this.tau_h1._N_TIME; double HH = Math.Pow(H, 2); double alpha = (double)this.numericUpDown_alpha.Value; double lambda = (double)this.numericUpDown_lambda.Value; double temp_const = CONST(Ti, Ti -1, alpha); double G_alpha = Math.Pow(TAU, alpha) * SpecialFunction.gamma(2.0 - alpha); for (int i = 1; i < N; i++) { CHI[Ti][i] = 0; if (this.radioButton_yavno.Checked) { CHI[Ti][i] = (G_alpha / temp_const * HH) * (U[Ti-1][i + 1] + U[Ti-1][i - 1] - 2 * U[Ti-1][i]); } if (this.radioButton_neyavno.Checked) { CHI[Ti][i] = (G_alpha / temp_const * HH) * (U[Ti][i + 1] + U[Ti][i - 1] - 2 * U[Ti][i]); } for (int k = 1; k < Ti; k++) { CHI[Ti][i] += -(CONST(Ti, k - 1, alpha) / temp_const) * CHI[k][i]; } } } private double PRAVAYA_CHAST(int T, int i) { int N = (Int32)this.tau_h1._N; double H = (double)this.tau_h1._H; double X_MIN = (double)this.tau_h1._X_MIN; double X_MAX = (double)this.tau_h1._X_MAX; double TAU = (double)this.tau_h1._TAU; int N_TIME = (Int32)this.tau_h1._N_TIME; double HH = Math.Pow(H, 2); double alpha = (double)this.numericUpDown_alpha.Value; double lambda = (double)this.numericUpDown_lambda.Value; double result; double temp_const = CONST(T, T -1, alpha); double G_alpha = Math.Pow(TAU, alpha) * SpecialFunction.gamma(2.0 - alpha); double SUMMA = 0; for (int k = 1; k < T; k++)
74 { SUMMA = ((CONST(T, k - 1, alpha)) / (temp_const)) * CHI[k][i]; } result = lambda * U[T-1][i] - (1 / HH) * (U[T-1][i + 1] + U[T-1][i - 1] - 2 * U[T-1][i]) - SUMMA; if (this.radioButton_yavno.Checked) { result = result - (G_alpha / temp_const) * (U[T - 1][i + 1] + U[T - 1][i - 1] - 2 * U[T - 1][i]); } return result; } private void button2_Click(object sender, EventArgs e) { string temp_str = ― ―; this.button2.Enabled = false; optovy_podshet = true; this.richTextBox1.Text = ― ―; for (int i = (int)this.numericUpDown_s.Value; i < (int)this. numericUpDown_po.Value; i++) { this.numericUpDown_lambda.Value = -i * (decimal)0.01; button_all_Click(null, null); temp_str = this.richTextBox1.Text; this.richTextBox1.Text = this.numericUpDown_lambda.Value.ToString() + ― - ― + test_shag.ToString(); if (test_shag <= 25) { this.richTextBox1.Text += ― !!!!! ―; } this.richTextBox1.Text += ― - ― + temp_str; } optovy_podshet = false; this.button2.Enabled = true; } } } Подпрограмма 2: Осуществляет вычисление значений неизвестной функции u в узлах сетки и отвечает за 2D моделирование графика функции u. // используемые библиотеки среды net framework 3.5 using System; using System.IO; using System.Collections.Generic; System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.ComponentModel; using
75 using MyLabsFormsApplication._0_TOOLS; namespace MyLabsFormsApplication.Drobnaya {public partial class Form_drobnaya : Form {int N; // количество шагов по пространству int N_TIME; // количество шагов по времени double TAU; // длина шага по времени double H; // длина шага по пространству double x_min; // начало отрезка пространства double x_max; // конец отрезка пространства double[] alfa; // прогоночный коэффициент double[] betta; // прогоночный коэффициент double[][] U; // двумерный массив значений искомой функции double[][] Partial_sum; // Часть суммы не зависящая от слагаемого с новым временным слоем int T = 0; // номер вычисляемого временного шага double alpha, lambda; double HH; double DIAGONAL, DIAG_PM_ONE; public Form_drobnaya(int N_X, int N_TIME, double TAU, double H, double x_min, double x_max, double[][] U, double lambda, double alpha) { InitializeComponent(); Load + = new EventHandler (Form_teploprovodnost_Load); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler (this.Form_ teploprovodnost_FormClosing); this.N = N_X; this.N_TIME = N_TIME; this.TAU = TAU; this.H = H; this.x_min = x_min; this.x_max = x_max; this.U = U; this.alfa = new double[N+1]; this.betta = new double[N+1]; this.alpha = alpha; this.lambda = lambda; this.paint1._Timer.Tick += new EventHandler(_Timer_Tick); this.paint1._Directory = "teploprovodnost"; this.Partial_sum = new double[N_TIME][]; for (int i = 0; i < N_TIME; i++) { Partial_sum[i] = new double[N + 1]; } HH = Math.Pow(H, 2); DIAGONAL = lambda + 2 / HH; DIAG_PM_ONE = -1 / HH; } //Прорисовываем искомую функцию и подсчитываем значения на следующем временном слое void Form_teploprovodnost_Load(object sender, EventArgs e) { NEXT(); } //По закрытии формы останавливаем таймер private void Form_teploprovodnost FormClosingEventArgs e) { this.paint1.STOP_NOW();} _FormClosing (object sender,
76 // Инкрементируем номер шага, подсчитываем значения искомой функции private void NEXT() {this.paint1._H = H; this.paint1._N = N; this.paint1._T = T; this.paint1._U = U; this.paint1._x_max = x_max; this.paint1._x_min = x_min; this.paint1.PAINT(); T++; CALCULATE();} // Если текущий номер шага не равен количеству заданных шагов по времени, вызываем NEXT() void _Timer_Tick(object sender, EventArgs e) {if (T < N_TIME - 1){ NEXT(); } else { this.paint1.STOP_NOW(); } } private void CALCULATE() { Sum_init(T - 1); // Вычисляем сумму в правой части. alfa[2] = 1 / (HH * labda + 2); betta[2] = (PRAVAYA_CHAST(T - 1, 1) * HH) / (HH * lambda + 2); for (int i = 3; i <= N; i++) {alfa[i] = 1 / (lambda * HH + 2 - alfa[i - 1]); betta[i] = (HH * PRAVAYA_CHAST(T - 1, i - 1) + betta[i - 1]) / (lambda * HH + 2 - alfa[i - 1]);} U[T][N - 1] = (HH * PRAVAYA_CHAST(T - 1, N - 1) + betta[N - 1]) / (lambda * HH + 2 - alfa[N - 1]); for (int i = N - 2; i > 0; i–) { U[T][i] = U[T][i + 1] * alfa[i + 1] + betta[i + 1];}} private void Sum_init(int Ti) {for (int j = 1; j < N; j++) {Partial_sum[Ti][j] = (1 / HH) * (U[Ti][j + 1] + U[Ti][j - 1] - 2 * U[Ti][j]); for (int t = 0; t < Ti; t++) {Partial_sum[Ti][j] += -(Math.Pow(Ti + 1 - t, 1 - alpha) - Math.Pow(Ti - t, 1 alpha)) * Partial_sum[t][j]; // Последовательно вычитаем частичные суммы предыдущих слоев } }} // Правая часть неявной схемы private double PRAVAYA_CHAST(int T, int i) {double result;
77 result = lambda * U[T][i] - (1 / HH) * (U[T][i + 1] + U[T][i - 1] - 2 * U[T][i]) + SpecialFunction.gamma(2.0 - alpha) * Math.Pow(TAU, alpha) * Partial_sum[T][i]; return result; } } } Подпрограмма 3: Осуществляет вычисление значений неизвестной функции u в узлах сетки и отвечает за 3D моделирование графика функции u. // используемые библиотеки среды net framework 3.5 using System; using System.Collections.Generic; System.Data; using System.ComponentModel; using System.Drawing.Drawing2D; using using System.Drawing; using System.Text; using System.Windows.Forms; System.Threading; using namespace MyLabsFormsApplication.TOOLS { public partial class Plot_FIVE : Form//Инициализация переменных { Surface3DRenderer sr; Boolean isMouseLeftButtonDown = false; Boolean isMouseRightButtonDown = false; Boolean isShiftDown = false; double zoom = 0.5; Point mouseLocation; Point screenXY = new Point(0, -150); Point3D observableXYZ = new Point3D(70, 35, 40); double[][] FUNC, FUNC2, FUNC3; string Function_name, Function_name2, Function_name3; int iN, iN_TIME, kolvo_grafikov; double dH, dx_min, dx_max, widh_x, widh_y; //Передача параметров в модуль для рисования графика функции u public Plot_FIVE(double[][] FUNC, string Function_name, double widh_x, double widh_y, int N, int N_TIME, double H, double x_min, double x_max, int kolvo_grafikov) { InitializeComponent(); this.WindowState = FormWindowState.Maximized; this.button_l.Image; this.FUNC = FUNC; this.button1.Image = this.FUNC2 = FUNC; this.FUNC3 = FUNC; this.Function_name = this.Function_name3 = ; Function_name; this.Function_name2 = ; dH = H; dx_min = x_min; dx_max = x_max; iN = N; iN_TIME = N_TIME; this.kolvo_grafikov = kolvo_grafikov;
78 if (this.kolvo_grafikov != 1) { screenXY = new Point(100, -150); } this.widh_y = widh_y; this.widh_x = widh_x; this.trackBar1.Minimum = 0; this.trackBar1.Maximum = (int)N_TIME - 1; this.trackBar1.TickFrequency = (int)(((int)N_TIME 1) / this.trackBar1.TickStyle = TickStyle.TopLeft; trackBar1_Scroll(null, null); 10); sr = new Surface3DRenderer(observableXYZ.x, observableXYZ.y, observableXYZ.z, screenXY.X, screenXY.Y, ClientRectangle.Width, ClientRectangle.Height, zoom, 0, 0); give_param(); ResizeRedraw = true; DoubleBuff ered = true; this.KeyPreview = true; ReCalculateTransformations(); } public Plot_FIVE(double[][] FUNC, double[][] FUNC2, double[][] FUNC3, string Function_name, string Function_name2, string Function_name3, double widh_x, double widh_y, int N, int N_TIME, double H, double x_min, double x_max, int kolvo_grafikov) { InitializeComponent(); this.button1.Image = this.button_l.Image; this.FUNC = FUNC; this.FUNC2 = FUNC2; this.FUNC3 = FUNC3; this.Function_name = Function_name; this.Function_name2 = Function_name2; this.Function_name3 = Function_name3; dH = H; dx_min = x_min; dx_max = x_max; iN = N; iN_TIME = N_TIME; this.kolvo_grafikov = kolvo_grafikov; if (this.kolvo_grafikov != 1) { screenXY = new Point(100, -150);} this.widh_y = widh_y; this.widh_x = widh_x; this.trackBar1.Minimum = 0; this.trackBar1.Maximum = (int)N_TIME - 1; this.trackBar1.TickFrequency = (int)(((int)N_TIME - 1) / 10); this.trackBar1.TickStyle = TickStyle.TopLeft; trackBar1_Scroll(null, null); sr = new Surface3DRenderer(observableXYZ.x, observableXYZ.y, observableXYZ.z, screenXY.X, screenXY.Y, ClientRectangle.Width, ClientRectangle.Height, zoom, 0, 0); give_param(); ResizeRedraw = true; DoubleBuff ered = true; this.KeyPreview = true; ReCalculateTransformations(); private void give_param()
79 {double height = 0, height2 = 0, height3 = 0; double[][] TEMP, TEMP2, TEMP3; int temp = iN_TIME / (int)this.numericUpDown_kol_tochek.Value; int temp_shag = (int)this.numericUpDown_kol_tochek.Value; TEMP = new double[temp][]; TEMP2 = new double[temp][]; TEMP3 = new double[temp][]; for (int i = 0; i < temp; i++) { TEMP[i] = new double[iN + 1]; TEMP2[i] = new double[iN + 1]; TEMP3[i] =new double[iN + 1]; for (int j = 0; j < iN; j++) { TEMP[i][j] = this.FUNC[i * temp_shag][j] *(double)this.numericUpDown_mnoj.Value; TEMP2[i][j] = this.FUNC2[i temp_shag][j] * *(double)this.numericUpDown_mnoj.Value; TEMP3[i][j] this.FUNC3[i * temp_shag][j] * *(double)this.numericUpDown_mnoj.Value; (height < this.FUNC[i * temp_shag][j]) * * = if { height = this.FUNC[i * temp_shag][j]; } if (height2 < this.FUNC2[i * temp_shag][j]) { height2 = this.FUNC2[i * temp_shag][j]; } if (height3 < this.FUNC3[i * temp_shag][j]) { height3 = this.FUNC3[i * temp_shag][j]; } } } sr.EndPoint = new PointF(iN_TIME /(int)this.numericUpDown_kol_tochek.Value, iN); sr.Density_X (int)this.numericUpDown_kol_tochek.Value *(double)this.numericUpDown1.Value / (double)iN_TIME; / = * sr.Density_Y = (double)this.numericUpDown2.Value / (double)iN; sr._koordinat_nachalo_x = (int)this.numericUpDown_koord_nach_x.Value; sr._koordinat_nachalo_y = (int)this.numericUpDown_koord_nach_y.Value; sr._koordinat_nachalo_z = (int)this.numericUpDown_koord_nach_z.Value; sr._koordinat_shag_x = (float)this.numericUpDown_shag_x.Value; sr._koordinat_shag_y = (float)this.numericUpDown_shag_y.Value; sr._koordinat_shag_z = (float)this.numericUpDown_shag_z.Value; sr._koordinat_max_x = widh_x; sr._koordinat_max_y = widh_y; sr._koordinat_max_z = ((double)height / /(double)this.numericUpDown_mnoj.Value) * 10; sr._koordinat_max_z2 = ((double)height2 / /(double)this.numericUpDown_mnoj.Value) * 10; sr._koordinat_max_z3 = ((double)height3 / /(double)this.numericUpDown_mnoj.Value) * 10; sr._GRAFS_COUNT = kolvo_grafikov; sr._Function = TEMP;
80 sr._Function2 = TEMP2; sr._Function3 = TEMP3; sr._Function_name = Function_name; sr._Function_name2 = Function_name2; sr._Function_name3 = Function_name3; sr._height_plus = (int)this.numericUpDown3.Value; sr._xstart1 = 0; sr._xstart2 = 0; } // Вызов функции перерисовки графика с новыми координатами private void ReCalculateTransformations() { sr.ReCalculateTransformationsCoeficients(observableXYZ.x, observableXYZ.y, observableXYZ.z, screenXY.X, screenXY.Y, ClientRectangle.Width, ClientRectangle.Height, zoom, 0, 0); this.Invalidate(); }//Сохранение графика функции private void button1_Click(object sender, EventArgs e) { Bitmap b = new Bitmap(this.Size.Width, this.Size.Height); Graphics g = Graphics.FromImage(b); g.CopyFromScreen(this.Location, new Point(0, 0), this.Size); SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "jpg files (*.jpg)|*.jpg"; saveFileDialog1.FilterIndex = 2; saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { b.Save(saveFileDialog1.FileName);} this.paint_two_small1.Visible = true; this.button_save.Visible = true; this.trackBar1.Visible = true; this.button1.Visible = true; } // Передвижение бегунка private void trackBar1_Scroll(object this.paint_two_small1._H = this.dH; sender, EventArgs e) { this.paint_two_small1._N = (int)this.iN; this.paint_two_small1._T = this.trackBar1.Value; this.paint_two_small1._V = this.FUNC; this.paint_two_small1._W = this.FUNC2; this.paint_two_small1._GRAFIC_COUNT = kolvo_grafikov; this.paint_two_small1._x_max = dx_max; this.paint_two_small1._x_min = dx_min; this.paint_two_small1.PAINT(); } // Перерисовка класса моделирующего 3D при нажатии каких либо клавиш private void numericUpDown1_ValueChanged(object sender, EventArgs e) { give_param(); ReCalculateTransformations(); }
81 private void numericUpDown2_ValueChanged(object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } private void numericUpDown3_ValueChanged(object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } private void numericUpDown4_ValueChanged(object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } private void numericUpDown_shag_x_ValueChanged (object sender, EventArgs e) { if (this.numericUpDown_shag_x.Value this.numericUpDown_shag_x.Value = 1; } < 0 ) { give_param(); ReCalculateTransformations(); } private void numericUpDown_shag_y_ValueChanged (object sender, EventArgs e) {if(this.numericUpDown_shag_y.Value< 0) { this.numericUpDown_shag_y.Value = 1; } give_param(); ReCalculateTransformations(); } private void numericUpDown_shag_z_ValueChanged (object sender, EventArgs e) {if(this.numericUpDown_shag_z.Value < 0) { this.numericUpDown_shag_z.Value = 1; } give_param(); ReCalculateTransformations(); } private void numericUpDown_test_ValueChanged (object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } private void numericUpDown_koord_nach_x_ValueChanged (object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } private void numericUpDown5_koord_nach_y_ValueChanged (object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } private void numericUpDown6_koord_nach_z_ValueChanged (object sender, EventArgs e)
82 { give_param(); ReCalculateTransformations(); } private void numericUpDown_mnoj_ValueChanged (object sender, EventArgs e) { give_param(); ReCalculateTransformations(); } }}
Отзывы:
Авторизуйтесь, чтобы оставить отзыв