Archived
Compare commits
2
Commits
2951d247ac
...
315a1f84e9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
315a1f84e9 | ||
|
|
3625d35398 |
No files matched your search
+3
-1
@@ -360,4 +360,6 @@ MigrationBackup/
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
FodyWeavers.xsd
|
||||
|
||||
test*.cpp
|
||||
@@ -102,6 +102,7 @@
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>include/</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
@@ -116,20 +117,22 @@
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>include/</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Solver.hpp" />
|
||||
<ClInclude Include="include\Header.hpp" />
|
||||
<ClInclude Include="include\Params.hpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\main.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -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>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp">
|
||||
<Filter>Исходные файлы</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Solver.hpp">
|
||||
<ClInclude Include="include\Header.hpp">
|
||||
<Filter>Файлы заголовков</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="include\Params.hpp">
|
||||
<Filter>Файлы заголовков</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\main.cpp">
|
||||
<Filter>Исходные файлы</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,2 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
@@ -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";
|
||||
@@ -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 // Ìèíèìàëüíûé øàã ïî âðåìåíè
|
||||
@@ -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
@@ -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
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 75,
|
||||
"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\\3739615411.py:5: SyntaxWarning: invalid escape sequence '\\s'\n",
|
||||
" data = pd.read_csv('result.dat', sep='\\s+', header=None)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc8AAAPZCAYAAADHsdIGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOx9eZgcZbX+W90z0zOTZJKQPRBIQCBhh7AYFoELAioqLogIsoiIkKBe3IjXH4sLQS+KGwpyNUGRC+oFF2QRgYBsYV8CBAiE7AlJSDLJZKanu6t+f3RXdfWsVd93TtXJzHmfZx7ITHfPma+qvuU973mP43meB4VCoVAoFAqFQqFQKBQKhUKhUCgUATJpB6BQKBQKhUKhUCgUCoVCoVAoFAqFNCh5rlAoFAqFQqFQKBQKhUKhUCgUCkUXKHmuUCgUCoVCoVAoFAqFQqFQKBQKRRcoea5QKBQKhUKhUCgUCoVCoVAoFApFFyh5rlAoFAqFQqFQKBQKhUKhUCgUCkUXKHmuUCgUCoVCoVAoFAqFQqFQKBQKRRcoea5QKBQKhUKhUCgUCoVCoVAoFApFFyh5rlAoFAqFQqFQKBQKhUKhUCgUCkUXKHmuUCgUCoVCoVAoFAqFQqFQKBQKRRcoea5QKBQKhULRBZMnT4bjOP1+zZ8/P+1Qu2H+/PlwHAfHHHNM2qEoFAqFQqFQKBQKxXaNurQDUCgUCoVCoZCKI444Au95z3t6/fn48eMTjEahUPQHx3EAAJ7naRwKhUKhUCgUCmsoea5QKBQKhULRCz7/+c/jnHPOSTsMhUKhUCgUCoVCoVCkALVtUSgUCoVCoVAoFAqFQqFQKBQKhaILlDxXKBQKhUKhIMAVV1wBx3FwxRVXYOnSpTjrrLMwYcIENDY2Yo899sAVV1yB9vb2bu8rFAq4+eabccYZZ2Dq1KloaWlBU1MT9txzT3zpS1/CqlWrev2dL7/8Mk466SQMGTIEEydOxJVXXolSqRT8fOHChTjmmGPQ3NyMSZMm4fLLL0dnZ2e3zznnnHPgOA7mzZvX7WevvfYacrlcjz7qffmrv/DCCxg9ejTq6urwhz/8oeZnvqf822+/3e19c+fODTzlr7jiil7/9r5g4lX/5JNP4hvf+AYOPfRQjB8/Hg0NDRg3bhw+/OEP41//+lePv2fevHlwHKfP6oTe/ta+xqCvz47yO8M45phjuv3Nf/7zn+E4DsaMGYMVK1Z0e8+9996LbDaL4cOH44033oj0e8L3f1esX78eo0aNguM4mDx5cs3PFi9ejNNPPx377LMPdthhBzQ0NGDHHXfEcccdh1tuuSWy7Yn/+310veZdx/n111/HBRdcgN122w2NjY0YPnw43ve+9+Hmm2/u8fM3b96Mb3/729h3330xZMgQ5HI5TJw4EUcccQQuu+wyFAoFozj6wuuvv46LLroIe+65J5qbm9HS0oK99toLF110ERYuXFjz2meeeQannXYadtppJzQ0NKClpQW77rorPvGJT+Cvf/1r8LrTTz8djuPg6quv7vX33nnnnXAcBwceeGDkWBUKhUKhUCgGKtS2RaFQKBQKhYIQS5YswfTp01FXV4f3ve99aG9vx4MPPogrr7wS//rXv/Cvf/0LjY2NwevXrl2Lz372sxg+fDimTZuG/fbbD21tbXj++efx85//HLfeeisee+yxbt7rL7/8Mo444ghs3rwZ++67L6ZOnYqf/vSnuO+++wAAa9aswbHHHovddtsNJ510Eu6//3585zvfwUsvvYTbb7898t8za9asHgn3vvDCCy/guOOOw6ZNm/C73/0On/nMZyK9b+PGjfjmN78Z63f1hbPPPrvm3/fccw/Wrl3b42u/9a1v4cEHH8Tee++N6dOnY8iQIXjzzTdx55134s4778RPfvITfPnLXyaLLU188pOfxMUXX4yf//znOP300/Hggw+irq58LFi5ciU++9nPwnVd3Hjjjdh9992tf9+ll16Kd999t8efvf3227jzzjux3377YY899kBjYyOWLVuGhx56CA888AAefvhhXH/99f3+jgMOOABnn302brrpJgDdr/3QoUOD///Tn/6Es846Cx0dHZg6dSo++MEPYvPmzViwYAE++9nP4oEHHsBvf/vb4PXbtm3DkUceiYULF2LMmDE47rjjMGTIEKxZswaLFi3CY489hksuuQQjRoyIFUdfuOWWW/C5z30O+XweO++8Mz74wQ/CdV289dZbuP766zF27Fjss88+AID7778fH/jAB1AoFLD//vtjxowZKJVKWLlyJf7xj3+gVCrhox/9KADg3HPPxa233oqbbroJl156aY+/e+7cuQCAz33uc5FiVSgUCoVCoRjQ8BQKhUKhUCgUNdhll108AN7cuXMjv+fyyy/3AHgAvI9+9KPetm3bgp8tX77c22OPPTwA3qWXXlrzvtbWVu+vf/2rl8/na77f2dnpzZ492wPgffCDH+z2+4488kgPgPf1r389+N6KFSu83XffPYhjzpw5wc9WrlzpTZkyxQPg3XLLLTWfdfbZZ/f49952220eAG/nnXf2AHhHH310zc8ffPDBbt9//vnnvVGjRnnZbLbb7/Hhj++SJUtqvn/hhRfW/L7LL7+8x/f3hVKpFPz9XXH00Ud7ALwHH3yw28/uuusub9WqVd2+/9hjj3ktLS1efX29t2LFipqfzZ071wPgnX322b3G09vf2tv3+/vsKL8zjN7+5nw+7x166KEeAO+b3/ym53meVygUgvtq5syZkT7fh3//d71mjz/+uOc4TnBNd9lll5qfd3Z2eqVSqdvnvfDCC159fb2XyWS8zZs3R46jt2vv48UXX/RyuZzX2Njo/d///V/Nz95++21v33339QB4N910U/D9m266yQPgfeADH/A6Oztr3lMqlbz58+d3e377i6MvPP300159fb3nOI73s5/9rNv4vP32297TTz8d/PvYY4/1AHg333xzt8/atGmT9/jjj9fE61+L8Pd9rFu3zquvr/caGhq89evXG8WvUCgUCoVCMZCgti0KhUKhUCgUhGhqasL111+Ppqam4Hs77bQTfvSjHwEAfvnLX6KjoyP42bBhw/CRj3wEDQ0NNZ9TX1+Pq666ChMnTsQ999yDLVu2BD977bXX8Mgjj2DkyJH43ve+F3x/xx13xE9+8hMAwCGHHFKjLPVtXQDghhtu6Pfv2Lp1Ky655BIMGTKk5nf0hbDi/Oabb8bpp58e6X1A2XbihhtuwIEHHoizzjor8vu6wh9bX0kdFR/4wAcwYcKEbt+fMWMGZs6ciUKhUGN/sb2joaEBt912G0aOHIkf/vCHuOuuu/Bf//VfeOSRRzB9+vTgfrWB67qYOXMmHMfp9fPq6+uRyXQ/ktTX1wf/n81mrWPx8f3vfx/5fB7f+9738PGPf7zmZ7vssgt+85vfAAB+9rOfBd/3qxXe//7318QFAJlMBkcffXS359cG3/ve91AoFDBr1ixcfPHF3cZnl112wfTp07vF98EPfrDbZw0fPhzvfe97a+L11fC+wjyMP/zhDygUCvjIRz6CUaNGkfw9CoVCoVAoFNsz1LZFoVAoFAqFghAnnHACxo8f3+37J598MkaNGoUNGzbg2WefxeGHH17z8xdeeAH3338/lixZgra2NriuCwAoFotwXReLFy8OPIifeOIJAMChhx7ajbRrbm6u+W8YRx99NICyv7fruj2Slj6uvPJKrFy5EnPmzMGkSZP6/bt94nzDhg249tpr8elPf7rf9/hwXRcXXXQRPM/Dddddh3vvvTfye7uira0NQM9/f3/YsGED/vGPf2DhwoXYuHFj4GPt+36/9tprxnFJxOTJkzFv3jyccsopOP3007FlyxYMHz4cf/zjH5HL5aw//1e/+hWeffZZXHDBBTj44IP7fO0LL7yAa6+9FqVSCStWrMCjjz6KQqGA2bNnY8iQIdaxAOX77O677wYAnHbaaT2+5uCDD8bQoUPx3HPPoaOjA42NjTjkkEMAAD/84Q8xatQonHzyydhhhx1IYuqKUqkUWC994QtfiPSeQw89FK+88grOOOMMfOtb38J73/vePpNH55xzDr73ve/htttuw09+8pOaRJ9atigUCoVCoVDUQslzhUKhUCgUCkJMmTKl159NnjwZGzZsqGnS2NbWhs9+9rO44447+vzc1tbW4P9Xr14NABg3blys2HxSv729HRs3buxVWfrKK6/gJz/5Cfbcc09ccskleOyxx/r83KVLlwbEOQDcdtttmDVrVmT19//8z//gySefxLnnnosZM2ZYkecrV64EgNiq2RtvvBH/+Z//GZDvPSF8DcK46aabAo/ruOjrfukL4d/pOA6GDRuGqVOn4tRTT8WsWbNqfPX7wkc+8hF8/vOfx4033ggA+PWvf41dd93VKKYw3nnnHXz729/G6NGjcdVVV/U6dj6WL19eM4ZDhw7FT3/6U1x44YXWsfjYsGFDEEeUhNCGDRuw44474phjjsE3v/lN/Pd//zfOPvtsOI6D3XffHUcccQQ++tGP4sMf/nCfiai4Mfr34J577hnpPXPmzMGLL76Iu+++G3fffTeamppw0EEH4ZhjjsEZZ5yBadOm1bx+1113xdFHH4358+fjjjvuCHoSPPfcc3jhhRcwceJEnHDCCSR/j0KhUCgUCsX2DiXPFQqFQqFQKBKG53nB/8+ePRt33HEHpk6diquvvhqHHHIIRo8eHSjKDz/8cDz++OM17wn/P0UMXTFz5kwUi0Vcd911kewo3n77bWSzWfz+97/HH/7wB9xzzz248sor8d3vfrff927YsAHf+ta3MHLkSPzgBz+I9Tf0hMWLFwOIR0o/88wzuOCCC5DNZvGDH/wAH/7wh7HzzjujubkZjuPg17/+NS644IJex2y33XbDkUce2ePP/vznP/dJyH/iE5/osYnk4sWL8eijj/b6vvDvLJVKWL58OR555BE8+eSTuOeLine 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
|
||||
}
|
||||
Reference in new issue
Block a user