Вычисляю параметры полиномиальной аппроксимации методом МНК, вот формулы:(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
Разобрался, считается все верно, ошибка в формуле, нужно поменять числитель и знаменатель в b1.