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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Неверное вычисление в double.  (Прочитано 2092 раз)
SadZhaba
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« : Апрель 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
« Последнее редактирование: Апрель 23, 2021, 16:39 от SadZhaba » Записан
SadZhaba
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« Ответ #1 : Апрель 23, 2021, 17:13 »

Разобрался, считается все верно, ошибка в формуле, нужно поменять числитель и знаменатель в b1.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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