zoukankan      html  css  js  c++  java
  • 【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("
    ");
    21     }
    22     printf("
    ");
    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
    ",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 }
  • 相关阅读:
    内部类
    多重继承关系初始化顺序及初始化
    String
    Error
    算法:插入排序
    算法:冒泡排序
    算法:选择排序
    注册Activity
    java变量的作用域和基本数据类型转换
    java数据类型
  • 原文地址:https://www.cnblogs.com/KonjakJuruo/p/6029937.html
Copyright © 2011-2022 走看看