最小二乘法曲线拟合(源代码)

本文介绍如何利用最小二乘法对给定数据进行曲线拟合,通过高斯消元法求解参数,实现高效的数据匹配。示例中匹配函数为 y = a0 + a1 * x,并提供了程序执行结果。
摘要由CSDN通过智能技术生成

在已知曲线函数的情况下,对已知数据使用最小二乘法进行参数求解,从而实现曲线拟合的方法最为简便高效。

数据如下,匹配函数为 y = a0+a1*x .

0 1 2 3 4 5
x 1.5 2.5 3.5 4.5 5.5
y 4 6 8 10 12


高斯消元法的声明文件头

#ifndef GAUSSEQUATION_H
#define GAUSSEQUATION_H
#include <vector>

class GaussEquation
{
    public:
        GaussEquation();
        GaussEquation(int M,double *matrix,double *b);
        virtual ~GaussEquation();
        bool Resolve(std::vector<double>& xValue);
    protected:

    private:
        double *m_matrixA;
        int m_DIM;
        double *m_bVal;
        int SelectPivotalElement(int col); //find the row number of max value in column i;
        bool IsPrecisionZero(double aij);
        void SimplePivotalRow(int i,int j);
        void SwapRow(int i,int j);
        void RowElimination(int i,int j,int k);
};

#endif // GUASSEQUATION_H


高斯消元法的类定义源文件

#include "GaussEquation.h"
#include <cassert>
#include <cmath>
GaussEquation::GaussEquation()
{
    //ctor
}

GaussEquation::~GaussEquation()
{
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方便大家使用的最小二乘法曲线拟合的Matlab程序-最小二乘法曲线拟合程序.rar 非常方便用户使用,直接按提示操作即可;这里我演示一个例子: 请以向量的形式输入x,y. x=[1,2,3,4] y=[3,4,5,6] 通过下面的交互式图形,你可以事先估计一下你要拟合的多项式的阶数,方便下面的计算. polytool()是交互式函数,在图形上方[Degree]框中输入阶数,右击左下角的[Export]输出图形 回车打开polytool交互式界面 回车继续进行拟合     输入多项式拟合的阶数   m = 4 Warning: Polynomial is not unique; degree >= number of data points. > In polyfit at 72   In zxecf at 64       输出多项式的各项系数          a = 0.0200000000000001          a = -0.2000000000000008          a = 0.7000000000000022          a = 0.0000000000000000          a = 2.4799999999999973       输出多项式的有关信息 S         R: [4x5 double]        df: 0     normr: 2.3915e-015 Warning: Zero degrees of freedom implies infinite error bounds. > In polyval at 104   In polyconf at 92   In zxecf at 69          观测数据     拟合数据        x         y       yh     1.0000    3.0000    3.0000     2.0000    4.0000    4.0000      3     5     5     4.0000    6.0000    6.0000       剩余平方和            Q = 0.000000         标准误差        Sigma = 0.000000         相关指数           RR = 1.000000 请输入你所需要拟合的数据点,若没有请按回车键结束程序.     输入插值点             x0 = 3     输出插值点拟合函数值   y0 = 5.0000 >> 结果: untitled.fig Figure88.jpg 最小二乘法曲线拟合的程序 untitled2.fig Figure89.jpg 最小二乘法曲线拟合的程序
下面是一段使用最小二乘法进行曲线拟合的C语言代码: ```c #include <stdio.h> #include <math.h> #define MAX_POINTS 100 // 最大数据点数 // 数据点结构体 typedef struct { double x, y; } Point; // 求和函数 double sum(double a[], int n) { double s = 0; for (int i = 0; i < n; i++) { s += a[i]; } return s; } // 求平均值函数 double mean(double a[], int n) { return sum(a, n) / n; } // 求方差函数 double variance(double a[], int n) { double m = mean(a, n); double s = 0; for (int i = 0; i < n; i++) { s += (a[i] - m) * (a[i] - m); } return s / n; } // 求协方差函数 double covariance(Point data[], int n) { double mx = mean(data->x, n); double my = mean(data->y, n); double s = 0; for (int i = 0; i < n; i++) { s += (data[i].x - mx) * (data[i].y - my); } return s / n; } // 拟合函数,返回拟合的二次函数系数 void quadratic_fit(Point data[], int n, double *a, double *b, double *c) { double x[MAX_POINTS], y[MAX_POINTS]; for (int i = 0; i < n; i++) { x[i] = data[i].x; y[i] = data[i].y; } double sx = sum(x, n); double sy = sum(y, n); double sxx = sum(x * x, n); double sxy = covariance(data, n); double sxxx = sum(x * x * x, n); double sxxy = sum(x * x * y, n); double sxxxx = sum(x * x * x * x, n); double a1 = (n * sxy - sx * sy) / (n * sxx - sx * sx); double a2 = (sy - a1 * sx) / n; double a3 = (n * sxxy - sxxx * sy) / (n * sxxxx - sxxx * sx); double a4 = (sy - a3 * sx * sx) / n; *a = a1; *b = a2; *c = a3; } int main() { Point data[MAX_POINTS]; int n; double a, b, c; printf("请输入数据点数量:"); scanf("%d", &n); printf("请输入数据点:\n"); for (int i = 0; i < n; i++) { scanf("%lf%lf", &data[i].x, &data[i].y); } quadratic_fit(data, n, &a, &b, &c); printf("拟合的二次函数为:y = %.2fx^2 + %.2fx + %.2f\n", a, b, c); return 0; } ``` 使用最小二乘法进行曲线拟合有很多种方法,这里演示的是拟合二次函数的方法。在主函数中,首先输入数据点的数量和坐标,然后调用`quadratic_fit`函数进行拟合,最后输出拟合的二次函数系数。`quadratic_fit`函数中,先计算出各个统计量,然后根据公式计算出系数,并将其保存到指针参数中。注意,这里使用了变长数组和指针参数,需要编译器支持C99标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值