|
发表于 2013-5-19 20:35:03
|
显示全部楼层
C语言实现,已通过matlab对比验证:
/***********************************************************************************
从txt文件里读取double型XY数据
***********************************************************************************/
int GetXY(const char* FileName, double* X, 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;
}
/***********************************************************************************
从double型XY数据中获取系数矩阵
***********************************************************************************/
int GetK(double* K, const double* X, const double* Y, int Amount)
{
*(K + 10) = Amount;
*K = 0;
*(K + 1) = 0;
*(K + 2) = 0;
*(K + 3) = 0;
*(K + 6) = 0;
*(K + 7) = 0;
*(K + 11) = 0;
for ( ; Amount; Amount--, X++, Y++)
{
*K += (*X) * (*X) * (*X) * (*X);
*(K + 1) += (*X) * (*X) * (*X);
*(K + 2) += (*X) * (*X);
*(K + 3) += (*X) * (*X) * (*Y);
*(K + 6) += (*X);
*(K + 7) += (*X) * (*Y);
*(K + 11) += (*Y);
}
*(K + 4) = *(K + 1);
*(K + 5) = *(K + 2);
*(K + 8) = *(K + 2);
*(K + 9) = *(K + 6);
return 0;
}
/***********************************************************************************
系数矩阵变换,解矩阵方程
***********************************************************************************/
int TransK(double* K)
{
//
*(K + 5) = (*(K + 5)) * (*K) - (*(K + 4)) * (*(K + 1));
*(K + 6) = (*(K + 6)) * (*K) - (*(K + 4)) * (*(K + 2));
*(K + 7) = (*(K + 7)) * (*K) - (*(K + 4)) * (*(K + 3));
*(K + 4) = 0;
*(K + 9) = (*(K + 9)) * (*K) - (*(K + 8)) * (*(K + 1));
*(K + 10) = (*(K + 10)) * (*K) - (*(K + 8)) * (*(K + 2));
*(K + 11) = (*(K + 11)) * (*K) - (*(K + 8)) * (*(K + 3));
*(K + 8) = 0;
//
//
*(K + 10) = (*(K + 10)) * (*(K + 5)) - (*(K + 9)) * (*(K + 6));
*(K + 11) = (*(K + 11)) * (*(K + 5)) - (*(K + 9)) * (*(K + 7));
*(K + 9) = 0;
//
//
*(K + 5) = (*(K + 5)) * (*(K + 10));
*(K + 7) = (*(K + 7)) * (*(K + 10)) - (*(K + 6)) * (*(K + 11));
*(K + 6) = 0;
//
//
*K = (*K) * (*(K + 5));
*(K + 2) = (*(K + 2)) * (*(K + 5));
*(K + 3) = (*(K + 3)) * (*(K + 5)) - (*(K + 1)) * (*(K + 7));
*(K + 1) = 0;
//
//
*K = (*K) * (*(K + 10));
*(K + 3) = (*(K + 3)) * (*(K + 10)) - (*(K + 2)) * (*(K + 11));
*(K + 2) = 0;
//
//
if (0 != *(K + 00))
{
*(K + 3) /= *(K + 00);
*K = 1.0;
}
if (0 != *(K + 5))
{
*(K + 7) /= *(K + 5);
*(K + 5) = 1.0;
}
if (0 != *(K + 10))
{
*(K + 11) /= *(K + 10);
*(K + 10) = 1.0;
}
//
return 0;
}
/***********************************************************************************
***********************************************************************************/
int Cal(const char* FileName, double* ParaA, double* ParaB, double* ParaC)
{
double ParaK[12], BufferX[1024], BufferY[1024];
int Amount;
GetXY(FileName, (double*)BufferX, (double*)BufferY, &Amount);
GetK((double*)ParaK, (const double*)BufferX, (const double*)BufferY, Amount);
TransK((double*)ParaK);
*ParaA = ParaK[3];
*ParaB = ParaK[7];
*ParaC = ParaK[11];
return 0;
}
int main(int argc, char* argv[])
{
double ParaA, ParaB, ParaC;
Cal((const char*)"test.txt", &ParaA, &ParaB, &ParaC);
printf("ParaA = %lf\r\nParaB = %lf\r\nParaC = %lf\r\n", ParaA, ParaB, ParaC);
return 0;
} |
|