最小二乘法曲线的系数求解过程是解一个正规方程组的解的过程,下图是数值分析课本上,最小二乘法拟合的原理:

课本中的例子如下:

c代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "vector"
using namespace std;

struct point
{
double x;
double y;
};

typedef vector<double> doubleVector;

vector<point> getFileInf(char *File);  //获取文件数据
doubleVector getCoeff(vector<point> sample, int n);   //矩阵方程

void main()
{
int i, n;
char *File = "样本.txt";
vector<point> sample;
doubleVector Coef;

sample = getFileInf(File);

printf("拟合阶数n:");
scanf("%d", &n);

Coef = getCoeff(sample, n);

printf("\n拟合矩阵的系数为:\n");
for(i=0; i<Coef.size(); i++)
printf("a%d = %lf\n", i, Coef[i]);

}

//矩阵方程
doubleVector getCoeff(vector<point> sample, int n)
{
vector<doubleVector> matFunX;  //矩阵方程
vector<doubleVector> matFunY;  //矩阵方程
doubleVector temp;
double sum;
int i, j, k;

//正规方程X
for(i=0; i<=n; i++)
{
temp.clear();
for(j=0; j<=n; j++)
{
sum = 0;
for(k=0; k<sample.size(); k++)
sum += pow(sample[k].x, j+i);
temp.push_back(sum);
}

matFunX.push_back(temp);
}

//正规方程Y
for(i=0; i<=n; i++)
{
temp.clear();
sum = 0;
for(k=0; k<sample.size(); k++)
sum += sample[k].y*pow(sample[k].x, i);
temp.push_back(sum);

matFunY.push_back(temp);
}

//矩阵行列式变换
double num1, num2, ratio;

for(i=0; i<matFunX.size()-1; i++)
{
num1 = matFunX[i][i];
for(j=i+1; j<matFunX.size(); j++)
{
num2 = matFunX[j][i];
ratio = num2/num1;

for(k=0; k<matFunX.size(); k++)
matFunX[j][k] = matFunX[j][k]-matFunX[i][k]*ratio;

matFunY[j][0] = matFunY[j][0]-matFunY[i][0]*ratio;
}

}

//计算拟合曲线的系数
doubleVector coeff(matFunX.size(), 0);
for(i=matFunX.size()-1; i>=0; i--)
{
if(i==matFunX.size()-1)
coeff[i] = matFunY[i][0]/matFunX[i][i];

else
{
for(j=i+1; j<matFunX.size(); j++)
matFunY[i][0] = matFunY[i][0]-coeff[j]*matFunX[i][j];
coeff[i] = matFunY[i][0]/matFunX[i][i];
}
}

return coeff;
}

//获取文件数据
vector<point> getFileInf(char *File)
{
int i=1;
vector<point> dst;

FILE *fp = fopen(File, "r");

if(fp==NULL)
{
printf("Open file error!!!\n");
exit(0);
}

point temp;
double num;

while(fscanf(fp, "%lf", &num)!=EOF)
{
if(i%2==0)
{
temp.y = num;
dst.push_back(temp);
}
else
temp.x = num;
i++;
}

fclose(fp);

return dst;
}

运行结果如下:


最小二乘法曲线拟合+C代码相关推荐

  1. 最小二乘法曲线拟合程序matlab,最小二乘法曲线拟合(代码环境:matlab)

    题目一: 1.用表1-1中的世界人口统计数值估计1980年的人口,求最佳最小二乘法数值估计: 表 1-1: 年 人口 1960 3 039 585 530 1970 3 707 475 887 199 ...

  2. matlab polyfit c语言,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 [复制链接] 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注 ...

  3. c语言平曲线,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注释,数学推导等 ...

  4. 最小二乘法曲线拟合 java_最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用. /** * 函数功能:最小二乘法曲线拟合 * @param x 实型一维数组,长度为 ...

  5. 多项式最小二乘法曲线拟合Python程序

    #多项式最小二乘法曲线拟合 from numpy import * from numpy.linalg import * X = [1, 3, 4, 5, 6, 7, 8, 9, 10] Y = [2 ...

  6. 算法#03--详解最小二乘法原理和代码

    最小二乘法原理 最小二乘法的目标:求误差的最小平方和,对应有两种:线性和非线性.线性最小二乘的解是closed-form(如下文),而非线性最小二乘没有closed-form,通常用迭代法求解(如高斯 ...

  7. 使用Python最小二乘法拟合曲线的代码实现

    一.背景描述 在一个普通的摸鱼早晨,群里居然出现了一个不合时宜颇为突兀的正经问题,原来是一个博士同学需要対实验数据进行曲线拟合并且批量计算出多项式方程 一般来说,这种问题对于经常做实验的同学来说并不陌 ...

  8. Python04 直线拟合 多项式曲线拟合 指数曲线拟合(附代码)

    1. 实验结果 (1)在定义的类中设置已知的函数值列表为: (2)在 test.py 中选择直线拟合: 输出:拟合的直线函数及图像: (3)选择多项式曲线拟合: 输入:多项式拟合函数的次数: 输出:拟 ...

  9. 几种最小二乘法及python代码:ELS、TLS、RLS

    1.ARMAX模型 下面各章节,我就是使用上面公式的符号,其中y是输出,u是输入,e是噪声.有m个输出y,r个输入u. 进一步精简为: Y=Pθ+E 其中:Y为要预测的部分,P为已知数据(包括y的t- ...

  10. 最小二乘法曲线拟合 C语言实现

    简单思路如下: 1,采用目标函数对多项式系数求偏导,得到最优值条件,组成一个方程组: 2,方程组的解法采用行列式变换(两次变换:普通行列式--三角行列式--对角行列式--求解),行列式的求解算法上优化 ...

最新文章

  1. java设计模式---合成模式3
  2. 阿里 双11 同款流控降级组件 Sentinel Go 正式 GA,助力云原生服务稳稳稳
  3. if-else运用及技巧(C# 参考)
  4. nginx file not found 错误处理小记
  5. 高级SmartGWT教程,第1部分
  6. android获取当前位置经纬度,Android中通过GPS或NetWork获取当前位置的经纬度
  7. 输入关键字生成对联_教你一秒变大师,亲手提笔写对联
  8. java4android代码_Android逆向-java代码基础(4)
  9. win8卸载mysql数据库,彻底卸载win8自带的metro应用的方法
  10. TOP 1%的软件工程师和其他 99%有什么不同?
  11. 解决local class incompatible stream classdesc serialVersionUID = 7170114032608506842, local class seri
  12. Unity贴图ASTC压缩格式
  13. Craw the picture of the specific handle
  14. Thanos Query Frontend
  15. windows server 2016 安装openssh
  16. 腾讯云工商注册服务重磅上线!全场低至10元起
  17. TCP和UDP的区别有哪些
  18. Python 的 AIML
  19. 通过gitlab的webhook进行项目的自动部署所遇问题总结
  20. 网络七层协议具体是什么?

热门文章

  1. FPS之游戏透视原理(一)
  2. 思科ccnp认证网络工程师关于NAT64协议概述一定要看
  3. dts : rx8025t与lm75bd
  4. Windows 强制删除文件及文件夹命令
  5. 3d3s9.0硬件复制狗
  6. c语言作业做出金山打字功能,C语言制作简易金山打字通功能的代码
  7. cruzer php sandisk 闪迪u盘量产工具_闪迪u3量产工具下载|
  8. tablepc是什么平板电脑_平板电脑 Tablet PC
  9. 深受企业青睐的华为云
  10. 什么是信道编码?信道编码比较