【zoj3645】高斯消元求解普通线性方程
题意:
给你一个方程组(含有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 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6 #include<algorithm>
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 }