高斯消元
算法理解
建议看这篇(和算法竞赛书上一模一样,也不知道谁抄谁的)
我对理解是就相当于是小学学的加减消元法,给他系统化了
#include<bits/stdc++.h>
using namespace std;
const int N=105;
const double eps=1e-7;
double a[N][N];
int n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
scanf("%lf",&a[i][j]);
}
}
for(int i=1;i<=n;i++){
int mx=i;
for(int j=i+1;j<=n;j++){//以前的行就不能动了,这也就是个小优化不用太较真
if(fabs(a[j][i])>fabs(a[mx][i])) mx=j;
}
for(int j=1;j<=n+1;j++){
swap(a[i][j],a[mx][j]);
}
if(fabs(a[i][i])<eps){
printf("No Solution\n");
return 0;
}
for(int j=n+1;j>=1;j--){
a[i][j]=a[i][j]/a[i][i];
}
for(int j=1;j<=n;j++){
if(j!=i){
double temp=a[j][i]/a[i][i];
for(int k=1;k<=n+1;k++) a[j][k]-=a[i][k]*temp;
}
}
}
for(int i=1;i<=n;i++){
printf("%.2f\n",a[i][n+1]);
}
return 0;
}
T1:
推一下式子即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
double a[N][N],d[N][N];
int n;
void guass(){
for(int i=1;i<=n;i++){
int mx=i;
for(int j=i;j<=n;j++){
if(fabs(a[j][i])>fabs(a[mx][i])){
mx=j;
}
}
for(int j=1;j<=n+1;j++){
swap(a[i][j],a[mx][j]);
}
for(int j=n+1;j>=i;j--){
a[i][j]=a[i][j]/a[i][i];
}
for(int j=1;j<=n;j++){
if(i!=j){
double tmp=a[j][i]/a[i][i];
for(int k=1;k<=n+1;k++){
a[j][k]-=a[i][k]*tmp;
}
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n+1;i++){
for(int j=1;j<=n;j++){
scanf("%lf",&d[i][j]);
}
}
for(int i=1;i<=n;i++){
double cnt=0;
for(int j=1;j<=n;j++){
a[i][j]=2*d[i+1][j]-2*d[i][j];
cnt+=d[i+1][j]*d[i+1][j]-d[i][j]*d[i][j];
}
a[i][n+1]=cnt;
}
guass();
for(int i=1;i<=n;i++){
printf("%.3lf ",a[i][n+1]);
}
return 0;
}

浙公网安备 33010602011771号