Задание 3 по курсу «Технологии компьютерного моделирования» (на весь 7-й семестр) Программирование вычислительных моделей 1 Цель работы Закрепить полученные знания по разработке гибких программ, предназначенных для численных расчетов разных задач разными методами. Научиться быстро генерировать набор расчетных программ для проведения вычислительных экспериментов (в т.ч., за счет ООП). Получить навыки использования чужих программ при написании своей (путем использования кода в неизменном виде или путем его преобразования) – эти навыки наиболее часто требуются при работе над бакалаврским дипломом по моделированию. Примечание: студенты, не знакомые с языком Java, соответствующую часть задания не делают. 2 Содержание семинаров, необходимых для выполнения задания (1) Типовое разбиение расчетных программ на модули/классы: задача, решение, солвер, алгоритм, метод. Другие классы объектов, встречающиеся в задачах моделирования. (1) Типовое разбиение на классы на примере Java-программы расчета краевой задачи для ОДУ второго порядка (mipt.math.eq.ode). Написание шаблона своей аналогичной программы БЕЗ объектного представления чисел (Number). (2) Особенности языка Fortran (90) на примере программы расчета систем нелинейных алгебраических уравнений (NonlinAE). Разбиение на модули в ней. Применение pointer для динамического указания размеров массивов и др. (2-3) Альтернативный вариант разбиения на модули на примере Fortran-программы расчета задач Коши для нелинейных систем ОДУ (ODEProblems, CauchyMethods, Cauchy). (3а) Краткое пояснение Fortran-программ Adams, RungeK как образца численных методов для реализации вариантов задания, связанных с системами ОДУ. (3б) Краткое пояснение прикладных (не учебных) Java-пакетов mipt.math.sys.ode, mipt.math.sys.num.ode как образца (некоторых численных методов и разбиения на классы) для реализации вариантов задания, связанных с системами ОДУ. (4а) Краткое пояснение Fortran-программы Run как образца метода прогонки для реализации вариантов задания, связанных с краевыми задачами (для ОДУ/УМФ). (4б) Краткое пояснение прикладных (не учебных) Java-пакетов mipt.math.sys.ae, mipt.math.sys.num.ae как образца (численных методов и разбиения на классы) для реализации вариантов задания, связанных с алгебраическими системами. 3 Задание I. Создание базовой программы (или двух программ) 1. Написать расчетную программу с «базовыми» задачей и численным методом для варианта (задача или метод могут быть сформулированы не полностью, т.е. может потребоваться поиск информации о них). При этом следует либо непосредственно использовать разобранный на семинарах программный код (возможно для некоторых вариантов), либо взять его за основу и модифицировать под свою задачу/метод (с сохранением общей структуры модулей/классов). Можно также скопировать куски реализации численных методов из «не учебного» кода (см. пункты 3 и 4 в разделе 2), а также из примеров, разобранных в книге Numerical Receipts или из любого программного кода, найденного в Internet. 2. Отладить и запустить программу, получить базовые значения результатов моделирования (при стандартном способе представления – на консоли). 3. (не для всех вариантов и людей) Выполнить пункты 1-2 на втором языке программирования. В качестве второго языка программирования может быть не Fortran и не Java (а С++). II. Исследование (параметров, задач, методов) с помощью программ(ы) 4. Для программы на языке Java/С++ – с использованием ООП, создать иерархию классов *Task, которые будут хранить параметры задачи, метода, вывода решения и т.п. (запуская конкретный расчет в тривиальном методе main). Число конкретных классов – не менее 3. Примечание: если «вывод» означает сохранение решения (а не визуализацию), то желательно визуализировать его в математическом или графическом пакете (математический предпочтительнее, если будет выполняться пункт 6) 5. В случае, если не делается пункт 0, – написать альтернативный(е) способ(ы) вывода решения (визуализации или сохранения), а также альтернативную задачу (или численный метод, не слишком отличающийся от базового). Протестировать их (создав копию лишь небольшого куска кода – точки входа в программу: program/main). 6. В случае, если невозможно убедиться в правильности результатов (если правильное решение задачи неочевидно, то в правильности можно иногда убедиться косвенно путем сравнения результатов по разным методам) – ввести задачу в любой математический пакет (или в готовую программу из числа имеющихся на Fortran и Java) и показать соответствие результатов любым убедительным способом. 4 Варианты задания и баллы Ниже в квадратных скобках указаны баллы за задачу и за отдельные требования к ней (по пунктам задания 1–4). За не полностью выполненное требование число баллов ставится меньше указанного. Кроме баллов за требования, есть балл за написание код программы (не равный нулю в случае отсутствия готового прототипа на нужном языке). Баллы за пункт 5 задания (реализация иной задачи, иного метода и т.п.) соответствует баллу за соответствующую задачу, метод и т.п. Балл за 6 задания невелик и индивидуален (зависит от объема проделанной работы, непредсказуемого заранее). Указанная сумма баллов за задание не включает баллы за пункты 5 и 6 (так как они в некотором смысле альтернативны пункту 4). 4.1 Системы (нелинейных) алгебраических уравнений [до 17=3+4+10] Сначала предполагается написание Fortran-программы на основе NonlinAE. Основное число баллов за эту программу – [0] (т.е. решение простого варианта дано) 4.1.1 Варианты задачи 1. Стандартный (Sample1 или Sample2) [0] 2. Точка пересечения двух «почти коллинеарных» прямых на плоскости [1] 3. Точка пересечения трех «почти компланарных» плоскостей в пространстве [2] 4. Точка пересечения эллипсоида с прямой [2] 5. Точка пересечения эллипсоида и двух плоскостей [2-3] 6. Точка пересечения двух эллипсоидов и одной плоскости [2-3] 7. Любой свой вариант (из тетрадки, учебника) [? за сложность +1 за творчество] 4.1.2 Варианты численного метода Баллы указаны с учетом использования готовой процедуры обращения матрицы (MInvert.for) 1. Стандартный (Newton) [0] 2. Метод секущей (учебник, в т.ч. Numerical Recipes) [1-2] 3. Модифицированный метод Ньютона (учебник, в т.ч. Numerical Recipes) [1-2] 4. Метод градиентного спуска (учебник, лекции Демченко) [3] 5. Метод простых итераций (c адаптацией задачи F(x)=0 x=G(x); работает не всегда) [3] 6. Один из методов из главы 9 книги Numerical Recipes (только для одного уравнения!): False-position, Ridders’; Van Wijngaarden–Dekker–Brent [3-4] 4.1.3 Другие требования 1. Написание Java-программы (аналог mipt.math.sys.num.ae, где пока реализованы не все методы) [3–5] 2. Если вместо Java использовать язык C++, то в качестве основы можно использовать примеры главы 9 книги Numerical Receipts (а также главы 2, поскольку многие методы решения нелинейных уравнений требуют обращать матрицу). [5–7] (за С++ [4–6]) 3. (если Java или C++) Написание классов для хранения/запуска вариантов расчетов (аналог mipt.math.sys.tasks.AETask и его подклассов) [2–4] Поскольку для данных требований есть «образцы» кода, то вышеуказанным минимальным баллам соответствует: а) в случае Java – повторение кода без Number с упрощением его структуры (если нужно), б) в случае C/C++ – реорганизация кода, т.е. создание «правильной» структуры с помощью средств языка. Максимальному же баллу соответствует существенная проработка особенностей нестандартного численного метода или способа вывода или ... 4.2 Задачи Коши для систем (нелинейных) ОДУ [до 29=1.7*(3+4+6)+8] Сначала может делаться как Fortran-программа на основе проекта ODE, так и Java-программа на основе mipt.math.sys.num.ode. Не стоит начинать с программы на языке C/C++. Основное число баллов за Fortran-программу – [0] (т.е. решение простого варианта дано), основное число баллов за Java-программу – [3] (во всех вариантах нужно повторить код без Number) 4.2.1 Варианты задачи 1. Стандартный (Sample1 – Sample4) [0, если используется Fortran, иначе 1] 2. Вариант из ODEVariants.for/c (кроме №№5, 28, совпадающих с Sample4, Sample3) [1] 3. Вариант из Tasks1.doc (раздел 3.1: Фрюгауф, Экогенетика, Хищник-жертва) [2-3] 4. Вариант из ODEGuide.doc (раздел 2, кроме задач пп. 1 и 3) [1-4] 5. Любой свой вариант (из тетрадки, учебника) [? за сложность +1 за творчество] 4.2.2 Варианты численного метода 1. Стандартный (явный Эйлер) [0] 2. Явный K-стадийный Рунге-Кутты со стандартной таблицей Бутчера [2] 3. Явный K-стадийный Рунге-Кутты с другой таблицей Бутчера (из ODEGuide.doc) [3] 4. Полуявный двухстадийный Рунге-Кутты (аналогично RungeK.for) [4] 5. Полуявный K-стадийный Рунге-Кутты (аналогично mipt.math.sys.num.ode.impl) [5] 6. Неявный линейный двухшаговый (аналогично Adams.for) [4] 7. Явный линейный K-шаговый (см. ODEGuide.doc) [3-4] 8. Явный линейный двухшаговый [2] 9. Один из методов из главы 16 книги Numerical Recipes: Bulirsch-Stoer, Rosenbrock, Semiimplicit extrapolation [3-6] В случае использования метода Рунге-Кутты, в качестве выполнения пункта 5 задания возможно реализовать метод адаптации шага по времени (см. EmbeddedRKStepAlgorithm, Numerical Recipes 16.2) [3-4] (3 – если метод Рунге-Кутты с фиксированным числом стадий) 4.2.3 Другие требования 1. Написание программы на втором языке [50-70% от тех же баллов за требования; если программа на С/С++, то еще плюс 2-3 балла за создание структуры программы «с нуля»] 2. Написание классов для хранения/запуска вариантов расчетов (аналог mipt.math.sys.tasks.ODETask и его подклассов) [3–5] 4.3 Краевые задачи для систем ОДУ [до 27=1.7*(4+4+8)] Первой может делаться программа на любом языке, хотя в случае метода прогонки рекомендуется начинать либо с Java-программы на основе mipt.math.eq.ode, либо с Fortranпрограммы на основе проекта Run (и файла ODEProblems проекта ODE). В случае метода прогонки, основное число баллов за Fortran-программу – [2] (должна быть создана «правильная» структура), за Java-программу – [3] (нужно не только повторить код без Number, но и ввести элементы алгоритма (формулы), так как программа недоделанная; см. пометки “TO DO”). В противном случае, базовое число баллов за программу на любом языке (без аналога) – [4] (здесь учтено, что другие методы, кроме метода прогонки, сводятся к решению задач Коши и применению методов решения линейных или нелинейных систем алгебраических уравнений, а для них есть аналоги или даже готовые коды). 4.3.1 Варианты задачи 1. Стационарное уравнение теплопроводности с произвольными граничными условиями (расшифровку см. в разделе 4.3.4) [3-4] (4 за условия периодичности – см. ниже пункт б) 2. Стационарное уравнение теплопроводности с граничными условиями первого рода [2] Примечание: для использования метода, отличного от прогонки, уравнение нужно переписать в виде системы двух уравнений первого порядка. 3. Любая нелинейная система ОДУ из предложенных в разделе 4.2.1, но при нежестких значениях параметров; граничные условия либо первого рода, либо произвольные [1-2 за граничные условия + балл из раздела 4.2.1] 4. Любой свой вариант (из тетрадки, учебника) [? за сложность +1 за творчество] 4.3.2 Варианты численного метода Примечание: изложение методов для решения краевых задач имеется, например, в учебнике Федоренко, §8-9. 1. Метод прогонки [3] – для (квази)линейных задач (стационарное уравнение теплопроводности, Sample1-2) 2. Метод сведения к задачам Коши (n задач с тривиальными начальными условиями y0 0 и одна задача с однородной системой – вида dy dt At y 0 ) – для (квази)линейных задач [балл используемого метода решения задачи Коши (см. 4.2.2; метод выше [3] делать не стоит) + 1-2, в зависимости от того, насколько готовый код для решения системы линейных алгебраических уравнений будет использован] = [до 5] 3. Метод квазилинеаризации («метод Ньютона в функциональном пространстве») – для нелинейных задач [1 + балл используемого метода решения (квази)линейной краевой задачи (см. выше пункты 1 или 2) + балл метода решения нелинейных алгебраических уравнений (см. 4.1.2; метод выше [2] делать не стоит)] = [до 8] 4. Метод стрельбы – для нелинейных задач [1 + балл используемого метода решения задачи Коши (см. 4.2.2; до [3]) + балл метода решения нелинейных алгебраических уравнений (см. 4.1.2; до [2])] = [до 6] 4.3.3 Другие требования 1. Написание программы на втором языке [50-70% от тех же баллов за требования] 2. В данном случае не нужно выполнять пункт 4 задания (создание иерархии классов *Task) – ввиду большого объема работы по другим требованиям. 4.3.4 Пример детальной формулировки краевой задачи и требований к программе Для одномерного стационарного уравнения теплопроводности d du px qx u f x , dx dx рассматриваемого на отрезке [0;1], заданы функции коэффициентов p, q и правой части f, а также краевые условия одного из двух типов: а) p0u x 0 0 u 0 0 ; p1u x 1 1u 1 1 . б) u 0 0 u 1 0 ; p0 0u x 0 0 p1 0u x 1 0 (условия периодичности). Необходимо вывести значения решения u в 11 равноудаленных точках отрезка [0;1]; а также относительную точность решения, оцениваемую по правилу Рунге через 2 расчета при отличающихся в 2 раза шагах интегрирования). 4.4 Уравнения в частных производных (УМФ) [до 24=1.7*(4+4+6) (если не система!)] Рассматриваются только динамические УМФ (гиперболического или параболического, но не эллиптического типа). Язык Java для УМФ использовать не рекомендуется (а в случае C++ рекомендуется не использовать возможности ООП или, по крайней мере, избегать создания множества мелких объектов). Первой может быть программа на любом языке, хотя в случае метода прогонки или явной схемы лучше начинать с Fortran-программы (на основе проекта Run или transfer, parab). В случаях, когда имеются прототипы программ (на Fortran; одномерное УМФ, любая схема для параболического уравнения или явная схема для гиперболического уравнения) основное число баллов за программу – [2] (должна быть лишь создана «правильная» структура программы); в остальных случаях – [4] (так как даже в Numerical Receipts смотреть бесполезно). 4.4.1 Варианты уравнений 1. Линейное уравнение переноса (гиперболического типа) (аналогично transfer.for) [1] 2. Нелинейное уравнение переноса [2] 3. Волновое уравнение или другая простая система уравнений гиперболического типа [2] 4. Нелинейная система уравнений газовой динамики (см. Hyperbolic.doc, hypsys.for) [4] 5. Линейное уравнение теплопроводности (аналогично parab.for) [1] 6. Нелинейное уравнение теплопроводности (см., например, учебник Федоренко, §21) [2] 7. Линейное конвективно-диффузионное (гиперболическо-параболическое) уравнение [2] 8. Двумерное линейное уравнение теплопроводности или переноса [2] 9. Любой свой вариант (из тетрадки, учебника) [? за сложность +1 за творчество] Примечание: В линейных задачах зависимость коэффициентов от времени (квазилинейность) оценивается: [1]. Примечание: Оценивается нетривиальные правая часть или гр. условия (функции времени, с параметрами): [1]. 4.4.2 Варианты граничных условий 1. Граничными условия первого или второго рода [1] 2. Произвольные (смешанные) граничные условия [3] 3. Условия периодичности (связи одной границы с другой) [3] Примечание: начальные условия не оцениваются; во всех вариантах они могут задаваться достаточно простыми: в виде двух значений («ступенька», «порог», «нормированная на единицу дельта-функция»). 4.4.3 Варианты численного метода Примечание: Все варианты методов предполагают, что коэффициенты схемы задаются (параметры программы). 1. Для одномерных гиперболических или параболических уравнений 1.1. Явная схема (как для линейных, так и для нелинейных уравнений) [2] 1.2. Неявная схема + метод прогонки – для (квази)линейных уравнений: переноса или теплопроводности [4] 2. Для одномерных систем гиперболического типа 2.1. Явная схема для линейной системы [4] 2.2. Явная схема для нелинейной системы в дивергентной форме [5] 3. Усложнения методов для двумерных задач (см., например, учебник Федоренко, §13) 3.1. Метод переменных направлений [+2] 3.2. Метод дробных шагов [+2] 4. Другие усложнения 4.1. Гибридная схема (для гиперболических задач) [+2] 4.2. Метод расщепления по физ. процессам (для задач смешанного типа) [балл за гиперболический метод + балл за параболический – 1, если эти методы однотипны] 4.4.4 Другие требования 1. Написание программы на втором языке [50-70% от тех же баллов за требования] 2. Если вариант непростой (сложнее, чем явная схема для одного одномерного уравнения) то не нужно выполнять пункт 4 задания (создание иерархии классов *Task) – ввиду большого объема работы по другим требованиям. А для простых вариантов (при условии их реализации на ОО-языке) этот пункт нужен и дает [4–5].