最小二乘法算法C语言,最小二乘法C算法终极整理版本,绝对原创!
前两天发了一个关于最小二乘法C语言算法的帖子(http://www.amobbs.com/thread-5535084-1-1.html),这次重新发一个,但是绝对不是属于重复发帖,如果你对算法感兴趣,这个绝对适合你的口味,这次综合了最小二乘法高阶函数拟合(对之前存在的溢出问题有了比较好的解决办法,没有彻底解决),直线拟合(经过高度优化,初始化代码6行,运算代码7行!),抛物线拟合(经过高度优化,初始化代码12行,运算代码20行!)先上代码,工程在附件里面,后续会有进一步的分析(目前还有一个最小二乘法的算法正在研究,思路跟这个版本相差很大,尚不知道是否能实现)
最
小二
乘法
拟合直线(包含测试函数):
#include "stdafx.h"
#include "process.h"
/*******************************************************************************
阶乘函数宏定义
*******************************************************************************/
#define my_pow2(x) ((x) * (x))
/*******************************************************************************
定义一个2行3列的系数矩阵
*******************************************************************************/
static double Para[2][3] = {0.0};
/*******************************************************************************
系数矩阵的初始化,没有撒谎,真的只有6行 + 一个循环
*******************************************************************************/
static int ParaInit(double* X, double* Y, int Amount)
{
Para[1][1] = Amount;
for ( ; Amount; Amount--, X++, Y++)
{
Para[0][0] += my_pow2(*X);
Para[0][1] += (*X);
Para[0][2] += (*X) * (*Y);
Para[1][2] += (*Y);
}
Para[1][0] = Para[0][1];
return 0;
}
/*******************************************************************************
系数矩阵的运算,没有撒谎,真的只有7行
*******************************************************************************/
static int ParaDeal(void)
{
Para[0][0] -= Para[1][0] * (Para[0][1] / Para[1][1]);
Para[0][2] -= Para[1][2] * (Para[0][1] / Para[1][1]);
Para[0][1] = 0;
Para[1][2] -= Para[0][2] * (Para[1][0] / Para[0][0]);
Para[1][0] = 0;
Para[0][2] /= Para[0][0];
//Para[0][0] = 1.0;
Para[1][2] /= Para[1][1];
//Para[1][1] = 1.0;
return 0;
}
/***********************************************************************************
从txt文件里读取double型的X,Y数据
***********************************************************************************/
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;
}
/*******************************************************************************
*******************************************************************************/
int Test(const char* FileName)
{
int Amount;
double BufferX[1024], BufferY[1024];
if (GetXY(FileName, (double*)BufferX, (double*)BufferY, &Amount))
{
printf("读取数据文件失败!\r\n");
return -1;
}
printf("读取数据文件成功,共有%d个点!\r\n", Amount);
ParaInit((double*)BufferX, (double*)BufferY, Amount);
ParaDeal();
printf("拟合数据成功,拟合直线为:\r\ny = (%lf) * x + (%lf);\r\n", Para[0][2], Para[1][2]);
system("pause");
return 0;
}
int main(int argc, char* argv[])
{
Test((const char*)"test.txt");
return 0;
}
拟合抛物线(包含测试函数):
#include "stdafx.h"
#include "process.h"
/*******************************************************************************
阶乘函数宏定义
*******************************************************************************/
#define my_pow2(x) ((x) * (x))
#define my_pow3(x) ((x) * my_pow2(x))
#define my_pow4(x) (my_pow2(x) * my_pow2(x))
/*******************************************************************************
定义一个2行3列的系数矩阵
*******************************************************************************/
static double Para[3][4] = {0.0};
/*******************************************************************************
系数矩阵的初始化
*******************************************************************************/
static int ParaInit(const double* X, const double* Y, int Amount)
{
Para[2][2] = Amount;
for ( ; Amount; Amount--, X++, Y++)
{
Para[0][0] += my_pow4(*X);
Para[0][1] += my_pow3(*X);
Para[0][2] += my_pow2(*X);
Para[1][2] += (*X);
Para[0][3] += my_pow2(*X) * (*Y);
Para[1][3] += (*X) * (*Y);
Para[2][3] += (*Y);
}
Para[1][0] = Para[0][1];
Para[1][1] = Para[0][2];
Para[2][0] = Para[1][1];
Para[2][1] = Para[1][2];
return 0;
}
/*******************************************************************************
系数矩阵的运算
*******************************************************************************/
static int ParaDeal(void)
{
//用Para[2][2]把Para[0][2]消成0
Para[0][0] -= Para[2][0] * (Para[0][2] / Para[2][2]);
Para[0][1] -= Para[2][1] * (Para[0][2] / Para[2][2]);
Para[0][3] -= Para[2][3] * (Para[0][2] / Para[2][2]);
Para[0][2] = 0;
//用Para[2][2]把Para[1][2] 消成0
Para[1][0] -= Para[2][0] * (Para[1][2] / Para[2][2]);
Para[1][1] -= Para[2][1] * (Para[1][2] / Para[2][2]);
Para[1][3] -= Para[2][3] * (Para[1][2] / Para[2][2]);
Para[1][2] = 0;
//用Para[1][1]把Para[0][1]消成0
Para[0][0] -= Para[1][0] * (Para[0][1] / Para[1][1]);
Para[0][3] -= Para[1][3] * (Para[0][1] / Para[1][1] );
Para[0][1] = 0;
//至此,已经成成为三角矩阵
//用Para[0][0]把Para[1][0]消成0
Para[1][3] -= Para[0][3] * (Para[1][0] / Para[0][0]);
Para[1][0] = 0;
//用Para[0][0]把Para[2][0]消成0
Para[2][3] -= Para[0][3] * (Para[2][0] / Para[0][0]);
Para[2][0] = 0;
//用Para[1][1]把Para[2][1]消成0
Para[2][3] -= Para[1][3] * (Para[2][1] / Para[1][1]);
Para[2][1] = 0;
//至此,已经成成为对角矩阵
//把Para[0][0],Para[1][1],Para[2][2]消成1
Para[0][3] /= Para[0][0];//这个就是最后a的值
//Para[0][0] = 1.0;
Para[1][3] /= Para[1][1]; //这个就是最后b的值
//Para[1][1] = 1.0;
Para[2][3] /= Para[2][2]; //这个就是最后c的值
//Para[2][2] = 1.0;
return 0;
}
/***********************************************************************************
从txt文件里读取double型的X,Y数据
***********************************************************************************/
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;
}
/*******************************************************************************
*******************************************************************************/
int Test(const char* FileName)
{
int Amount;
double BufferX[1024], BufferY[1024];
if (GetXY(FileName, (double*)BufferX, (double*)BufferY, &Amount))
{
printf("读取数据文件失败!\r\n");
return -1;
}
printf("读取数据文件成功,共有%d个点!\r\n", Amount);
ParaInit((double*)BufferX, (double*)BufferY, Amount);
ParaDeal();
printf("拟合数据成功,拟合直线为:\r\ny = (%lf) * x^2 + (%lf) * x + (%lf);\r\n", Para[0][3], Para[1][3], Para[2][3]);
system("pause");
return 0;
}
int main(int argc, char* argv[])
{
Test((const char*)"test.txt");
return 0;
}
最小二乘法算法C语言,最小二乘法C算法终极整理版本,绝对原创!相关推荐
- c语言考试算法,c语言考试常用算法docx.docx
c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...
- c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言
FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...
- 函数c语言桶排算法,C语言基本排序算法之桶式排序实例
本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...
- 时钟页面置换算法c语言,clock置换算法例题(改进clock置换算法例题讲解)
Clock页面置换算法: 6)动态给出页面调用序列并进行调度: 7)输出置换结. C++编程要? 考试用 哪位大侠 帮帮 快点 谢谢了 这很简单啊,要打字太多了.不过网上这类算法举例很少,就看你怎么理 ...
- c语言编程实现dsa算法,C语言实现DSA算法(不包括质数生成)
1.头文件部分 #include #include #include 2.判断大数是不是0或1 参见<C语言实现RSA算法> 3.大数加减乘除幂模 参见<C语言实现RSA算法> ...
- 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 用c语言编写银行家算法,C语言实现银行家算法
<C语言实现银行家算法>由会员分享,可在线阅读,更多相关<C语言实现银行家算法(8页珍藏版)>请在人人文库网上搜索. 1.C语言实现银行家算法(源码.运行结果)一. 源码/* ...
- 最佳值换算法c语言,页面置换算法---最佳置换算法(OPT)
最佳置换算法(OPT) 什么是OPT 最佳置换算法,其所选择的被淘汰的页面将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面.采用最佳置换算法通常可保证最低的缺页率.但是人们目前还无法与之, ...
- shuffle算法c语言,C#Shuffle算法(洗牌算法、抽样算法)
Fisher-Yates Shuffle算法 1.创建一个新的list 2.随机取出当前0-list.Count其中一个数 3.把老list当前随机数位置添加到新list 4.老list删除这个数 5 ...
- 格雷码算法c语言实验报告,算法设计与分析实验报告
本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...
最新文章
- Science子刊:植物所杨元合组揭示矿物保护和微生物属性对冻土碳动态的关键调控作用...
- “二子乘舟”的故事很难讲
- vbs禁用任务管理器
- react下移动端可吸附悬浮窗按钮,支持拖动拖拽功能
- Mysql Hunter
- 设计模式 ---适配器模式
- Linux字符设备驱动实例
- flink checkpoint 恢复_Flink解析 | Apache Flink结合Kafka构建端到端的ExactlyOnce处理
- [上海]招募.net网站测试员(实习/见习)
- 教你用Access做个简易MIS管理系统
- CharSequence接口
- selenium下载或保存图片最好的方法
- 读书笔记《大数据时代》
- matplotlib调整坐标轴最小刻度单位,坐标轴主副刻度单位
- 【航拍干货】航测区域重点建筑物精细化建模航拍技巧
- 零基础自学C#——Part4:类的表现形式
- abp 链接本地mysql_abp vNext 使用Mysql 数据库
- php 根据日期获取星座,js 根据日期获取星座名称
- 吴军,阅读与写作,01理解他人,什么是合格的阅读理解?
- 基于FPGA的交通灯设计与实现