算法——纯C语言最小二乘法曲线拟合

写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注释,数学推导等时间充裕一点再贴上来

// 最小二乘法拟合.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "stdlib.h"

#include "math.h"

//

#define ParaBuffer(Buffer,Row,Col) (*(Buffer + (Row) * (SizeSrc + 1) + (Col)))

//

/***********************************************************************************

***********************************************************************************/

static int GetXY(const char* FileName, double* X, double* Y, int* Amount)

{

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

if (!File)

return -1;

for (*Amount = 0; !feof(File); X++, Y++, (*Amount)++)

if (2 != fscanf(File, (const char*)"%lf %lf", X, Y))

break;

fclose(File);

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int PrintPara(double* Para, int SizeSrc)

{

int i, j;

for (i = 0; i < SizeSrc; i++)

{

for (j = 0; j <= SizeSrc; j++)

printf("%10.6lf ", ParaBuffer(Para, i, j));

printf("

");

}

printf("

");

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int ParalimitRow(double* Para, int SizeSrc, int Row)

{

int i;

double Max, Min, Temp;

for (Max = abs(ParaBuffer(Para, Row, 0)), Min = Max, i = SizeSrc; i; i--)

{

Temp = abs(ParaBuffer(Para, Row, i));

if (Max < Temp)

Max = Temp;

if (Min > Temp)

Min = Temp;

}

Max = (Max + Min) * 0.000005;

for (i = SizeSrc; i >= 0; i--)

ParaBuffer(Para, Row, i) /= Max;

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int Paralimit(double* Para, int SizeSrc)

{

int i;

for (i = 0; i < SizeSrc; i++)

if (ParalimitRow(Para, SizeSrc, i))

return -1;

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int ParaPreDealA(double* Para, int SizeSrc, int Size)

{

int i, j;

for (Size -= 1, i = 0; i < Size; i++)

{

for (j = 0; j < Size; j++)

ParaBuffer(Para, i, j) = ParaBuffer(Para, i, j) * ParaBuffer(Para, Size, Size) - ParaBuffer(Para, Size, j) * ParaBuffer(Para, i, Size);

ParaBuffer(Para, i, SizeSrc) = ParaBuffer(Para, i, SizeSrc) * ParaBuffer(Para, Size, Size) - ParaBuffer(Para, Size, SizeSrc) * ParaBuffer(Para, i, Size);

ParaBuffer(Para, i, Size) = 0;

ParalimitRow(Para, SizeSrc, i);

}

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int ParaDealA(double* Para, int SizeSrc)

{

int i;

for (i = SizeSrc; i; i--)

if (ParaPreDealA(Para, SizeSrc, i))

return -1;

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int ParaPreDealB(double* Para, int SizeSrc, int OffSet)

{

int i, j;

for (i = OffSet + 1; i < SizeSrc; i++)

{

for (j = OffSet + 1; j <= i; j++)

ParaBuffer(Para, i, j) *= ParaBuffer(Para, OffSet, OffSet);

ParaBuffer(Para, i, SizeSrc) = ParaBuffer(Para, i, SizeSrc) * ParaBuffer(Para, OffSet, OffSet) - ParaBuffer(Para, i, OffSet) * ParaBuffer(Para, OffSet, SizeSrc);

ParaBuffer(Para, i, OffSet) = 0;

ParalimitRow(Para, SizeSrc, i);

}

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int ParaDealB(double* Para, int SizeSrc)

{

int i;

for (i = 0; i < SizeSrc; i++)

if (ParaPreDealB(Para, SizeSrc, i))

return -1;

for (i = 0; i < SizeSrc; i++)

{

if (ParaBuffer(Para, i, i))

{

ParaBuffer(Para, i, SizeSrc) /= ParaBuffer(Para, i, i);

ParaBuffer(Para, i, i) = 1.0;

}

}

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int ParaDeal(double* Para, int SizeSrc)

{

PrintPara(Para, SizeSrc);

Paralimit(Para, SizeSrc);

PrintPara(Para, SizeSrc);

if (ParaDealA(Para, SizeSrc))

return -1;

PrintPara(Para, SizeSrc);

if (ParaDealB(Para, SizeSrc))

return -1;

return 0;

}

/***********************************************************************************

***********************************************************************************/

static int GetParaBuffer(double* Para, const double* X, const double* Y, int Amount, int SizeSrc)

{

int i, j;

for (i = 0; i < SizeSrc; i++)

for (ParaBuffer(Para, 0, i) = 0, j = 0; j < Amount; j++)

ParaBuffer(Para, 0, i) += pow(*(X + j), 2 * (SizeSrc - 1) - i);

for (i = 1; i < SizeSrc; i++)

for (ParaBuffer(Para, i, SizeSrc - 1) = 0, j = 0; j < Amount; j++)

ParaBuffer(Para, i, SizeSrc - 1) += pow(*(X + j), SizeSrc - 1 - i);

for (i = 0; i < SizeSrc; i++)

for (ParaBuffer(Para, i, SizeSrc) = 0, j = 0; j < Amount; j++)

ParaBuffer(Para, i, SizeSrc) += (*(Y + j)) * pow(*(X + j), SizeSrc - 1 - i);

for (i = 1; i < SizeSrc; i++)

for (j = 0; j < SizeSrc - 1; j++)

ParaBuffer(Para, i, j) = ParaBuffer(Para, i - 1, j + 1);

return 0;

}

/***********************************************************************************

***********************************************************************************/

int Cal(const double* BufferX, const double* BufferY, int Amount, int SizeSrc, double* ParaResK)

{

double* ParaK = (double*)malloc(SizeSrc * (SizeSrc + 1) * sizeof(double));

GetParaBuffer(ParaK, BufferX, BufferY, Amount, SizeSrc);

ParaDeal(ParaK, SizeSrc);

for (Amount = 0; Amount < SizeSrc; Amount++, ParaResK++)

*ParaResK = ParaBuffer(ParaK, Amount, SizeSrc);

free(ParaK);

return 0;

}

/***********************************************************************************

***********************************************************************************/

int main(int argc, char* argv[])

{

int Amount;

double BufferX[1024], BufferY[1024], ParaK[6];

if (GetXY((const char*)"test.txt", (double*)BufferX, (double*)BufferY, &Amount))

return 0;

Cal((const double*)BufferX, (const double*)BufferY, Amount, sizeof(ParaK) / sizeof(double), (double*)ParaK);

for (Amount = 0; Amount < sizeof(ParaK) / sizeof(double); Amount++)

printf("ParaK[%d] = %lf!

", Amount, ParaK[Amount]);

return 0;

}

测试test.txt里的内容

0.995119      -7.620000

2.001185      -2.460000

2.999068     108.760000

4.001035     625.020000

4.999859    2170.500000

6.004461    5814.580000

6.999335   13191.840000

7.999433   26622.060000

9.002257   49230.220000

10.003888   85066.500000

11.004076  139226.280000

12.001602  217970.140000

13.003390  328843.860000

14.001623  480798.420000

15.003034  684310.000000

16.002561  951499.980000

17.003010 1296254.940000

18.003897 1734346.660000

19.002563 2283552.120000

20.003530 2963773.500000

matlab拟合m代码:

load test.txt;

x = test(:, 1)';

y = test(:, 2)';

para = polyfit(x, y, 5);

c语言平曲线,算法——纯C语言最小二乘法曲线拟合相关推荐

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

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

  2. c语言算法集,【二级C语言】数据结构算法集---C  语言实现

    蜡烛马区新固动工八拐怪状小城,小城炮兵会晒茶麸领子.冒算心头画行启脾沙拉,壮志骗人淡漠流生宣布木锯南政新车?猛料妙绝长亭浓味寺塔马兜放领理光.普特民师初生情境民寿流传灭绝!勤恳心曲修整拭除转子苛评. ...

  3. c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言

    FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...

  4. c语言数据结构插入算法说明,C语言数据结构插入算法

    C语言数据结构插入算法 C语言数据结构插入算法 C语言数据结构 数据结构学习 ->是二目运算符 p->a 引用了指针p指向的结构体的成员a. 整合 void unionL(List *La ...

  5. 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文

    温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合特定应 ...

  6. a5 1c语言实现,A5算法的C语言实现

    A5算法的C语言,C语言程序,流密码,序列密码 /* * In writing this program, I've had to guess a few pices of information: ...

  7. 卡尔曼滤波算法及c语言代码,卡尔曼滤波算法及C语言代码

    卡尔曼滤波算法及C语言代码 卡尔曼滤波简介及其算法实现代码 卡尔曼滤波算法实现代码(C,C++分别实现) 卡尔曼滤波器简介 近来发现有些问题很多人都很感兴趣.所以在这里希望能尽自己能力跟大家讨论一些力 ...

  8. linux下c语言聊天室程序,纯C语言Socket实现聊天室

    最近在学习嵌入式开发,练习C语言小项目,基本是参考别人的代码,做了些修改实现了聊天室,纯C语言编写. 想直接看源码的跳到最后. 一.练习内容 socket通信流程 管道的使用 epoll的使用 首先要 ...

  9. 卡尔曼滤波算法c语言stm32,卡尔曼滤波算法及C语言实现_源代码

    a往南向北 2019-01-16 20:39:20  11340  收藏 111 分类专栏: C语言嵌入式 文章标签: 卡尔曼滤波 C代码 卡尔曼滤波理论很容易就可以在MATLAB软件环境下实现,但是 ...

最新文章

  1. 权威报告丨2018-2019 新型互联网生态研究报告摘要
  2. 网络爬虫:基于对象持久化实现爬虫现场快速还原
  3. java 目录的遍历与删除
  4. 8个爽滑如丝的Windows小软件,不好用你拿王思葱砸死我
  5. .net framework3.0_
  6. 如何在24行JavaScript中实现Redux
  7. ssh linux 配置文件详解,Linux ssh服务常用配置的详细描述及建议配置
  8. 深度学习(三十四)对抗自编码网络-未完待续
  9. Java中的String的长度限制问题
  10. 综合实践活动信息技术小学版第三册电子课本_摆事实,讲道理!电子商务讲师证报名入口和费用...
  11. 使用pdfbox-2.0.1.jar将pdf转换成图片,并且可自定义图片大小
  12. 课程设计---快递管理系统(boostrap + servlet + jQuery + Redis + MySQL)
  13. shell脚本批量处理ping IP测试
  14. 用Python实现连续图文识别
  15. BeautifulSoup的高级应用 之 find findAll
  16. 锐化pdf文件(图片形式)
  17. 在微信小程序中 使用uView rules 表单校验 validator 不起作用(无效)
  18. 如何提高google pr值
  19. 信息技术课python培训心得
  20. LayUI模板引擎渲染数据

热门文章

  1. 中国电子游戏机发展回顾 游戏机手柄从未被禁止
  2. jquery遍历数组与筛选数组的方法
  3. 网络赚钱 签到就可以赚钱的网赚 持续更新
  4. 如何实现在高清液晶电视上播放PSP 2006(2000)视频
  5. 饿了么多活高可用思想
  6. 免费共享《凤弈》百度云(全1-41集)网盘【全集1080P超清】未删完整资源已更新...
  7. 中国教育公平面临4大挑战 高等教育出现阶层分化
  8. 摩托罗拉v3的java游戏_那里有支持摩托罗拉V3的Java游戏?
  9. css清除浮动无效,CSS清除浮动方法总结
  10. iOS 10解决了用iPhone 6s拍照最烦人的事情