使用最小二乘法拟合二次函数
生活随笔
收集整理的這篇文章主要介紹了
使用最小二乘法拟合二次函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用最小二乘法擬合二次函數
原理:
主要二次函數擬合算法,目前項目需要4組x,y擬合二次函數
mainwindow.h
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include "qmath.h" #include <QDebug>#define N 1e-13MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QObject::connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(quadraticcal()));this->setWindowTitle("二次方程擬合");}MainWindow::~MainWindow() {delete ui; }void MainWindow::quadraticcal() {QVector<double> vx,vy;double coefficient[5];vx.push_back(ui->lineEdit->text().toDouble());vx.push_back(ui->lineEdit_2->text().toDouble());vx.push_back(ui->lineEdit_3->text().toDouble());vx.push_back(ui->lineEdit_4->text().toDouble());vy.push_back(ui->lineEdit_6->text().toDouble());vy.push_back(ui->lineEdit_7->text().toDouble());vy.push_back(ui->lineEdit_9->text().toDouble());vy.push_back(ui->lineEdit_8->text().toDouble());EMatrix(vx,vy,4,3,coefficient);QString str_1=QString::number(coefficient[1]);QString str_2=QString::number(coefficient[2]);QString str_3=QString::number(coefficient[3]);ui->lineEdit_10->setText(str_3);ui->lineEdit_11->setText(str_2);ui->lineEdit_12->setText(str_1);}void MainWindow::EMatrix(QVector<double> Vx, QVector<double> Vy, int n, int ex, double coefficient[]) {for (int i=1; i<=ex; i++){for (int j=1; j<=ex; j++){Em[i][j]=RelatePow(Vx,n,i+j-2);}Em[i][ex+1]=RelateMutiXY(Vx,Vy,n,i-1);}Em[1][1]=n;CalEquation(ex,coefficient); } //求解方程 void MainWindow::CalEquation(int exp, double coefficient[]) {for(int k=1;k<exp;k++) //消元{for(int i=k+1;i<exp+1;i++){double p1=0;if(Em[k][k]!=0)p1=Em[i][k]/Em[k][k];for(int j=k;j<exp+2;j++)Em[i][j]=Em[i][j]-Em[k][j]*p1;}}coefficient[exp]=Em[exp][exp+1]/Em[exp][exp];for(int l=exp-1;l>=1;l--) //回代求解coefficient[l]=(Em[l][exp+1]-F(coefficient,l+1,exp))/Em[l][l]; }double MainWindow::RelatePow(QVector<double> Vx, int n, int ex) {double ReSum=0;for (int i=0; i<n; i++){ReSum+=pow(Vx[i],ex);}return ReSum; } //x的ex次方與y的乘積的累加 double MainWindow::RelateMutiXY(QVector<double> Vx, QVector<double> Vy, int n, int ex) {double dReMultiSum=0;for (int i=0; i<n; i++){dReMultiSum+=pow(Vx[i],ex)*Vy[i];}return dReMultiSum; }double MainWindow::F(double c[],int l,int m) {double sum=0;for(int i=l;i<=m;i++)sum+=Em[l-1][i]*c[i];return sum; }結果圖示:
算法借鑒自"采用最小二乘法擬合二次、三次、四次曲線"
總結
以上是生活随笔為你收集整理的使用最小二乘法拟合二次函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言——狐狸和兔子的故事
- 下一篇: 图片转文字