一次,二次、三次多项式系数解算是工程项目里最常用到的方法,就是常用的数学公式,如果从头写还是比较费劲,涉及到高斯解方程等,这里将源码分享给大家,已经经过大量的测试,解算算法是完全正确的。直接复制即可使用,如果能帮到大家,希望能点赞。
//solve one order polynomial
void PolynCal1(double *x1, double *y1, double *x2,
double *y2, int n, double *cofx, double *cofy)
{
for(int i=0; i<n; i++)
{
x1[i]=(cofx[0]+cofx[1]*x2[i]+cofx[2]*y2[i]);
y1[i]=(cofy[0]+cofy[1]*x2[i]+cofy[2]*y2[i]);
}
}
void PolynCoff3(double *x1, double *y1, double *x2,
double *y2, int n, double *cofx, double *cofy,
double *rmsx, double *rmsy)
{
double a[10],aa[100],al[10];
int i;
//x
memset(aa,0,sizeof(double)*100);
memset(al,0,sizeof(double)*10);
for(i=0; i<n; i++)
{
a[0] = 1.0;
a[1] = x2[i]; a[2] = y2[i];
a[3] = x2[i]*x2[i]; a[4] = x2[i]*y2[i]; a[5] = y2[i]*y2[i];
a[6] = x2[i]*x2[i]*x2[i]; a[7] = x2[i]*x2[i]*y2[i];
a[8] = x2[i]*y2[i]*y2[i]; a[9] = y2[i]*y2[i]*y2[i];
EquationNorm(a,10,x1[i],aa,al,1.0);
}
Agaus(aa, al, 10);
memcpy(cofx, al, sizeof(double)*10);
//y
memset(aa,0,sizeof(double)*100);
memset(al,0,sizeof(double)*10);
for(i=0; i<n; i++)
{
a[0] = 1.0;
a[1] = x2[i]; a[2] = y2[i];
a[3] = x2[i]*x2[i]; a[4] = x2[i]*y2[i]; a[5] = y2[i]*y2[i];
a[6] = x2[i]*x2[i]*x2[i]; a[7] = x2[i]*x2[i]*y2[i];
a[8] = x2[i]*y2[i]*y2[i]; a[9] = y2[i]*y2[i]*y2[i];
EquationNorm(a,10,y1[i],aa,al,1.0);
}
Agaus(aa, al, 10);
memcpy(cofy, al, sizeof(double)*10);
if(rmsx)
{
for(i=0; i<n; i++)
{
rmsx[i]=(cofx[0]+
cofx[1]*x2[i]+cofx[2]*y2[i]+