Russian Qt Forum
Ноябрь 22, 2024, 21:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Неверное вычисление в double. : Апрель 23, 2021, 17:13
Разобрался, считается все верно, ошибка в формуле, нужно поменять числитель и знаменатель в b1.
2  Qt / Вопросы новичков / Неверное вычисление в double. : Апрель 23, 2021, 16:35
Вычисляю параметры полиномиальной аппроксимации методом МНК, вот формулы:
Вот сам код, ничего сложного, но при выводе b1 считается как 29.75, что довольно странно, хотя в экселе получается 0.04.
Код:
double b1 = sumYT/sumT2;
double b0 = (sumT4*sumY - sumT2*sumYT2) / (50*sumT4 - sumT2*sumT2);
double b2 = (50*sumYT2 - sumT2*sumY)/(50*sumT4 - sumT2*sumT2);
Вот так вычисляю суммы рядов:
Код:
for(int i =0 ;i< 50;++i){
        sumY+=x[i];
        sumT+=i+1;
        sumT2+=(i+1)*(i+1);
        sumT4+=std::pow(y[i], 4.);
        sumYT2+=y[i]*y[i]*x[i];
        sumYT+=x[i]*(i+1);
}
y в формулах это t из изображения, x это y из изображения.
Где x вводится из файла через QDataStream, y просто равен (i+1), так как это просто значения времени(шкала Х). В чем может быть проблема неправильного рассчета? Мне кажется это связано с экспоненциальной формой записи больших сумм.
Вывод qDebug()
sumY  50123.9  sumT  1275  sumT2  42925  sumT4  6.56667e+07  sumYT2  4.2983e+07  sumYT  1.27728e+06
b0  1003.92  b1  29.7562  b2  -0.00167683

Весь исходник кнопки:
Код:
void MainWindow::on_pushButton_2_clicked()
{
    double b1 = sumYT/sumT2;
    double b0 = (sumT4*sumY - sumT2*sumYT2) / (50*sumT4 - sumT2*sumT2);
    double b2 = (50*sumYT2 - sumT2*sumY)/(50*sumT4 - sumT2*sumT2);
    qDebug() << "sumY " << sumY<< " sumT "<<sumT<<" sumT2 " <<sumT2<<" sumT4 "<<sumT4<<" sumYT2 "<<sumYT2<<" sumYT "<<sumYT;
    qDebug() << "b0 "<<b0<<" b1 "<<b1<<" b2 "<<b2;
    QVector<double> approx;
    for(int i =0;i<50;++i){
        approx.push_back(b0 + b1* i + b2*i*i);
    }
    ui->widget->addGraph();
    ui->widget->graph()->setPen(QPen(QColor("#00FF00")));
    ui->widget->graph(isPressed)->addData(y, approx);
    //ui->widget->rescaleAxes();
    ui->widget->replot();
    QString text_b0 = QString::number(b0, 'g', 4);
    QString text_b1 = QString::number(b1, 'g', 4);
    QString text_b2 = QString::number(b2, 'g', 4);
    ui->textBrowser->setText("y^2(t) = " + text_b0 + " + " + text_b1+"*t "+text_b2+"*t^2");
    isPressed++;
}

Данные x:
Код:
999.5
1000.4
1000.7
1001.7
1000.3
1003.7
1005.9
1007.2
1008
1008.5
1010.3
1009.7
1010
1008.3
1007.4
1002.1
1000.7
999
998.3
998.2
998.4
1005.1
1003.5
1001.6
997.4
996.6
1001.6
1003.2
1004.1
1001.7
1001.8
1002.8
1003.6
1004.4
1002.6
1001.1
1004.4
1004.3
1002.4
1001.5
1003
998.3
999
999.2
1001.5
1001.9
1000.1
1000.1
1000
998.8
Страниц: [1]

Страница сгенерирована за 0.06 секунд. Запросов: 24.