資源簡介
用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?????????{
????????????????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?????????????????????????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;
}
/**********************************************************************
評論
共有 條評論