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

2023-11-13

最小二乘曲线拟合

   在上一篇博客中我们介绍了最小二乘法的原理,以及代码实现的例子。

      http://blog.csdn.net/beijingmake209/article/details/27565125

   本次我们再给出一个程序实现的例子。编译环境VC6.0

  先给出一组需要拟合的数据:

  xx[]=  { 0.995119, 2.001185, 2.999068, 4.001035, 4.999859, 6.004461, 6.999335, 7.999433,

             9.002257, 10.003888, 11.004076, 12.001602, 13.003390, 14.001623, 15.003034,  
             16.002561, 17.003010, 18.003897, 19.002563, 20.003530};
 yy[] = { -7.6200, -2.460, 108.7600, 625.020, 2170.500, 5814.5800,13191.8400,26622.060,

            49230.2200, 85066.5000, 139226.2800, 217970.1400, 328843.8600,480798.4200,

            684310.00, 951499.9800, 1296254.9400, 1734346.6600, 2283552.1200, 2963773.50};

实现代码如下:

#include <stdio.h>
#include <stdlib.h>

#include "math.h"

void polyfit(int n, double *x, double *y, int poly_n, double p[]);
void gauss_solve(int n,double A[],double x[],double b[]);

/*==================polyfit(n,x,y,poly_n,a)===================*/
/*=======拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
/*=====n是数据个数 xy是数据值 poly_n是多项式的项数======*/
/*===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====*/
void polyfit(int n,double x[],double y[],int poly_n,double p[])
{
	int i,j;
	double *tempx,*tempy,*sumxx,*sumxy,*ata;
	
	tempx = (double *)calloc(n , sizeof(double));
	sumxx = (double *)calloc((poly_n*2+1) , sizeof(double));
	tempy = (double *)calloc(n , sizeof(double));
	sumxy = (double *)calloc((poly_n+1) , sizeof(double));
	ata = (double *)calloc( (poly_n+1)*(poly_n+1) , sizeof(double) );
	for (i=0;i<n;i++)
	{
		tempx[i]=1;
		tempy[i]=y[i];
	}
	for (i=0;i<2*poly_n+1;i++)
	{
		for (sumxx[i]=0,j=0;j<n;j++)
		{
			sumxx[i]+=tempx[j];
			tempx[j]*=x[j];
		}
	}

	for (i=0;i<poly_n+1;i++)
	{
		for (sumxy[i]=0,j=0;j<n;j++)
		{
			sumxy[i]+=tempy[j];
			tempy[j]*=x[j];
		}
	}

	for (i=0;i<poly_n+1;i++)
	{
		for (j=0;j<poly_n+1;j++)
		{
			ata[i*(poly_n+1)+j]=sumxx[i+j];
		}
	}
	gauss_solve(poly_n+1,ata,p,sumxy);
	
	free(tempx);
	free(sumxx);
	free(tempy);
	free(sumxy);
	free(ata);
}

/*============================================================*/
	高斯消元法计算得到	n 次多项式的系数
	n: 系数的个数
	ata: 线性矩阵
	sumxy: 线性方程组的Y值
	p: 返回拟合的结果
/*============================================================*/
void gauss_solve(int n,double A[],double x[],double b[])
{
	int i,j,k,r;
	double max;
	for (k=0;k<n-1;k++)
	{
		max=fabs(A[k*n+k]);					// find maxmum 
		r=k;
		for (i=k+1;i<n-1;i++)
		{
			if (max<fabs(A[i*n+i]))
			{
				max=fabs(A[i*n+i]);
				r=i;
			}
		}
		if (r!=k)
		{
			for (i=0;i<n;i++)		//change array:A[k]&A[r]
			{
				max=A[k*n+i];
				A[k*n+i]=A[r*n+i];
				A[r*n+i]=max;
			}

			max=b[k];                    //change array:b[k]&b[r]
			b[k]=b[r];
			b[r]=max;
		}
		
		for (i=k+1;i<n;i++)
		{
			for (j=k+1;j<n;j++)
				A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];
			b[i]-=A[i*n+k]*b[k]/A[k*n+k];
		}
	} 
	
	for (i=n-1;i>=0;x[i]/=A[i*n+i],i--)
	{
		for (j=i+1,x[i]=b[i];j<n;j++)
			x[i]-=A[i*n+j]*x[j];
	}

}

void main()
{
	int i, sizenum;
	double P[6];
	int dimension = 5;	//5次多项式拟合
	//	要拟合的数据
	double xx[]=  {0.995119, 2.001185, 2.999068, 4.001035, 4.999859, 6.004461, 6.999335,   
		7.999433, 9.002257, 10.003888, 11.004076, 12.001602, 13.003390, 14.001623, 15.003034,  
		16.002561, 17.003010, 18.003897, 19.002563, 20.003530};
	double yy[] = {-7.620000, -2.460000, 108.760000, 625.020000, 2170.500000, 5814.580000,
		13191.840000, 26622.060000, 49230.220000, 85066.500000, 139226.280000, 217970.140000, 328843.860000,
		480798.420000, 684310.000000, 951499.980000, 1296254.940000, 1734346.660000, 2283552.120000, 2963773.500000};
	
	sizenum = sizeof(xx)/ sizeof(xx[0]);	//	拟合数据的维数
	polyfit(sizenum, xx, yy, dimension, P);
	
	printf("拟合系数, 按升序排列如下:\n");
	for (i=0;i<dimension+1;i++)				//这里是升序排列,Matlab是降序排列
	{
		printf("P[%d]=%lf\n",i,P[i]);
	}
}


  拟合结果如下所示:

  拟合系数, 按升序排列如下:
 P[0]=-18.544118
 P[1]=6.725933
 P[2]=0.236626
 P[3]=-0.529331
 P[4]=-1.450258
 P[5]=0.999157

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小二乘曲线拟合——C语言算法实现二 的相关文章

  • 计算两个多边形的交集

    一 问题描述 已知两个多边形Polygon1和Polygon2 分别由点集C1 P1 P2 Pm 和C2 Q1 Q2 Qn 表示 求这两个多边形的交集 二 算法思想 两个多边形相交后 其顶点要么是两个多边形边的交点 要么是在多边形内部的点
  • 统计学的基本概念

    转 浅谈协方差矩阵 一 统计学的基本概念 统计学里最基本的概念就是样本的均值 方差 标准差 首先 我们给定一个含有n个样本的集合 下面给出这些概念的公式描述 均值 标准差 方差 均值描述的是样本集合的中间点 它告诉我们的信息是有限的 而标准
  • PNG透明窗体全攻略(控件不透明)vc++程序指导

    这两天在研究透明窗体 总算略有小成 网上大部分文章都是介绍到把窗体弄透明就没有下文 其实窗体透明并不难 难就难在透明的窗体上还要放控件 今 天我就把窗体透明一直到控件不透明怎么制作一块给写了吧 先截张图诱惑下你们 如果你没兴趣就没必要再看下
  • 模式识别——特征提取(表达)

    特征表达 特征是机器学习系统的原材料 对最终模型的影响是毋庸置疑的 如果数据被很好地表达成了特征 通常线性模型就能达到满意的精度 关于特征 需要考虑以下三方面 1 特征表示的粒度 需要考虑 模型在一个什么程度上的特征表示 才能发挥效果 以图
  • VC++6.0的兼容性问题解决方案

    VC6 0 能够在 XP 下很好的运行 无需进行额外的设置 但在 Win7 Win8 和 Win10 下 安装完成后还要修改兼容模式才可以 在Win7或Win10下使用VC6 0 对于Win7和Win10 需要将VC6 0的兼容模式修改为
  • LRC算法的Java实现

    项目中要用到 本来想拿来主义 结果没有找到合适的 所有自己写了一个 LRC具体算法如下 1 对需要校验的数据 2n个字符 两两组成一个16进制的数值求和 2 将模值按位取反 3 加1 Java代码实现 输入byte data 返回LRC校验
  • windows上bug崩溃定位分析(Qt或者VS)

    任何情况下 都不能保证自己写的代码不会发生崩溃 崩溃不可怕 可怕的是无法定位哪里崩溃 特别是客户那边崩溃 开发者这边不崩溃 问题陷入僵局 自从有了下面这个神奇的代码 再也不怕了 以下代码亲自测试没问题 1 如果是在VC 中 那么只需要将下列
  • 分享66个HTML&CSS源码,总有一款适合您

    HTML CSS源码 分享66个HTML CSS源码 总有一款适合您 下面是文件的名字 我放了一些图片 文章里不是所有的图主要是放不下 大家下载后可以看到 源码下载链接 https pan baidu com s 1AeVqON7byvt
  • 最大熵算法及简单例子

    最近在学模式识别 正在看Introduction to Pattern Recognition这本书 挺不错的一本书 好 下面和大家一起来学习最大熵算法 首先 最大熵算法是干什么的呢 一般是用来估计一个分布 至于把分布估计出来之后用来干什么
  • 模式识别 - 名词解释整理

    模式识别 模式识别是指把对象根据其特征归到若干类别中适当的一类 模式识别也称为模式分类 模式 模式是指因素间存在确定性或随机性规律的对象 过程或事件的集合 识别 识别就是把对象分门别类地认出来 样本 sample 所研究对象的一个个体 样本
  • VS2005(VC++)远程调试方法

    仅我目前了解很多人还在使用成本很高的本地调试方法 即在需要调试的机器上安装VS环境 这样的好处就是直接 但是成本很高 要在目标机器安装一个VS的Copy 国内可能不是问题 还有源代码安全问题 同步问题等等 开始 已知 A B两个服务器 如果
  • 计算机视觉、模式识别、机器学习常用牛人主页链接

    牛人主页 主页有很多论文代码 Serge Belongie at UC San Diego Antonio Torralba at MIT Alexei Ffros at CMU Ce Liu at Microsoft Research N
  • UNIX网络编程之源代码的编译和使用

    UNIX网络编程入门 对于想学习网络编程的来说 UNIX网络编程 这书肯定是不二选择 所谓实践是检验真理的唯一标志 特别是对于编程来讲 再多的理论经验也比不过code一次 UNIX网络编程 这本书提供连源码下载 第三本版的源码可点击这里下载
  • DirectShow中的工具GraphEdit使用小结

    一 安装完Windows SDK 7 0或7 1后 在C Program Files Microsoft SDKs Windows v7 0 Bin下有32位的graphedt exe 及x64目录下有64位版本的graphedt exe
  • 模式识别学习笔记之一:模式识别的步骤及相关概念

    1 信息获取 2 预处理 对获取信号进行规范化等各种处理 3 特征提取与选择 将识别样本构造成便于比较 分析的描述量即特征向量 4 分类器设计 由训练过程将训练样本提供的信息变为判别事物的判别函数 5 分类决策 对样本特征分量按判别函数的计
  • [教程]VC++6.0的简单使用

    鉴于许多同学的vc 6 0无法正常使用 并且不会创建工程及文件 还有的同学会遇到一些编译的问题 我在这里做个小教程 1 工具的准备 首先 我把需要的资源给大家 一共就两个文件 一个安装文件 另一个是MSDEV exe 用于替换 链接 htt
  • C语言函数操作大全----(超详细)

    fopen 打开文件 相关函数 open fclose 表头文件 include
  • 什么是模式、什么是模式识别、模式识别的方法、过程

    什么是模式 pattern 模式是存在于时间和空间中可观察的物体 如果可以区分相同或者相似的物体类别 可区分的物体称之为模式 模式不是指具体的物体 而是抽象的类别 例如 人这个类别是一种模式 自行车这个类别是一种模式 什么是模式识别 1 模
  • VC6.0向工程中添加文件和打开文件出错“"0x5003eaed"指令引用的"0x00000000"内存”解

    据说这个错误是因为和微软的其他软件相冲突了 下面就看看如何解决这个问题 第一步 下载一个FileTool插件 下载的地址 http download microsoft com download vc60ent s1 6 0 w9xnt4
  • "无法找到“XXX.exe”的调试信息,或者调试信息不匹配

    今天调试一C 程序 按下F5 老是弹出一对话框显示信息 debugging information for myproject exe cannot be found or does not match No symbols loaded

随机推荐

  • STM32——TIM输入捕获

    文章目录 一 TIM输入捕获 输入捕获简介 频率测量 二 通用定时器的输入捕获通道 通用定时器框图 通道的输出部分 三 主从触发模式 主模式 从模式 四 输入捕获基本结构 五 PWMI基本结构 六 输入捕获模式测频率 电路设计 关键代码 七
  • 微信二次分享不显示摘要和图片的解决方法

    微信二次分享不显示摘要和图片的解决方法 解决不显示摘要和图片的问题 需要调用微信公众号的js sdk的api 需要前端和后台的配合 后台需要返回 appid 公众号的appid timestamp 生成签名的时间戳 nonceStr 签名的
  • 【狂神Java学习笔记】Java基础

    狂神Java学习笔记 Java基础 参考网址 https www bilibili com video BV12J41137hu 一 注释 单行注释 多行注释 文档注释 用于生产说明文档 二 标识符和关键字 1 标识符概念 在java程序中
  • 只有某个网站无法访问的问题

    某个网站登录不上的问题 楼主遇到了只有百度登录不上 而其他网站及软件都能正常使用的问题 经过多次尝试终于解决 有以下几种解决方案 修改DNS地址 可能是由于DNS设置不正确的问题导致 可以打开网络和internet选项 更改适配器设置点击I
  • Linux学习之系统编程篇:读写锁(pthread_ rwlock _init / rdlock / wrlock / unlock / destroy)

    一 读写锁的认识 1 读写锁是1把锁 2 读写锁的类型 pthread rwlock t lock 又分 读锁 不让读内存 和 写锁 不让写内存 3 读写锁的特性 1 读共享 例如 线程 A 加读锁成功 有来个 3 个线程 作读操作 也可加
  • EOS开发者资源的大清单

    EOS开发者资源的大清单 自主网推出仅3个多月后 EOS正迅速发展其用户和开发者社区 在撰写本文时 EOS已经达到了超过20 000 000个不可逆块 并且具有大约3996个每秒交易 TPS 的一致吞吐量 更令人印象深刻的是不断增长的活跃用
  • 远程访问VM虚拟机方式记录

    网络环境 因个人办公网络相关限制 所使用的虚拟机网络环境为NAT模式 操作步骤 1 获取物理机的IP地址 2 获取虚拟机IP地址 确保要连接的虚拟机开启了相关的远程服务 3 VMware相关设置 先使用点击更改设置获取NAT设置的操作权限
  • TiDB学习

    TiDB 简介 SQL 基本操作 分类 查看 创建和删除数据库 创建 查看和删除表 创建 查看和删除索引 记录的增删改 记录的查询 创建 授权和删除用户 部署集群 数据迁移 运维操作 监控和告警 故障诊断 性能调优 教程 生态工具 参考指南
  • 打开Unity项目,加载进度条一直显示busy不消失

    打开Unity项目 加载进度条一直显示busy不消失 解决办法 我的项目路径存在中文 改成全英文路径再打开一下就好了
  • 红黑树并没有我们想象的那么难(上)

    lt 红黑树并没有我们想象的那么难 gt 上 下两篇已经完成 希望能帮助到大家 红黑树并没有我们想象的那么难 上 红黑树并没有我们想象的那么难 下 红黑树并没有想象的那么难 初学者觉得晦涩难读可能是因为情况太多 红黑树的情况可以通过归结 通
  • cad快速选择命令快捷键_CAD快捷键,命令大全

    一 常用CTRL ALT快捷键 ALT TK 如快速选择 ALT NL 线性标注 ALT VV4 快速创建四个窗口 ALT MUP 提取轮廓 Ctrl B 栅格捕捉模式控制 F9 Ctrl C 将选择的对象复制到剪切板上 Ctrl F 控制
  • 机器学习-对范数的理解

    1 范数的概念 参考 https blog csdn net a6333230 article details 87860875 范数 norm 主要是对矩阵和向量的一种描述 矩阵范数 描述矩阵引起变化的大小 AX B 矩阵X变化了A个量级
  • 解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题

    现象 在docker中启动的Spring Boot实例在Eureka上查看实例时 主机名和ip为docker的容器名称和容器环境内的ip 导致从Eureka上点击服务后 无法打开对应服务 同时导致未在docker环境内的服务也无法使用服务名
  • matlab中增大迭代次数,贝叶斯优化matlab

    当我们遇到的一个最优化问题 但是目标函数不知道 或者说目标函数是类似于黑盒子 很难用数学公式 程序写出来时 此时想要求得目标函数的极值 可以使用贝叶斯优化 其主要的适用的情景是维数不超过20维 目标是一个具体的数值时 这样的情景有很多 比如
  • BRDF

    前言 现实世界中的表面绝大多数都是凹凸不平的 在这种情况下 可以把表面看成是大量朝向各异的微小光学平面的集合 我们肉眼可见的每个点都包含了很多个这样的微小光学平面 光线照射到这些微小表面上时 同样一部分在表面发生反射 这些朝向不同的微表面把
  • 服务器分析和监控

    在当今数字化时代 对于网络流量的分析和监控变得越来越重要 本文将详细介绍如何利用HTTPS代理服务器来实现高效 安全且可靠的流量分析与监控功能 并提供具体操作步骤以及相关技巧 无论是企业需要优化网络性能还是个人用户 在遵循法规合规前提下使用
  • 【C++】MySQL8初始化疑难解答

    MySQL是著名的开源关系数据库 在网站建设 移动APP服务 云计算 科学管理领域都有重要用途 无论以后从事什么方向的IT工作 都要对MySQL有一定的了解 MySQL最新版本号是8 官网提供了绿色包和安装包下载 现在一般都会选择绿色包下载
  • Revi+Geometry属性的参数

    GeoElement geoElem elem get Geometry geoOptions Options类用来制定返回几何数据的特征 返回的几何对象可否带参考信息ComputeReference 为true或false 设置返回的几何
  • 华为OD机试 -合法IP(C++ & Java & JS & Python)

    描述 IPV4地址可以用一个32位无符号整数来表示 一般用点分方式来显示 点将IP地址分成4个部分 每个部分为8位 表示成一个无符号整数 因此正号不需要出现 如10 137 17 1 是我们非常熟悉的IP地址 一个IP地址串中没有空格出现
  • 最小二乘曲线拟合——C语言算法实现二

    最小二乘曲线拟合 在上一篇博客中我们介绍了最小二乘法的原理 以及代码实现的例子 http blog csdn net beijingmake209 article details 27565125 本次我们再给出一个程序实现的例子 编译环境