Загрузка данных
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cmath>
#include <utility>
#include <fstream>
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()
{
// Открываем файл. Убедись, что путь правильный и файл существует!
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;
// --- 1. ПОДГОТОВКА ГРАФИКА ---
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 = data.at(i);
if(current_data.first < x_min) x_min = current_data.first;
if(current_data.second > y_max) y_max = current_data.second;
if(current_data.first > x_max) x_max = current_data.first;
if(current_data.second < y_min) y_min = current_data.second;
line_series->append(current_data.first, current_data.second);
}
// --- 2. МАТЕМАТИКА ---
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)); // СКО
// Доверительный интервал 95%
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);
// --- 3. ЛИНИИ ИНТЕРВАЛОВ ---
QLineSeries *mean_series = new QLineSeries();
mean_series->setName("Среднее");
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->setName("Верхняя граница (+95%)");
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->setName("Нижняя граница (-95%)");
lower_ci->append(x_min, mean - error);
lower_ci->append(x_max, mean - error);
lower_ci->setPen(ciPen);
// --- 4. ПРИВЯЗКА К ОСЯМ ---
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);
}
chart->setTitle("График распределения");
chartView->setChart(chart);
}