Багатоваріантність. обчислювальний експеримент


Г л а в а 4

багатоваріантність

Конфігураційні побудови, хто розбирався в попередніх розділах, можуть використовуватися практично скрізь, де потрібна розробка досить складних програм. Область застосування варіантного програмування, про який піде мова в цьому розділі, також досить широка. (Досить згадати варіантні фрагменти, які налаштовують додаток на ту чи іншу обчислювальну платформу, - з ними, ймовірно, багатьом доводилося мати справу.) Але відносна вага маніпуляцій над варіантами в загальному обсязі робіт часто виявляється не таким вже помітним, через що потреби в раціональному їх оформленні відсуваються на задній план.
Існує, однак, важливий клас задач, для якого ефективне забезпечення багатоваріантності абсолютно необхідно, більш того, воно перетворюється в центральну проблему організації програмування. Цей клас завдань - обчислювальний експеримент.


4.1. обчислювальний експеримент

Обчислювальний експеримент - метод вивчення пристроїв або фізичних процесів за допомогою математичного моделювання. Він передбачає, що слідом за побудовою математичної моделі проводиться її чисельне дослідження, що дозволяє «програти» поведінку досліджуваного об'єкта в різних умовах або в різних модифікаціях [ Самарський, 1979 ; Горбунов-Посадов, 1990. ].
Чисельне дослідження моделі дає можливість визначати різноманітні характеристики процесів, оптимізувати конструкції або режими функціонування проектованих пристроїв. Більш того, трапляється, що в ході обчислювального експерименту дослідник несподівано відкриває нові процеси і властивості, про які йому раніше нічого не було відомо.

4.1.1. Сфера використання. Обчислювальний експеримент займає проміжне положення між натурним експериментом і аналітичним дослідженням.
Натурний (фізичний) експеримент при належній постановці може, взагалі кажучи, дати вичерпні і надійні результати. І все ж у багатьох випадках перевага віддається обчислювальному експерименту.
Справа в тому, що в обчислювальному експерименті в ролі дослідної установки виступає не конкретна фізична пристрій, а програма. Її побудова і наступні модифікації, як правило, вимагають значно менших витрат, ніж подібні маніпуляції над реальним об'єктом.
Крім того, в дослідній установці нерідко просто неможливо буває відтворити деякі критичні режими або екстремальні умови. Тому математичне моделювання може виявитися практично єдино можливим способом дослідження.
При аналітичному підході так само, як і в обчислювальному експерименті, будується математична модель. Але досліджується ця модель виключно за допомогою аналітичних викладок, без залучення будь-яких чисельних методів. Якщо аналітичних викладок виявляється досить, то даний підхід призводить до суворого точного розв'язання.
Однак на практиці, як це не парадоксально, аналітичного підходу зазвичай відводиться роль інструмента для (порівняно швидкого) отримання грубих оцінок. Пояснюється це тим, що аналітичними викладками вдається обмежитися тільки для нескладних, сильно спрощених моделей реальних процесів. Отримується тут суворе аналітичне рішення насправді в силу вихідного огрубіння моделі виявляється вельми далеким від досконалості. Навпаки, чисельні методи, що застосовуються в обчислювальному експерименті, дають можливість вивчати більш складні моделі, досить повно і точно відображають досліджувані процеси.
Зазначені гідності обчислювального експерименту вивели його в число основних методів дослідження таких великих фізичних і інженерно-технічних проблем, як завдання ядерної енергетики, освоєння космічного простору та ін. Програмні комплекси, обслуговуючі обчислювальний експеримент, об'ємні і складні, в їх створення залучений численний загін програмістів. Тому особливої ​​актуальності набуває вивчення виникаючих тут конфігураційних побудов, які, як буде видно з подальшого викладу, постійно знаходяться в центрі уваги учасників такого роду розробок.

4.1.2. Цикл обчислювального експерименту. У циклі обчислювального експерименту можна виділити наступні етапи (рис. 4.1).



Мал. 4.1. Етапи обчислювального експерименту

Е т а п 1. Побудова математичної моделі (складання рівнянь, що описують досліджуване явище).
Е т а п 2. Вибір чисельних методів розрахунку (побудова дискретної моделі, апроксимуючої вихідну математичну задачу, побудова різницевої схеми, розробка обчислювального алгоритму і т. Д.).
Е т а п 3. Створення програми, що реалізує обчислювальний алгоритм.
Е т а п 4. Проведення розрахунків і обробка отриманої інформації.
Е т а п 5. Аналіз результатів розрахунків, порівняння (якщо це можливо) з натурним експериментом.

Зазвичай на останньому (5-м) етапі дослідник приходить до висновку про те, що необхідно внести певні зміни в рішення, прийняті на етапах 1, 2 або 3.
Так, може з'ясуватися, що побудована модель недостатньо добре відображає особливості досліджуваного явища. У цьому випадку модель коригується, вносяться відповідні поправки в чисельні методи і реалізують їх програми і виконується новий розрахунок. Тим самим цикл обчислювального експерименту відтворюється в повному обсязі.
При аналізі результатів можуть бути виявлені які-небудь недоліки використовуваних чисельних методів, пов'язані, зокрема, з міркуваннями точності або ефективності. Зміна методів тягне за собою зміну відповідних програм і т. Д. Інакше кажучи, цикл повторюється в дещо скороченому вигляді (етапи 2-5).
Нарешті, може виявитися невдалим деякий програмне рішення, наприклад обраний спосіб роботи з зовнішньою пам'яттю. Перегляд таких рішень призводить до повторення етапів 3-5.

4.1.3. Особливості програмування. Зрозуміло, цикли, подібні циклу обчислювального експерименту, виникають практично в будь-якому мало-мальськи складному проекті Програми. Найперша версія програми зазвичай чимось не задовольняє розробника або замовника, і доводиться уточнювати постановку задачі, покращувати окремі алгоритми і т. Д. Однак в більшості випадків досить буває виконати кілька циклів, які потребують порівняно невеликих зусиль, і програма знаходить бажаний вид.
Зовсім інакше йде справа в обчислювальному експерименті. Тут програма мислиться як експериментальна установка, від перших дослідів з якою навряд чи слід очікувати скільки-небудь цікавих результатів. Дані перших дослідів послужать всього-на-всього відправною точкою тривалого процесу змін і удосконалень установки, який тільки і здатний привести до досить обґрунтованим висновкам про досліджуваному об'єкті.
Таким чином, поява первісної версії програми лише в найзагальніших рисах намічає напрямок досліджень. Основна ж робота з програмування ще попереду - вона пов'язана з багаторазовими модифікаціями програми, що відображають еволюцію математичної моделі і методів її розрахунку. Число циклів обчислювального експерименту, кожен з яких пов'язаний з модифікацією розрахункової програми, нерідко досягає десятків тисяч. Тому раціональна організація таких модифікацій - ключ до ефективного програмування даного класу задач.
Продовжуючи паралель з натурним експериментом, можна помітити, що там зазвичай не поспішають викидати на смітник окремі вузли, вилучені або замінені в експериментальній установці при проведенні чергового досвіду: вони ще не раз можуть стати в нагоді згодом. Аналогічно і рішення (а разом з ними і відповідні їм фрагменти програм), переглядається на черговому циклі обчислювального експерименту, як правило, не відкидаються і можуть використовуватися потім для інших розрахунків. Наприклад, метод, який опинився непридатним для однієї моделі, цілком може підійти для розрахунку наступної моделі і т. Д.
Отже, головний напрямок діяльності програміста, зайнятого обчислювальним експериментом, - не створення нових, а розвиток існуючих програм. Це розвиток здійснюється, як правило, не за рахунок заміни наявних модулів їх більш досконалими версіями, а за рахунок розширення: включення в програмний фонд все нових і нових модулів, що відображають різні рішення, що приймаються в ході експерименту.
Накопичуються модулі можуть потім комбінуватися в найрізноманітніших поєднаннях, дозволяючи тим самим провести досить систематичне і глибоке дослідження. Потреба в подібних маніпуляціях над модулями регулярно виникає у зв'язку з тим, що дослідник постійно конструює нові варіанти моделі, що поєднують в собі ті чи інші виконувалися коли-небудь зміни або уточнення. Таким чином, інформація, що цікавить нас багатоваріантність програм обчислювального експерименту є закономірним наслідком початкової багатоваріантності моделі.
Складність реалізованих математичних моделей, а також необхідність зберігання численних варіантних модулів призводять до того, що характерні розміри програмного фонду обчислювального експерименту виявляються досить значними. Кількість лотів в розрахунках модулів тут нерідко досягає декількох тисяч, а сумарна довжина текстів програм - сотень тисяч рядків.
Організувати ефективне функціонування та розвиток такого обширного, складного і специфічного програмного господарства дуже нелегко. Проте життя показало, що всі виникаючі тут труднощі можна подолати - методом обчислювального експерименту були успішно вирішені багато важливих практичні завдання. Історія програмування задач обчислювального експерименту налічує понад три десятиліття, і за цей час накопичено досить значний досвід, що дозволяє говорити про існування певної технології роботи з різноманітними програмами. Ця технологія виявилася досить надійною і ефективною; саме добротністю яку застосовували технології пояснюється життєстійкість відомих програмних реалізацій обчислювального експерименту.
У завданнях обчислювального експерименту в повній мірі проявляються практично всі специфічні особливості різноманітних програм. У той же час обчислювальний експеримент є найбільш крупним споживачем технології багатоваріантності. Тому вирази «програмування задач обчислювального експерименту» і «створення різноманітних програм» іноді будуть використовуватися як синоніми.