【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 }

 

posted @ 2016-11-04 13:36  拦路雨偏似雪花  阅读(276)  评论(0编辑  收藏  举报