题意:
给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11)
方程组的形式是一个二次方程组
(ai1-x1)^2 + (ai2-x2)^2 +(ai3-x1)^2 + (ai4-x2)^2 +(ai5-x1)^2 + (ai6-x2)^2 +(ai7-x1)^2 + (ai8-x2)^2 + (ai9-x2)^2 +(ai10-x1)^2 + (ai11-x2)^2 = dis ^2
题解:
二次方程组每个展开之后,每个和上一个相减,就可以得到11个线性方程。
这题就是高斯消元求解普通线性方程的模版题啦。
我的模版:
1 void gauss(int n) 2 { 3 int i,j,k,l,r; 4 double f; 5 for(i=1;i<=n;i++) 6 { 7 r=i; 8 for(j=i+1;j<=n;j++) 9 if(myabs(a[j][i])>myabs(a[r][i])) r=j;10 if(r!=i) for(j=1;j<=n+1;j++) swap(a[i][j],a[r][j]);11 12 for(j=n+1;j>=i;j--)//逆序枚举可以避免用变量保存a[k][i]/a[i][i],避免精度损失13 for(k=i+1;k<=n;k++)14 a[k][j]-=a[k][i]/a[i][i] * a[i][j];15 }16 17 for(i=n;i>=1;i--)18 {19 for(j=i+1;j<=n;j++)20 a[i][n+1]-=a[j][n+1]*a[i][j];21 a[i][n+1]/=a[i][i];22 }23 }
代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 const int N=100;10 double a[N][N],b[N][N],c[N];11 12 double myabs(double x){ return x>0 ? x:-x;}13 14 void output()15 {16 for(int i=1;i<=11;i++)17 {18 for(int j=1;j<=12;j++) 19 printf("%.2lf ",a[i][j]);20 printf("\n");21 }22 printf("\n");23 }24 25 void gauss(int n)26 {27 int i,j,k,l,r;28 double f;29 for(i=1;i<=n;i++)30 {31 r=i;32 for(j=i+1;j<=n;j++) 33 if(myabs(a[j][i])>myabs(a[r][i])) r=j;34 if(r!=i) for(j=1;j<=n+1;j++) swap(a[i][j],a[r][j]);35 36 for(j=n+1;j>=i;j--)//逆序枚举可以避免用变量保存a[k][i]/a[i][i],避免精度损失37 for(k=i+1;k<=n;k++)38 a[k][j]-=a[k][i]/a[i][i] * a[i][j];39 }40 41 for(i=n;i>=1;i--)42 {43 for(j=i+1;j<=n;j++)44 a[i][n+1]-=a[j][n+1]*a[i][j];45 a[i][n+1]/=a[i][i];46 }47 for(i=1;i<=n-1;i++) printf("%.2lf ",a[i][n+1]);48 printf("%.2lf\n",a[n][n+1]);49 }50 51 int main()52 {53 int T;54 scanf("%d",&T);55 while(T--)56 {57 for(int i=1;i<=12;i++)58 {59 for(int j=1;j<=11;j++)60 scanf("%lf",&b[i][j]);61 scanf("%lf",&c[i]);62 }63 memset(a,0,sizeof(a));64 for(int i=1;i<=11;i++)65 {66 for(int j=1;j<=11;j++)67 {68 a[i][j]=b[i][j]-b[i+1][j];69 }70 a[i][12]=c[i+1]*c[i+1]-c[i]*c[i];71 for(int j=1;j<=11;j++) 72 a[i][12]+=b[i][j]*b[i][j]-b[i+1][j]*b[i+1][j];73 a[i][12]/=2;74 }75 // output();76 gauss(11);77 }78 return 0;79 }