公式原题下面都给了….
用题目给的公式能列出
n+1
n
+
1
个式子(假设
n=2
n
=
2
)
r2=(xi−x)2+(yi−y)2
r
2
=
(
x
i
−
x
)
2
+
(
y
i
−
y
)
2
发现出现二次项很难搞
可以用后 n n 个式子减去第一个式子消去所有的二次项,产生个方程
2(x1−xi)x+2(y1−yi)y=r2+x21+y21−x2i−y2i
2
(
x
1
−
x
i
)
x
+
2
(
y
1
−
y
i
)
y
=
r
2
+
x
1
2
+
y
1
2
−
x
i
2
−
y
i
2
高斯消元解决即可
代码如下:
#include<algorithm>
#include<ctype.h>
#include<cstdio>
#include<cmath>
#define eps 1e-6///某谷精度要到1e-8
#define N 25
using namespace std;
inline int read(){
int x=0,f=1;char c;
do c=getchar(),f=c=='-'?-1:f; while(!isdigit(c));
do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c));
return x*f;
}
double b[N],ans[N],a[N][N];
int n,tmp;
inline void Gauss(){
for(int i=1;i<n;i++){
tmp=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[j][i])>fabs(a[tmp][i]))
tmp=j;
for(int j=1;j<=n+1;j++)
swap(a[i][j],a[tmp][j]);
for(int j=i+1;j<=n;j++){
if(fabs(a[j][i])<=eps) continue;
double t=a[j][i]/a[i][i];
for(int l=i+1;l<=n+1;l++)
a[j][l]=a[j][l]-t*a[i][l];
}
}
for(int i=n;i;i--){
ans[i]=a[i][n+1]/a[i][i];
for(int j=i-1;j;j--)
a[j][n+1]-=ans[i]*a[j][i];///倒推答案
}
}
int main(){
n=read();
for(int i=1;i<=n;i++)
scanf("%lf",&b[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
scanf("%lf",&a[i][j]);
a[i][n+1]=a[i][n+1]+b[j]*b[j]-a[i][j]*a[i][j];
a[i][j]=2.0*(b[j]-a[i][j]);
}
Gauss();
for(int i=1;i<n;i++) printf("%.3lf ",ans[i]);
printf("%.3lf",ans[n]);
return 0;
}