日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用最小二乘法拟合二次函数

發(fā)布時間:2023/12/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用最小二乘法拟合二次函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用最小二乘法擬合二次函數(shù)

原理:

主要二次函數(shù)擬合算法,目前項目需要4組x,y擬合二次函數(shù)
mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void EMatrix(QVector<double> Vx, QVector<double> Vy, int n, int ex, double coefficient[]);void CalEquation(int exp, double coefficient[]);double Em[100][100];double RelatePow(QVector<double> Vx, int n, int ex);double RelateMutiXY(QVector<double> Vx, QVector<double> Vy, int n, int ex);double F(double c[],int l,int m); public slots:void quadraticcal();private:Ui::MainWindow *ui; }; #endif // 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; }

結(jié)果圖示:

算法借鑒自"采用最小二乘法擬合二次、三次、四次曲線"

總結(jié)

以上是生活随笔為你收集整理的使用最小二乘法拟合二次函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。