Russian Qt Forum

Qt => Вопросы новичков => Тема начата: SadZhaba от Апрель 23, 2021, 16:35



Название: Неверное вычисление в double.
Отправлено: SadZhaba от Апрель 23, 2021, 16:35
Вычисляю параметры полиномиальной аппроксимации методом МНК, вот формулы:(https://sun9-30.userapi.com/impg/quyz418-3fu2O8ypNW0kDGgwst5FdwLataTfxQ/I4-6oA8Q32k.jpg?size=294x284&quality=96&sign=384c99c696588cfb48d28360290f6a45&type=album)
Вот сам код, ничего сложного, но при выводе 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


Название: Re: Неверное вычисление в double.
Отправлено: SadZhaba от Апрель 23, 2021, 17:13
Разобрался, считается все верно, ошибка в формуле, нужно поменять числитель и знаменатель в b1.