В данном разделе описывается алгоритм, примененный для автоматической генерации атласа диссипативных и дисперсионных свойств разностных схем второго порядка аппроксимации на компактных вычислительных шаблонах. Шаблон будем называть компактным, если он состоит из четырех узлов, индексы \((j, k)\) которых удовлетворяют условиям \(i-1\le j\le i+1\), \(n-1\le k\le n+1\). Генерация паспорта каждой разностной схемы, состоит из следующих этапов:
Алгоритм реализован на языке системы символьного программирования Wolfram Mathematica 10.3. Ниже будут приведены некоторые фрагменты кода, иллюстрирующие некоторые особенности реализации алгоритма. Комментарии в коде расположены после операторов, к которым они относятся.
Основной цикл программы выглядит следующим образом:
| initial = Table[If[i < = 4, 1, 0], {i, 9}]; | (* начальная последовательность *) |
| templates = Permutations@initial; | (* список всех возможных перестановок *) |
| For[iTask = 1, iTask < Length[templates], iTask++, | |
| task = templates; | (* очередной шаблон *) |
| sсh = BuildSсheme[task]; | (*построение схемы по шаблону *) |
| sсhout = BuildShOut[sсh]; | (* символьное представление схемы *) |
| poly = BuildPoly[sсh]; | (* характеристический полином *) |
| limits = BuildLimits[poly]; | (* интервалы устойчивости *) |
| For[ilim = 1, ilim < Length[ilim], ilim++, | (* цикл по интервалам устойчивости *) |
| limit = limits; | |
| rmin = limit; | (* нижний предел интервала *) |
| rmax = limit; | (* верхний предел интервала *) |
| If[rmin == rmax, Continue[]]; | (* пропуск вырожденного интервала *) |
| roots = BuildRoots[sh, rmin, rmax]; | (* нахождение и сортировка корней *) |
| sol = BuildDis2[roots, rmin, rmax]; | (* вычисление модуля и аргумента *) |
| dis2 = CheckSolution[sol, rmin, rmax]; | (*коррекция значений *) |
| surfs = BuildGraphs[dis2, rmin, rmax]; | (*построение графиков *) |
| OutGraphs[surfs, rmin, rmax]; | (* вывод в файл *) |
| ]; ]; |
|