Загрузка данных
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cmath>
#include <utility>
#include <fstream>
#include <QString>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
chartView = new QChartView(this);
ui->gridLayout->addWidget(chartView);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_loadData_clicked()
{
// --- БЛОК 1: Загрузка данных из файла ---
std::fstream file("/home/robot33-10/Documents/Krivoj_Aleksej_433/data/test_data.txt");
float x, y;
data.clear();
while(file >> x >> y) {
data.push_back({x, y});
}
file.close();
ui->label_status->setText("Загружено: " + QString::number(data.size()) + " измерений");
}
void MainWindow::on_pushButton_show_clicked()
{
if (data.empty()) return;
// --- БЛОК 2: Подготовка основного графика и поиск границ ---
QChart *chart = new QChart();
QLineSeries *line_series = new QLineSeries();
line_series->setName("Измерения");
float x_min = 1e18, x_max = -1e18, y_min = 1e18, y_max = -1e18;
for (int i = 0; i < data.size(); i++) {
std::pair<float,float> current = data.at(i);
if(current.first < x_min) x_min = current.first;
if(current.second > y_max) y_max = current.second;
if(current.first > x_max) x_max = current.first;
if(current.second < y_min) y_min = current.second;
line_series->append(current.first, current.second);
}
// --- БЛОК 3: Математические расчеты ---
int n = data.size();
float sum_y = 0;
for (int i = 0; i < n; i++) sum_y += data.at(i).second;
float mean = sum_y / n;
float sum_sq_diff = 0;
for (int i = 0; i < n; i++) sum_sq_diff += std::pow(data.at(i).second - mean, 2);
float std_dev = std::sqrt(sum_sq_diff / (n - 1));
float error = 2.093 * (std_dev / std::sqrt(n));
// Расширяем оси по вертикали для интервалов
if (mean + error > y_max) y_max = mean + error + (error * 0.5);
if (mean - error < y_min) y_min = mean - error - (error * 0.5);
// --- БЛОК 4: Создание линий доверительного интервала ---
QLineSeries *mean_series = new QLineSeries();
mean_series->append(x_min, mean);
mean_series->append(x_max, mean);
QPen meanPen(Qt::red);
meanPen.setWidth(2);
mean_series->setPen(meanPen);
QLineSeries *upper_ci = new QLineSeries();
upper_ci->append(x_min, mean + error);
upper_ci->append(x_max, mean + error);
QPen ciPen(Qt::green);
ciPen.setStyle(Qt::DashLine);
ciPen.setWidth(2);
upper_ci->setPen(ciPen);
QLineSeries *lower_ci = new QLineSeries();
lower_ci->append(x_min, mean - error);
lower_ci->append(x_max, mean - error);
lower_ci->setPen(ciPen);
// --- БЛОК 5: Настройка осей и привязка графиков ---
QValueAxis *axisX = new QValueAxis();
QValueAxis *axisY = new QValueAxis();
axisX->setRange(x_min, x_max);
axisY->setRange(y_min, y_max);
chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignRight);
chart->addSeries(line_series);
line_series->attachAxis(axisX);
line_series->attachAxis(axisY);
if (n > 1) {
chart->addSeries(mean_series);
mean_series->attachAxis(axisX);
mean_series->attachAxis(axisY);
chart->addSeries(upper_ci);
upper_ci->attachAxis(axisX);
upper_ci->attachAxis(axisY);
chart->addSeries(lower_ci);
lower_ci->attachAxis(axisX);
lower_ci->attachAxis(axisY);
}
// --- БЛОК 6: Вывод статистики текстом в интерфейс ---
QString stats_text = QString("Среднее арифметическое (Y): %1\n"
"СКО: %2\n"
"Доверительный интервал (95%): [%3; %4]")
.arg(mean, 0, 'f', 4)
.arg(std_dev, 0, 'f', 4)
.arg(mean - error, 0, 'f', 4)
.arg(mean + error, 0, 'f', 4);
ui->label_stats->setText(stats_text);
chart->setTitle("График распределения");
chartView->setChart(chart);
}