资源简介
用C语言实现多项式的你和,其中采用最小二乘法,数据精度在e-13数量级。
代码片段和文件信息
// 最小二乘法拟合.cpp : Defines the entry point for the console application.
//
#include
#include “stdlib.h“
#include “math.h“
//
#define ParaBuffer(BufferRowCol) (*(Buffer + (Row) * (SizeSrc + 1) + (Col)))
//
/***********************************************************************************
***********************************************************************************/
/***********************************************************************************
从txt文件里读取double型的X,Y数据
txt文件里的存储格式为
X1 Y1
X2 Y2
X3 Y3
X4 Y4
X5 Y5
X6 Y6
X7 Y7
X8 Y8
函数返回X,Y,以及数据的数目(以组为单位)
***********************************************************************************/
static int GetXY(const char* FileNamelong double* Xlong 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;
}
/***********************************************************************************
***********************************************************************************/
/***********************************************************************************
打印系数矩阵,只用于调试,不具备运算功能
对于一个N阶拟合,它的系数矩阵大小是(N + 1)行(N + 2)列
double* Para:系数矩阵存储地址
int SizeSrc:系数矩阵大小(SizeSrc)行(SizeSrc + 1)列
***********************************************************************************/
static int PrintPara(long double* Para int SizeSrc)
{
int i j;
for (i = 0; i < SizeSrc; i++)
{
for (j = 0; j <= SizeSrc; j++)
printf(“%.18lf “ ParaBuffer(Para i j));
printf(“\r\n“);
}
printf(“\r\n“);
return 0;
}
/***********************************************************************************
***********************************************************************************/
/***********************************************************************************
系数矩阵的限幅处理,防止它溢出,目前这个函数很不完善,并不能很好地解决这个问题
原理:矩阵解行列式,同一行乘以一个系数,行列式的解不变
当然,相对溢出问题,还有一个精度问题,也是同样的思路,现在对于这两块的处理很不完善,有待优化
以行为单位处理
***********************************************************************************/
static int ParalimitRow(long double* Para int SizeSrc int Row)
{
int i;
long 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;
}
/**********************************************************************
评论
共有 条评论