最小二乘法 线性 拟合 程序

1200阅读 0评论2015-11-19 number007cool
分类:C/C++


点击(此处)折叠或打开

  1. #include "stdafx.h"
  2. #include "process.h"

  3. /*******************************************************************************
  4. 阶乘函数宏定义
  5. *******************************************************************************/
  6. #define my_pow2(x) ((x) * (x))

  7. /*******************************************************************************
  8. 定义一个2行3列的系数矩阵
  9. *******************************************************************************/
  10. static double Para[2][3] = {0.0};

  11. /*******************************************************************************
  12. 系数矩阵的初始化,没有撒谎,真的只有6行 + 一个循环
  13. *******************************************************************************/
  14. static int ParaInit(double* X, double* Y, int Amount)
  15. {
  16.         Para[1][1] = Amount;
  17.         for ( ; Amount; Amount--, X++, Y++)
  18.         {
  19.                 Para[0][0] += my_pow2(*X);
  20.                 Para[0][1] += (*X);
  21.                 Para[0][2] += (*X) * (*Y);
  22.                 Para[1][2] += (*Y);
  23.         }
  24.         Para[1][0] = Para[0][1];
  25.         return 0;
  26. }

  27. /*******************************************************************************
  28. 系数矩阵的运算,没有撒谎,真的只有7行
  29. *******************************************************************************/
  30. static int ParaDeal(void)
  31. {
  32.         Para[0][0] -= Para[1][0] * (Para[0][1] / Para[1][1]);
  33.         Para[0][2] -= Para[1][2] * (Para[0][1] / Para[1][1]);
  34.         Para[0][1] = 0;
  35.         Para[1][2] -= Para[0][2] * (Para[1][0] / Para[0][0]);
  36.         Para[1][0] = 0;
  37.         Para[0][2] /= Para[0][0];
  38.         //Para[0][0] = 1.0;
  39.         Para[1][2] /= Para[1][1];
  40.         //Para[1][1] = 1.0;
  41.         return 0;
  42. }

  43. /***********************************************************************************
  44. 从txt文件里读取double型的X,Y数据
  45. ***********************************************************************************/
  46. static int GetXY(const char* FileName, double* X, double* Y, int* Amount)
  47. {
  48.         FILE* File = fopen(FileName, "r");
  49.         if (!File)
  50.                 return -1;
  51.         for (*Amount = 0; !feof(File); X++, Y++, (*Amount)++)
  52.                 if (2 != fscanf(File, (const char*)"%lf %lf", X, Y))
  53.                         break;
  54.         fclose(File);
  55.         return 0;
  56. }

  57. /*******************************************************************************
  58. *******************************************************************************/
  59. int Test(const char* FileName)
  60. {
  61.         int Amount;
  62.         double BufferX[1024], BufferY[1024];
  63.         if (GetXY(FileName, (double*)BufferX, (double*)BufferY, &Amount))
  64.         {
  65.                 printf("读取数据文件失败!\r\n");
  66.                 return -1;
  67.         }
  68.         printf("读取数据文件成功,共有%d个点!\r\n", Amount);
  69.         ParaInit((double*)BufferX, (double*)BufferY, Amount);
  70.         ParaDeal();
  71.         printf("拟合数据成功,拟合直线为:\r\ny = (%lf) * x + (%lf);\r\n", Para[0][2], Para[1][2]);
  72.         system("pause");
  73.         return 0;
  74. }

  75. int main(int argc, char* argv[])
  76. {
  77.         Test((const char*)"test.txt");
  78.         return 0;
  79. }

上一篇:xml配置文件
下一篇:VC 模拟量标定