又是数学题,裸的高斯消元,第一次写高斯消元。。根据数学可以得到n+1个n元二次方程,但是每个元的二次项系数都是相等的,然后上下相减就得到了n个方程的线性方程组,高斯消元解之。。要注意的是消第i个元的时候要选i元的系数最大的,因为这个系数是做分母,大一点的话精度误差会小。。
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
int i,j,k,n;
double a[15][15];
struct point{
double a[15];
void read()
{
for (int i=1;i<=n;i++) scanf("%lf",&a[i]);
}
}a1,a2;
double sqr(double a){return a*a;}
void gauss()
{
double t;int now;
for (i=1;i<=n;i++)
{
now=i;
for (j=i;j<=n;j++) if (a[j][i]>a[now][i]) now=j;
for (j=1;j<=n+1;j++) swap(a[now][j],a[i][j]);
t=a[i][i];
for (j=i;j<=n+1;j++) a[i][j]/=t;
for (j=i+1;j<=n;j++)
{
t=a[j][i];
for (k=i;k<=n+1;k++) a[j][k]-=t*a[i][k];
}
}
for (i=n;i;i--)
for (j=i+1;j<=n;j++) a[i][n+1]-=a[j][n+1]*a[i][j];
}
int main()
{
freopen("1013.in","r",stdin);
scanf("%d",&n);
memset(a,0,sizeof(a));
a1.read();
for (i=1;i<=n;i++)
{
a2.read();
for (j=1;j<=n;j++) a[i][j]=2*(a2.a[j]-a1.a[j]),a[i][n+1]+=sqr(a2.a[j])-sqr(a1.a[j]);
}
gauss();
for (i=1;i<=n;i++) printf("%.3lf ",a[i][n+1]);
cout<<endl;
}