Ready code for defence

This commit is contained in:
ParkSuMin committed 2025-11-13 11:11:42 +03:00
1 parent 2951d247ac
commit 3625d35398
9 files changed
+360 -169

No files matched your search

+2
View File
@@ -361,3 +361,5 @@ MigrationBackup/
# Fody - auto-generated XML schema # Fody - auto-generated XML schema
FodyWeavers.xsd FodyWeavers.xsd
test*.cpp
+7 -4
View File
@@ -102,6 +102,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>include/</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -116,20 +117,22 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>include/</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Solver.hpp" /> <ClInclude Include="include\Header.hpp" />
<ClInclude Include="include\Params.hpp" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\main.cpp" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
+9 -6
View File
@@ -14,17 +14,20 @@
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Solver.hpp"> <ClInclude Include="include\Header.hpp">
<Filter>Файлы заголовков</Filter>
</ClInclude>
<ClInclude Include="include\Params.hpp">
<Filter>Файлы заголовков</Filter> <Filter>Файлы заголовков</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClCompile Include="src\main.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup>
</Project> </Project>
-2
View File
@@ -1,2 +0,0 @@
#pragma once
+25
View File
@@ -0,0 +1,25 @@
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
#include <iomanip>
#define M_PI 3.14159265358979323846
enum Variables {
dU_C1 = 0,
dU_Cb,
dI_L,
U_C1,
U_Cb,
I_L,
phi_1,
phi_2,
phi_3,
phi_4,
phi_5,
I_E1,
I_E2
};
constexpr char RESULT[] = "result.dat";
+22
View File
@@ -0,0 +1,22 @@
#define DIMENTION 13 // Ðàçìåðíîñòü
// Ïàðàìåòðû ñõåìû
#define MFt 0.026
#define C1 0.1e-6
#define Cb 2e-12
#define E2 5
#define L1 0.1
#define It 1e-12
#define Rb 20.0
#define Ru 1000000
#define R1 1000.0
#define R2 10000.0
#define T 1e-3 // Âðåìÿ ðàñ÷åòà
#define N_iter 7 // Ìàêñèìàëüíîå ÷èñëî èòåðàöèé ìåòîäà Íüþòîíà
#define ACR 1e-2 // Òî÷íîñòü
#define EPS_MAX 0.2 // Ìàêñèìàëüíîå îøèáêà ìåòîäà Íüþòîíà íà øàãå
#define EPS_MIN 1e-8 // Ìèíèìàëüíàÿ îøèáêà ìåòîäà Íüþòîíà íà øàãå
#define SMN 1e-10 // Ìèíèìàëüíûé øàã ïî âðåìåíè
-157
View File
@@ -1,157 +0,0 @@
#include <iostream>
#include <Eigen/Dense>
#define M_PI 3.14159265358979323846 // pi
using namespace Eigen;
#define STATE_VARS 3*2 // Сами переменные и их проивзодные
#define PHI 5 // Количество узлов в схеме
#define EDS 2 // Количество источиков напряжения
#define MATRIX_DIM STATE_VARS+PHI+EDS // Размерность якобиана
const double TK = 1e-3; // время расчета
const double T_Start = 1e-10; // начальный шаг
const double SMN = 1e-15; // минимальный шаг
const double ACR = 1e-2; // точность
// Параметры модели
double TAU = 5e-9;
double MFt = 0.026;
double C1 = 0.1;
double Cb = 2e-12;
double L = 0.001;
double R1 = 1000;
double R2 = 10000;
double Ru = 1e+6;
double Rb = 20;
double It = 1e-12;
double IL_prev = 0;
double UC1_prev = 0;
double UCb_prev = 0;
double E2 = 5.;
// Синусоидальный источник тока
double E1(double t) {
const double amplitude = 10.0;
const double period = 1e-4;
const double frequency = 2 * M_PI / period;
const double phase = 0.0;
return amplitude * sin(frequency * t + phase);
}
// Якобиан
MatrixXd Y = MatrixXd::Zero(MATRIX_DIM, MATRIX_DIM);
// Вектор невязок
VectorXd N = VectorXd::Zero(MATRIX_DIM);
// Вектор поправок
VectorXd dX = VectorXd::Zero(MATRIX_DIM);
// Вектор фазовых переменных
VectorXd X = VectorXd::Zero(MATRIX_DIM);
// Копия вектора фазовых переменных (для обработки случая неудачного шага)
VectorXd X_backup = VectorXd::Zero(MATRIX_DIM);
void Jacobian(double dt) {
Y(0, 0) = 1, Y(0, 3) = -1. / dt;
Y(1, 1) = 1, Y(1, 4) = -1. / dt;
Y(2, 2) = 1, Y(2, 5) = -1. / dt;
Y(3, 3) = 1., Y(3, 0) = -1.;
Y(4, 4) = 1., Y(4, 8) = -1., Y(4, 9) = 1.;
Y(5, 2) = L, Y(5, 7) = -1., Y(5, 10) = 1.;
Y(6, 6) = 1. / R1, Y(6, 7) - 1. / R1, Y(6, 11) = -1.;
Y(7, 5) = 1., Y(7, 6) = -1. / R1, Y(7, 7) = 1. / R1 + 1. / Rb, Y(7, 8) = -1. / Rb;
Y(8, 1) = Cb, Y(8, 7) = -1. / Rb, Y(8, 8) = 1. / Rb + 1. / Ru, Y(8, 9) = -1. / Ru;
Y(9, 1) = -Cb, Y(9, 8) = -1. / Ru, Y(9, 9) = 1. / Ru, Y(9, 11) = 1.;
Y(10, 0) = C1, Y(10, 5) = -1., Y(10, 10) = 1. / R2;
Y(11, 6) = -1.;
Y(12, 9) = -1.;
}
// 0 - 2 производные
// 3 - 5 переменные состояния
// 6 - 10 узлы
// 11 - 12 токи на ЭДС
// Расчёт вектора невязки
void nevyzka(double dt, double cur_time) {
N(0) = X(0) - (X(3) - UC1_prev) / dt;
N(1) = X(1) - (X(4) - UCb_prev) / dt;
N(2) = X(2) - (X(5) - IL_prev) / dt;
N(3) = X(3) - X(10);
N(4) = X(4) - (X(8) - X(9));
N(5) = X(5) * L - (X(7) - X(10));
N(6) = -X(11) + (X(6) - X(7)) / R1;
N(7) = -(X(6) - X(7)) / R1 + X(5) + (X(7) - X(8)) / Rb;
N(8) = -(X(7) - X(8)) / Rb + It + (X(8) - X(9)) / Ru + Cb * X(1);
N(9) = -It - (X(8) - X(9)) / Ru - Cb * X(1) + X(11);
N(10) = -X(5) + C1 * X(0) + X(10) / R2;
N(11) = E1(cur_time) - X(6);
N(12) = E2 - X(9);
// Перед вектором невязок стоит минус
N = -1 * N;
}
int main() {
double dt = T_Start; // Шаг по времени
double dt_prev = dt; // Предыдущий шаг по времени
double eps_max = ACR; // Максимальное отклонение
double eps_min = 1e-10; // Минимальное отклонение
int counter = 0; // Счетчик шагов по времени
double cur_time = 0; // Текущее время
double eps_cur;
double eps;
double step_c = 0;
while (dt <= TK) {
// Счётчик итераций
int iteration = 0;
bool flag = true;
while (flag) {
Jacobian(dt);
nevyzka(dt, cur_time);
#ifdef _DEBUG
std::cout << Y << std::endl << N;
#endif
dX = Y.fullPivLu().solve(N);
#ifdef _DEBUG
std::cout << '\n' << dX;
#endif
X += dX;
iteration++;
double maximum = X.maxCoeff();
if (maximum <= ACR) {
flag = false;
}
else if (iteration == 7 && flag) {
iteration = 0;
dt /= 2.;
if (dt < SMN) {
std::cerr << "Sorry, but i can not solve this" << std::endl;
exit(-1);
}
X = X_backup;
}
}
// TODO: реализовать вычисление уточнённое решения, сравнить его с вычисленным,
// возможно изменить шаг моделирования
}
// Для примера
/*Jacobian(0.1);
nevyzka(0.1, 0);
std::cout << Y << std::endl << N;*/
}
+176
View File
@@ -0,0 +1,176 @@
#include <Eigen/Dense>
#include "Header.hpp"
#include "Params.hpp"
double dt = 1e-5; // Начальный шаг по времени
double prev_dt = dt;
double t_cur = 0;
using namespace std;
using namespace Eigen;
double E1(double t) {
const double amplitude = 10.0;
const double period = 1e-4;
const double frequency = 2 * M_PI / period;
const double phase = 0.0;
return amplitude * sin(frequency * t + phase);
}
// Заполнение матрицы
void fill_Jacobian(MatrixXd& Y, const VectorXd& cur_X) {
double d_Id = It / MFt * exp(cur_X[U_Cb] / MFt);
for (int i = 0; i < 3; i++) {
Y(i, i) = 1.0;
Y(i, i + 3) = -1.0 / dt;
}
Y(U_C1, U_C1) = 1.;
Y(U_C1, phi_5) = -1.;
Y(U_Cb, U_Cb) = 1.;
Y(U_Cb, phi_3) = -1.;
Y(U_Cb, phi_4) = 1.;
Y(I_L, dI_L) = L1;
Y(I_L, phi_2) = -1.;
Y(I_L, phi_5) = 1.;
Y(phi_1, phi_1) = 1. / R1;
Y(phi_1, phi_2) = -1. / R1;
Y(phi_1, I_E1) = 1.;
Y(phi_2, I_L) = 1.;
Y(phi_2, phi_1) = -1. / R1;
Y(phi_2, phi_2) = 1. / R1 + 1. / Rb;
Y(phi_2, phi_3) = -1. / Rb;
Y(phi_3, dU_Cb) = Cb;
Y(phi_3, phi_2) = -1. / Rb;
Y(phi_3, phi_3) = 1. / Rb + 1. / Ru + d_Id;
Y(phi_3, phi_4) = -1. / Ru - d_Id;
Y(phi_4, dU_Cb) = -Cb;
Y(phi_4, phi_3) = -1. / Ru - d_Id;
Y(phi_4, phi_4) = 1. / Ru + d_Id;
Y(phi_4, I_E2) = 1.;
Y(phi_5, dU_C1) = C1;
Y(phi_5, I_L) = -1.;
Y(phi_5, phi_5) = 1. / R2;
Y(I_E1, phi_1) = -1.;
Y(I_E2, phi_4) = -1.;
}
// Заполнение вектора невязок
void fill_Nevyzka(VectorXd& b, const VectorXd& cur_X, const VectorXd& prev_X) {
double Id = It * exp(cur_X[U_Cb] / MFt);
// Первые три уравнения (производные)
b[dU_C1] = cur_X[dU_C1] - (cur_X[U_C1] - prev_X[U_C1]) / dt;
b[dU_Cb] = cur_X[dU_Cb] - (cur_X[U_Cb] - prev_X[U_Cb]) / dt;
b[dI_L] = cur_X[dI_L] - (cur_X[I_L] - prev_X[I_L]) / dt;
// Уравнения для переменных состояния
b[U_C1] = cur_X[U_C1] - cur_X[phi_5];
b[U_Cb] = cur_X[U_Cb] - (cur_X[phi_3] - cur_X[phi_4]);
b[I_L] = L1 * cur_X[dI_L] - (cur_X[phi_2] - cur_X[phi_5]);
// Уравнения Кирхгофа для узлов
b[phi_1] = cur_X[I_E1] + (cur_X[phi_1] - cur_X[phi_2]) / R1;
b[phi_2] = -(cur_X[phi_1] - cur_X[phi_2]) / R1 + cur_X[I_L] + (cur_X[phi_2] - cur_X[phi_3]) / Rb;
b[phi_3] = -(cur_X[phi_2] - cur_X[phi_3]) / Rb + Id + (cur_X[phi_3] - cur_X[phi_4]) / Ru + Cb * cur_X[dU_Cb];
b[phi_4] = -Id - (cur_X[phi_3] - cur_X[phi_4]) / Ru - Cb * cur_X[dU_Cb] + cur_X[I_E2];
b[phi_5] = -cur_X[I_L] + C1 * cur_X[dU_C1] + cur_X[phi_5] / R2;
// Уравнения для источников
b[I_E1] = E1(t_cur) - cur_X[phi_1];
b[I_E2] = E2 - cur_X[phi_4];
b = -1 * b;
}
int main() {
ofstream result_file(RESULT);
VectorXd delta_X(DIMENTION);
VectorXd cur_X = VectorXd::Zero(DIMENTION);
VectorXd prev_X = VectorXd::Zero(DIMENTION);
VectorXd prev_prev_X = VectorXd::Zero(DIMENTION);
MatrixXd Y = MatrixXd::Zero(DIMENTION, DIMENTION);
VectorXd b(DIMENTION);
double step_count = 0; // Счетчик числа шагов
double it_count = 0; // Счетчик числа итераций метода Ньютона
int counter = 0; // Счетчик числа шагов
while (t_cur < T) {
bool is_end = false; // Индикатор завершения итераций метода Ньютона
size_t n = 0; // Счетчик числа итераций метода Ньютона
while (!is_end) {
// Заполнение матрицы узловых проводимостей и вектора невязок значениями
fill_Jacobian(Y, cur_X);
fill_Nevyzka(b, cur_X, prev_X);
// Решение СЛАУ
delta_X = Y.partialPivLu().solve(b);
cur_X += delta_X;
// Проверка точности
is_end = delta_X.cwiseAbs().maxCoeff() <= ACR;
n++;
// Если требуемая точность не достигнута
if (!is_end) {
// Если превышено максимальное число итераций
if (n > N_iter) {
n = 0;
dt *= 0.5;
cur_X = prev_X;
if (dt < SMN) {
throw domain_error("Решение не сходится, dt < SMN");
}
}
}
}
double cur_delta = 0.0;
// Расчет текущей ошибки метода Ньютона
for (int i = dU_C1; i < DIMENTION; i++) {
//if (i == dU_Cb) continue;
double tmp = 0.5 * dt * dt * abs(((cur_X(i) - prev_X(i)) / dt - (prev_X(i) - prev_prev_X(i)) / prev_dt));
cur_delta = (tmp > cur_delta) ? tmp : cur_delta;
}
// Если интегрирование неудовлетворительно по точности
if (cur_delta > EPS_MAX && dt > SMN) {
// Уменьшаем шаг по времени и отбрасываем результаты текущего шага
dt *= 0.5;
cur_X = prev_X;
}
else {
// Сохранение значений с предыдущего шага
prev_prev_X = prev_X;
prev_X = cur_X;
prev_dt = dt;
// Вывод значения переменной на текущем временном шаге
result_file
<< t_cur << ' '
<< cur_X(phi_1) << ' '
<< cur_X(phi_2) << ' '
<< cur_X(phi_3) << ' '
<< cur_X(phi_4) << ' '
<< cur_X(phi_5) << std::endl;
// Шаг по времени
t_cur += dt;
counter++;
step_count += dt;
it_count += n;
cout << counter << " n_it=" << n << " t=" << t_cur << endl;
if (cur_delta < EPS_MIN) {
dt *= 2;
}
}
}
cout << "Число шагов по времени: " << counter << endl;
cout << "Средний шаг по времени: " << step_count / counter << endl;
cout << "Среднее число итераций: " << it_count / counter << endl;
return 0;
}
+119
View File
@@ -0,0 +1,119 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "a4654478",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<>:5: SyntaxWarning: invalid escape sequence '\\s'\n",
"<>:5: SyntaxWarning: invalid escape sequence '\\s'\n",
"C:\\Users\\fanof\\AppData\\Local\\Temp\\ipykernel_21748\\2205711897.py:5: SyntaxWarning: invalid escape sequence '\\s'\n",
" data = pd.read_csv('test.csv', sep='\\s+', header=None)\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc8AAAPZCAYAAADHsdIGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd5hdZbX/v+fMmXOmZGaSTHoIKbTQCb2oRKkqCldFfog0OyRYsIHXS7EFlSvgFQW9SlDkgnrFwhWQFpBeA4QSSO89mX76/v1xzrvPPlPP3u9a+6zMrM/z5EEzcybv7P3u/b7vWt/1XRHHcRwoiqIoiqIoiqIoiqIoiqIoiuISrfYAFEVRFEVRFEVRFEVRFEVRFEUaGjxXFEVRFEVRFEVRFEVRFEVRlF5o8FxRFEVRFEVRFEVRFEVRFEVReqHBc0VRFEVRFEVRFEVRFEVRFEXphQbPFUVRFEVRFEVRFEVRFEVRFKUXGjxXFEVRFEVRFEVRFEVRFEVRlF5o8FxRFEVRFEVRFEVRFEVRFEVReqHBc0VRFEVRFEVRFEVRFEVRFEXphQbPFUVRFEVRFEVRFEVRFEVRFKUXGjxXFEVRFEXpxYwZMxCJRIb8s2jRomoPtQ+LFi1CJBLB3Llzqz0URVEURVEURVGU3ZpYtQegKIqiKIoilRNOOAF77733gF+fNGlSiKNRFGUoIpEIAMBxHB2HoiiKoiiKYo0GzxVFURRFUQbgM5/5DC666KJqD0NRFEVRFEVRFEWpAmrboiiKoiiKoiiKoiiKoiiKoii90OC5oiiKoigKAddccw0ikQiuueYarF69GhdccAEmT56Muro67LvvvrjmmmvQ09PT53OZTAZ33HEHzjvvPMyePRvNzc2or6/Hfvvthy9+8YvYsGHDgP/m66+/jtNPPx2NjY2YMmUKrr32WuRyOffrS5Yswdy5c9HQ0IBp06bh6quvRjqd7vNzLrroIkQiESxcuLDP15YuXYpEItGvj/pg/uqvvPIKxo0bh1gsht///vdlXzOe8qtWrerzudtuu831lL/mmmsG/N0HI4hX/XPPPYdvfOMbOProozFp0iTE43FMnDgRH/rQh/DQQw/1++8sXLgQkUhk0OqEgX7Xwa7BYD+7kn/Ty9y5c/v8zn/6058QiUQwfvx4rFu3rs9nHnjgAdTU1KClpQXvvPNORf+Od/73Ztu2bWhtbUUkEsGMGTPKvrZs2TKce+65OOiggzB27FjE43FMnToVJ510Eu68886KbU/Mv2/ofc97X+e3334bn//857HXXnuhrq4OLS0teM973oM77rij35/f1taGb3/72zj44IPR2NiIRCKBKVOm4IQTTsBVV12FTCYTaByD8fbbb+PSSy/Ffvvth4aGBjQ3N+OAAw7ApZdeiiVLlpR974svvohzzjkHe+yxB+LxOJqbmzFr1ix89KMfxV//+lf3+84991xEIhFcd911A/679957LyKRCObMmVPxWBVFURRFUYYratuiKIqiKIpCyMqVK3HEEUcgFovhPe95D3p6evDoo4/i2muvxUMPPYSHHnoIdXV17vdv3rwZ559/PlpaWrD//vvjkEMOQVdXFxYvXoz/+q//wl133YWnnnqqj/f666+/jhNOOAFtbW04+OCDMXv2bNx000148MEHAQCbNm3Ce9/7Xuy11144/fTT8fDDD+M73/kOXnvtNfz5z3+u+PeZP39+vwH3wXjllVdw0kknYdeuXfjtb3+LT3ziExV9bufOnfjmN7/p698ajAsvvLDs/99///3YvHlzv9/7rW99C48++igOPPBAHHHEEWhsbMTy5ctx77334t5778WNN96IL33pS2RjqyYf+9jHcNlll+G//uu/cO655+LRRx9FLFY4Fqxfvx7nn38+8vk8fvWrX2Gfffax/veuuOIK7Nixo9+vrVq1Cvfeey8OOeQQ7Lvvvqirq8OaNWvw2GOP4ZFHHsHjjz+OW265Zch/47DDDsOFF16I22+/HUDfez9q1Cj3f//xj3/EBRdcgGQyidmzZ+MDH/gA2tra8Oyzz+L888/HI488gt/85jfu93d3d+Nd73oXlixZgvHjx+Okk05CY2MjNm3ahLfeegtPPfUULr/8cowePdrXOAbjzjvvxKc+9SmkUinsueee+MAHPoB8Po8VK1bglltuwYQJE3DQQQcBAB5++GG8//3vRyaTwaGHHorjjjsOuVwO69evx//93/8hl8vhzDPPBABcfPHFuOuuu3D77bfjiiuu6Pffvu222wAAn/rUpyoaq6IoiqIoyrDGURRFURRFUcqYPn26A8C57bbbKv7M1Vdf7QBwADhnnnmm093d7X5t7dq1zr777usAcK644oqyz7W3tzt//etfnVQqVfb36XTaufLKKx0Azgc+8IE+/9673vUuB4Dz9a9/3f27devWOfvss487jgULFrhfW79+vTNz5kwHgHPnnXeW/awLL7yw39/37rvvdgA4e+65pwPAOfHEE8u+/uijj/b5+8WLFzutra1OTU1Nn3/HYK7vypUry/7+kksuKfv3rr766n4/Pxi5XM79/Xtz4oknOgCcRx99tM/X/vGPfzgbNmzo8/dPPfWU09zc7NTW1jrr1q0r+9ptt93mAHAuvPDCAccz0O860N8P9bMr+Te9DPQ7p1Ip5+ijj3YAON/85jcdx3GcTCbjzqt58+ZV9PMNZv73vmdPP/20E4lE3Hs6ffr0sq+n02knl8v1+XmvvPKKU1tb60SjUaetra3icQx07w2vvvqqk0gknLq6Oud///d/y762atUq5+CDD3YAOLfffrv797fffrsDwHn/+9/vpNPpss/kcjln0aJFfZ7focYxGC+88IJTW1vrRCIR56c//Wmf67Nq1SrnhRdecP//e9/7XgeAc8cdd/T5Wbt27XKefvrpsvGae+H9e8PWrVud2tpaJx6PO9u2bQs0fkVRFEVRlOGE2rYoiqIoiqIQUl9fj1tuuQX19fXu3+2xxx74z//8TwDAz3/+cySTSfdrTU1N+PCHP4x4PF72c2pra/GDH/wAU6ZMwf3334+Ojg73a0uXLsUTTzyBMWPG4Hvf+57791OnTsWNN94IADjqqKPKlKXG1gUAbr311iF/j87OTlx++eVobGws+zcGw6s4v+OOO3DuuedW9DmgYDtx6623Ys6cObjgggsq/lxvzLU1SupKef/734/Jkyf3+fvjjjsO8+bNQyaTKbO/2N2Jx+O4++67MWbMGPzoRz/CP/7xD/z7v/87nnjiCRxxxBHufLUhn89j3rx5iEQiA/682tpaRKN9jyS1tbXu/66pqbEei+H73/8+UqkUvve97+EjH/lI2demT5+OX//61wCAn/70p+7fm2qFU045pWxcABCNRnHiiSf2eX5t+N73vodMJoP58+fjsssu63N9pk+fjiOOOKLP+D7wgQ/0+VktLS049thjy8Zr1PBGYe7l97//PTKZDD784Q+jtbWV5PdRFEVRFEXZnVHbFkVRFEVRFEJOPfVUTJo0qc/fn3HGGWhtbcX27dvx0ksv4fjjjy/7+iuvvIKHH34YK1euRFdXF/L5PAAgm80in89j2bJlrgfxM888AwA4+uij+wTtGhoayv7r5cQTTwRQ8PfO5/P9Bi0N1157LdavX48FCxZg2rRpQ/7eJnC+fft23HDDDfh//+//DfkZQz6fx6WXXgrHcXDzzTfjgQceqPizvenq6gLQ/+8/FNu3b8f//d//YcmSJdi5c6frY218v5cuXRp4XBKZMWMGFi5ciLPOOgvnnnsuOjo60NLSgj/84Q9IJBLWP/8Xv/gFXnrpJXz+85/HkUceOej3vvLKK7jhhhuQy+Wwbt06PPnkk8hkMrjyyivR2NhoPRagMM/uu+8+AMA555zT7/cceeSRGDVqFF5++WUkk0nU1dXhqKOOAgD86Ec/QmtrK8444wyMHTuWZEy9yeVyrvXS5z73uYo+c/TRR+ONN97Aeeedh29961s49thjB00eXXTRRfje976Hu+++GzfeeGNZok8tWxRFURRFUcrR4LmiKIqiKAohM2fOHPBrM2bMwPbt28uaNHZ1deH888/HPffcM+jPbW9vd//3xo0bAQATJ070NTYT1O/p6cHOnTsHVJa+8cYbuPHGG7Hffvvh8ssvx1NPPTXoz129erUbOAeAu+++G/Pnz69Y/f3f//3feO6553DxxRfjuOOOswqer1+/HgB8q2Z/9atf4Stf+YobfO8P7z3wcvvtt7se134ZbL4MhvffjEQiaGpqwuzZs3H22Wdj/vz5Zb76g/HhD38Yn/nMZ/CrX/0KAPDLX/4Ss2bNCjQmL1u2bMG3v/1tjBs3Dj/4wQ8GvHaGtWvXll3DUaNG4aabbsIll1xiPRbD9u3b3XFUkhDavn07pk6dirlz5+Kb3/wmfvzjH+PCCy9EJBLBPvvsgxNOOAFnnnkmPvShDw2aiPI7RjMH99tvv4o+s2DBArz66qu47777cN9996G+vh6HH3445s6di/POOw/7779/2ffPmjULJ554IhYtWoR77rnH7Unw8ssv45VXXsGUKVNw6qmnkvw+iqIoiqIouzsaPFcURVEURQkZx3Hc/33llVfinnvuwezZs3HdddfhqKOOwrhx41xF+fHHH4+nn3667DPe/00xht7MmzcP2WwWN998c0V2FKtWrUJNTQ1+97vf4fe//z3uv/9+XHvttfjud7875Ge3b9+Ob33rWxgzZgx++MMf+vod+mPZsmUA/AWlX3zxRXz+859HTU0NfvjDH+JDH/oQ9txzTzQ0NCASieCXv/wlPv/5zw94zfbaay+8613v6vdrf/rTnwYNyH/0ox/tt4nksmXL8OSTTw74Oe+/mcvlsHbtWjzxxBN47rnncP/99+PBBx9EJBIZ7NcGULj+Ro0NFKoaPv7xjw/5uaH4xje+gV27duG///u/MXbs2CGD52eccQYcx0EqlcLy5cvLine truncated
"text/plain": [
"<Figure size 1500x1000 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 2000x400 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Чтение данных из файла\n",
"data = pd.read_csv('result.dat', sep='\\s+', header=None)\n",
"\n",
"# Создание подграфиков\n",
"fig, axes = plt.subplots(2, 3, figsize=(15, 10))\n",
"fig.suptitle('Графики данных из test.csv', fontsize=16)\n",
"\n",
"# График 0-1 значений\n",
"axes[0, 0].plot(data[0], data[1])\n",
"axes[0, 0].set_xlabel('Time')\n",
"axes[0, 0].set_ylabel('1')\n",
"\n",
"# График 0-2 значений\n",
"axes[0, 1].plot(data[0], data[2])\n",
"axes[0, 1].set_xlabel('Time')\n",
"axes[0, 1].set_ylabel('2')\n",
"\n",
"# График 0-3 значений\n",
"axes[0, 2].plot(data[0], data[3])\n",
"axes[0, 2].set_xlabel('Time')\n",
"axes[0, 2].set_ylabel('3')\n",
"\n",
"# График 0-4 значений\n",
"axes[1, 0].plot(data[0], data[4])\n",
"axes[1, 0].set_xlabel('Time')\n",
"axes[1, 0].set_ylabel('4')\n",
"\n",
"# График 0-5 значений\n",
"axes[1, 1].plot(data[0], data[5])\n",
"axes[1, 1].set_xlabel('Time')\n",
"axes[1, 1].set_ylabel('5')\n",
"\n",
"# Скрываем последний пустой подграфик\n",
"axes[1, 2].set_visible(False)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"# Альтернативный вариант: отдельные графики\n",
"fig2, axes2 = plt.subplots(1, 5, figsize=(20, 4))\n",
"\n",
"columns = [1, 2, 3, 4, 5]\n",
"titles = ['1', '2', '3', '4', '5']\n",
"\n",
"for i, (col, title) in enumerate(zip(columns, titles)):\n",
" axes2[i].plot(data[0], data[col])\n",
" axes2[i].set_xlabel('Time')\n",
" axes2[i].set_ylabel(title)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}