最小二乘法曲线拟合三次多项式c++
时间: 2024-06-04 18:04:35 浏览: 31
最小二乘法是一种数学优化方法,它通过最小化误差平方和来寻找一组数据的最佳拟合曲线。在三次多项式拟合中,我们可以使用最小二乘法来确定三次多项式的系数,使得该多项式与一组给定数据的误差平方和最小。在C++中,可以使用Eigen库或者GSL库等进行最小二乘法曲线拟合,具体实现方式可以参考相关文档或者API文档。
相关问题
输入九组数据,使用最小二乘法求二次多项式、三次多项式拟合曲线c++代码
以下是使用最小二乘法求二次多项式和三次多项式拟合曲线的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++中实现最小二乘法的示例代码:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 定义一个二次多项式的类
class QuadraticPolynomial {
public:
QuadraticPolynomial(double a = 0, double b = 0, double c = 0) : a(a), b(b), c(c) {}
double operator() (double x) const {
return a * x * x + b * x + c;
}
double a, b, c;
};
// 定义一个最小二乘法的函数
QuadraticPolynomial leastSquares(const vector<pair<double, double>>& points) {
double sx = 0, sy = 0, sxx = 0, sxy = 0, n = points.size();
for (const auto& p : points) {
sx += p.first;
sy += p.second;
sxx += p.first * p.first;
sxy += p.first * p.second;
}
double det = n * sxx - sx * sx;
double a = (n * sxy - sx * sy) / det;
double b = (sxx * sy - sx * sxy) / det;
double c = (-a * sx - b * sy) / n;
return QuadraticPolynomial(a, b, c);
}
int main() {
vector<pair<double, double>> points = {{1, 2}, {2, 4}, {3, 5}, {4, 7}};
QuadraticPolynomial f = leastSquares(points);
cout << "f(2.5) = " << f(2.5) << endl;
return 0;
}
```
在这个例子中,我们定义了一个二次多项式类`QuadraticPolynomial`,它包含三个系数`a`、`b`、`c`,可以用来表示二次函数`f(x) = ax^2 + bx + c`。我们还定义了一个最小二乘法函数`leastSquares`,它接受一个点集`points`,返回一个`QuadraticPolynomial`对象,表示对这些点进行拟合的二次函数。最后,在`main`函数中,我们调用`leastSquares`函数,得到拟合函数`f`,并输出`f(2.5)`的值。