最小二乘法曲线拟合三次多项式c++
时间: 2024-06-04 12:04:35 浏览: 297
最小二乘法是一种数学优化方法,它通过最小化误差平方和来寻找一组数据的最佳拟合曲线。在三次多项式拟合中,我们可以使用最小二乘法来确定三次多项式的系数,使得该多项式与一组给定数据的误差平方和最小。在C++中,可以使用Eigen库或者GSL库等进行最小二乘法曲线拟合,具体实现方式可以参考相关文档或者API文档。
相关问题
输入九组数据,使用最小二乘法求二次多项式、三次多项式拟合曲线c++代码
以下是使用最小二乘法求二次多项式和三次多项式拟合曲线的C++代码示例:
#include <iostream>
#include <cmath>
using namespace std;
const int N = 9; // 数据组数
double x[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 自变量
double y[N] = {1, 4, 9, 16, 25, 36, 49, 64, 81}; // 因变量
// 求二次多项式系数
void quadratic_fit(double &a, double &b, double &c)
{
double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0, sum_y = 0, sum_xy = 0, sum_x2y = 0;
for (int i = 0; i < N; i++)
{
double xi = x[i], yi = y[i];
sum_x += xi;
sum_x2 += xi * xi;
sum_x3 += xi * xi * xi;
sum_x4 += xi * xi * xi * xi;
sum_y += yi;
sum_xy += xi * yi;
sum_x2y += xi * xi * yi;
}
double D = N * sum_x2 * sum_x4 + 2 * sum_x * sum_x2 * sum_x3 - N * sum_x3 * sum_x3 - sum_x * sum_x4 - sum_x2 * sum_x2;
double D1 = sum_y * sum_x2 * sum_x4 + sum_x * sum_x2y * sum_x4 + sum_x2 * sum_xy * sum_x3 - sum_x3 * sum_x2y - sum_x2 * sum_x2 * sum_y - sum_x * sum_xy * sum_x2;
double D2 = N * sum_x2 * sum_x2y + sum_y * sum_x3 * sum_x3 + sum_x * sum_x3 * sum_xy - N * sum_x * sum_x2y - sum_x2 * sum_xy * sum_x3 - sum_x3 * sum_x3 * sum_y;
a = D1 / D;
b = D2 / D;
c = (sum_y - a * sum_x2 - b * sum_x3) / N;
}
// 求三次多项式系数
void cubic_fit(double &a, double &b, double &c, double &d)
{
double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0, sum_x5 = 0, sum_x6 = 0, sum_y = 0, sum_xy = 0, sum_x2y = 0, sum_x3y = 0;
for (int i = 0; i < N; i++)
{
double xi = x[i], yi = y[i];
sum_x += xi;
sum_x2 += xi * xi;
sum_x3 += xi * xi * xi;
sum_x4 += xi * xi * xi * xi;
sum_x5 += xi * xi * xi * xi * xi;
sum_x6 += xi * xi * xi * xi * xi * xi;
sum_y += yi;
sum_xy += xi * yi;
sum_x2y += xi * xi * yi;
sum_x3y += xi * xi * xi * yi;
}
double M[4][4] = { {N, sum_x, sum_x2, sum_x3},
{sum_x, sum_x2, sum_x3, sum_x4},
{sum_x2, sum_x3, sum_x4, sum_x5},
{sum_x3, sum_x4, sum_x5, sum_x6} };
double V[4] = {sum_y, sum_xy, sum_x2y, sum_x3y};
for (int k = 0; k < 3; k++)
{
for (int i = k + 1; i < 4; i++)
{
double c = M[i][k] / M[k][k];
for (int j = k; j < 4; j++)
M[i][j] -= c * M[k][j];
V[i] -= c * V[k];
}
}
d = V[3] / M[3][3];
c = (V[2] - M[2][3] * d) / M[2][2];
b = (V[1] - M[1][2] * c - M[1][3] * d) / M[1][1];
a = (V[0] - M[0][1] * b - M[0][2] * c - M[0][3] * d) / M[0][0];
}
int main()
{
double a, b, c, d;
quadratic_fit(a, b, c);
cout << "二次多项式: y = " << a << "x^2 + " << b << "x + " << c << endl;
cubic_fit(a, b, c, d);
cout << "三次多项式: y = " << a << "x^3 + " << b << "x^2 + " << c << "x + " << d << endl;
return 0;
}
其中,quadratic_fit
函数用于求解二次多项式系数,cubic_fit
函数用于求解三次多项式系数。在main
函数中调用这两个函数,并输出结果。
使用最小二乘法求一组数据的二次多项式、三次多项式拟合曲线c++代码
好的,以下是C++的代码示例,用于使用最小二乘法进行二次多项式和三次多项式的拟合。
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 最小二乘法对一组数据进行二次多项式拟合
void quadraticFit(const vector<double>& x, const vector<double>& y, double& a, double& b, double& c) {
int n = x.size();
double xSum = 0, ySum = 0, xySum = 0, x2Sum = 0, x3Sum = 0, x4Sum = 0, x2ySum = 0;
for (int i = 0; i < n; i++) {
xSum += x[i];
ySum += y[i];
xySum += x[i] * y[i];
x2Sum += x[i] * x[i];
x3Sum += x[i] * x[i] * x[i];
x4Sum += x[i] * x[i] * x[i] * x[i];
x2ySum += x[i] * x[i] * y[i];
}
double D = n * x2Sum * x4Sum + 2 * xSum * x3Sum * x2Sum - x2Sum * x2Sum * x2Sum - xSum * xSum * x4Sum - n * x3Sum * x3Sum;
a = (x2Sum * x2ySum + xSum * x3Sum * ySum + n * x2Sum * xySum - x2Sum * ySum * xSum - x3Sum * xySum - n * x2ySum * xSum) / D;
b = (n * x2Sum * xySum + x2Sum * x3Sum * ySum + xSum * x2ySum * x2Sum - x2Sum * ySum * x2Sum - x3Sum * xySum - x2ySum * xSum * xSum) / D;
c = (x4Sum * x3Sum * ySum + x2Sum * x2Sum * xySum + x2ySum * x2Sum * xSum - x2Sum * x2Sum * x2ySum - x3Sum * x2ySum * xSum - x4Sum * x2Sum * xySum) / D;
}
// 最小二乘法对一组数据进行三次多项式拟合
void cubicFit(const vector<double>& x, const vector<double>& y, double& a, double& b, double& c, double& d) {
int n = x.size();
double xSum = 0, ySum = 0, xySum = 0, x2Sum = 0, x3Sum = 0, x4Sum = 0, x5Sum = 0, x6Sum = 0, x2ySum = 0, x3ySum = 0;
for (int i = 0; i < n; i++) {
xSum += x[i];
ySum += y[i];
xySum += x[i] * y[i];
x2Sum += x[i] * x[i];
x3Sum += x[i] * x[i] * x[i];
x4Sum += x[i] * x[i] * x[i] * x[i];
x5Sum += x[i] * x[i] * x[i] * x[i] * x[i];
x6Sum += x[i] * x[i] * x[i] * x[i] * x[i] * x[i];
x2ySum += x[i] * x[i] * y[i];
x3ySum += x[i] * x[i] * x[i] * y[i];
}
double D = n * x2Sum * x4Sum * x6Sum + 2 * xSum * x3Sum * x2Sum * x5Sum + 2 * xSum * x4Sum * x3Sum * x4Sum
- x2Sum * x2Sum * x2Sum * x6Sum - x3Sum * x3Sum * x4Sum * x4Sum - x4Sum * x2Sum * x5Sum * x4Sum
- n * x3Sum * x3Sum * x5Sum * x2Sum - n * x2Sum * x4Sum * x5Sum * x3Sum - n * x2Sum * x3Sum * x6Sum * x3Sum;
a = (x2Sum * x3ySum * x4Sum + x2Sum * x2ySum * x5Sum + x3Sum * x2ySum * x4Sum + x5Sum * x2ySum * x2Sum
- x2Sum * x2Sum * x3ySum - x3Sum * x2ySum * x2Sum - x4Sum * x2ySum * xSum - x5Sum * x3ySum * xSum
- x2Sum * x4Sum * x2ySum - x3Sum * x5Sum * x2ySum) / D;
b = (n * x2Sum * x3ySum * x5Sum + x2Sum * x4Sum * x4Sum * ySum + x3Sum * x2ySum * x5Sum + x4Sum * x3ySum * x4Sum
+ x5Sum * x2ySum * x3Sum - x2Sum * x2Sum * x4Sum * ySum - x3Sum * x3Sum * x5Sum * ySum - x4Sum * x2Sum * x2ySum * xSum
- x5Sum * x3ySum * xSum * xSum - x2Sum * x4Sum * x3Sum * ySum - x3Sum * x4Sum * x2ySum * xSum) / D;
c = (n * x2Sum * x4Sum * ySum + x3Sum * x3ySum * x5Sum + x4Sum * x2ySum * x4Sum + x6Sum * x2ySum * x2Sum
- x2Sum * x2Sum * x5Sum * ySum - x3Sum * x4Sum * x5Sum * ySum - x4Sum * x3ySum * x2Sum * xSum
- x5Sum * x4Sum * x2ySum * xSum - x2Sum * x6Sum * x2ySum - x3Sum * x5Sum * x3ySum) / D;
d = (x4Sum * x3Sum * x2ySum * x5Sum + x2Sum * x4Sum * x3ySum * x4Sum + x2Sum * x5Sum * x3ySum * x3Sum
+ x2Sum * x6Sum * x2ySum * xSum - x2Sum * x2Sum * x6Sum * ySum - x3Sum * x4Sum * x4Sum * ySum
- x4Sum * x3ySum * x3Sum * xSum - x5Sum * x2ySum * x3Sum * xSum + n * x2Sum * x3ySum * x4Sum * x5Sum
+ n * x2Sum * x4Sum * x3Sum * x6Sum + n * x2Sum * x5Sum * x4Sum * x5Sum - x3Sum * x5Sum * x4Sum * ySum
- x2Sum * x4Sum * x2ySum * x3Sum - x2Sum * x3Sum * x5Sum * x2ySum) / D;
}
int main() {
vector<double> x = {1, 2, 3, 4, 5};
vector<double> y = {2.1, 4.3, 6.8, 9.5, 12.3};
// 对数据进行二次多项式拟合
double a, b, c;
quadraticFit(x, y, a, b, c);
cout << "Quadratic fitting equation: y = " << a << "x^2 + " << b << "x + " << c << endl;
double minPointX = -b / (2 * a);
double minPointY = a * minPointX * minPointX + b * minPointX + c;
cout << "The minimum point is at (" << minPointX << ", " << minPointY << ")" << endl;
// 对数据进行三次多项式拟合
double d;
cubicFit(x, y, a, b, c, d);
cout << "Cubic fitting equation: y = " << a << "x^3 + " << b << "x^2 + " << c << "x + " << d << endl;
double minPointX2 = -b / (3 * a);
double minPointY2 = a * minPointX2 * minPointX2 * minPointX2 + b * minPointX2 * minPointX2 + c * minPointX2 + d;
cout << "The minimum point is at (" << minPointX2 << ", " << minPointY2 << ")" << endl;
return 0;
}
这段代码中,quadraticFit
函数用于进行二次多项式拟合,cubicFit
函数用于进行三次多项式拟合。你可以将你的数据传递给这两个函数,并输出拟合的多项式方程和最低点的位置。
阅读全文
相关推荐













