• 大小: 11KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-06-08
  • 语言: C/C++
  • 标签: c,拟合  

资源简介

用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;
}
/**********************************************************************

评论

共有 条评论

相关资源