Шаг 6. Построение графиков

CalculationPlotter (Core/Scripting/Plotting) — базовый, представление-агностичный слой визуализации поверх Calculation (карта класса — Скриптовый слой (Core/Scripting)). Каждая функция сама берёт сетку из calculation.InitialConditions.Split и нужное поле из calculation.CalculatedPhysicalProperties — строить график можно сразу после CalculationRunner.Run, без ручного обращения к внутренним полям.

Один график

calculation = CalculationRunner.Run(cfg);

CalculationPlotter.PlotOrderParameter(calculation);

Без 'Axes' функция сама создаёт новую фигуру и оси и возвращает их — удобно, если нужно донастроить график (заголовок, экспорт):

ax = CalculationPlotter.PlotOrderParameter(calculation);
title(ax, 'Мой расчёт');
exportgraphics(ax, 'order_parameter.png');

Доступные функции:

Функция

Что рисует

PlotOrderParameter(calculation, ...)

Δ(z) на последнем шаге

PlotOrderParameterHistory(calculation, ...)

Δ(z) по всем итерациям самосогласования - удобно проверить сходимость (см. FAQ и типичные ошибки, «Расчёт не сходится»)

PlotDensityOfStates(calculation, ...)

карта N(z,ε) (только EnergyBased)

PlotSpinResolvedDensityOfStates(calculation, 'ZIndex', i, ...)

N↑(ε)/N↓(ε) в точке с индексом i по z (по умолчанию i=1 — граница) (только EnergyBased)

PlotMagnetization(calculation, ...)

M(z) (только EnergyBased)

PlotConductivity(calculation, ...)

карта |σ(z,ω)| (только EnergyBased, нужна GridConfig.SetOmegaGrid)

PlotOrderParameter/PlotOrderParameterHistory работают для любого представления (EnergyBased и Matsubara) — остальные величины сегодня считаются только в EnergyBased, см. Шаг 3. Какие величины считать.

Несколько графиков на одной фигуре

'Axes' принимает готовые оси — например, из tiledlayout:

figure;
t = tiledlayout(2, 2);
CalculationPlotter.PlotOrderParameter(calculation, 'Axes', nexttile(t));
CalculationPlotter.PlotDensityOfStates(calculation, 'Axes', nexttile(t));
CalculationPlotter.PlotMagnetization(calculation, 'Axes', nexttile(t));
CalculationPlotter.PlotConductivity(calculation, 'Axes', nexttile(t));

Сравнение серии на одном графике

Функции не вызывают hold сами (иначе второй вызов на тех же осях стёр бы первый график) — для наложения нескольких расчётов включите hold на осях перед циклом:

items = SeriesLoader.LoadForSeries(cfgs(1));

ax = CalculationPlotter.PlotOrderParameter(items(1).Calculation);
hold(ax, 'on');
for i = 2:numel(items)
    CalculationPlotter.PlotOrderParameter(items(i).Calculation, 'Axes', ax);
end
legend(ax, [items.TaskName]);

Если нужно что-то не из этого базового набора

CalculationPlotter — это минимальный, общий для всех задач набор. Специфичная стилизация под конкретную статью/задачу (свои цвета, разметка, композиция из нескольких серий) — не в ядре, а на уровне Metatron-Research: пишите свою функцию поверх calculation.CalculatedPhysicalProperties и calculation.InitialConditions.Split (см. их поля в Физическая модель (Core/Model)), по образцу того, как устроены функции самого CalculationPlotter.

Если нужного поля нет

Все функции проверяют, что расчёт запущен (calculation.IsCalculated) и что конкретное поле результата не пусто, и бросают понятную ошибку вместо пустого графика — например, если запросить PlotDensityOfStates для Matsubara (эта величина там пока не считается, см. Шаг 3. Какие величины считать) или для расчёта, где нужная процедура не была указана в cfg.Procedures. Текст ошибки называет, какую процедуру добавить.