$n$维空间求圆心:
记圆心为$(a[0][1],a[0][2],a[0][3],…,a[0][n])$,给定点为$(a[i][1],a[i][2],a[i][3],…a[i][n])$,则可以列出n+1
条等式:
形如:式i
$(a[i][1]-a[0][1])^2 + (a[i][2]-a[0][2])^2 + (a[i][3]-a[0][3])^2 + … + (a[i][n]-a[0][n])^2 = R^2$
将第式i
-式1
,可以消去未知数的平方项,可以得到n
条线性方程:
形如:$2(a[i][1] - a[1][1])x[1] + 2(a[i][2] - a[1][2])x[2] +…+ 2(a[i][j] - a[1][j])x[i] +…+2(a[i][n] - a[1][n])x[n]
$
$=(a[i][1]^2 - a[1][1]^2) + (a[i][2]^2 - a[1][2]^2) +…+ (a[i][j]^2 - a[1][j]^2) +..+ (a[i][n]^2 - a[1][n]^2)$
令$b[i][j] = a[i][j] - a[1][j]$ (j∈[1,n]),
$b[i][n+1] = (a[i][1]^2 - a[1][1]^2) + (a[i][2]^2 - a[1][2]^2) +…+ (a[i][j]^2 - a[1][j]^2) +..+ (a[i][n]^2 - a[1][n]^2)$
显然b都是已知数,原始转换成形如:$b[i][1] * x[1] + b[i][2] * x[2] +…+b[i][j] * x[j] +…+ b[i][n] * x[j] = b[i][n+1]$
此时有n
条线性方程,n
个未知数,可以用高斯消元
求得解。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 15;
int n;
double a[N][N] , b[N][N];
void gauss()
{
for(int r = 1 , c = 1 ; c <= n ; c++)
{
int t = r;
for(int i = r + 1 ; i <= n ; i++)
if(fabs(b[t][c]) < fabs(b[i][c])) t = i;
for(int i = c ; i <= n + 1 ; i++) swap(b[t][i] , b[r][i]);
for(int i = n + 1 ; i >= c ; i--) b[r][i] /= b[r][c];
for(int i = r + 1 ; i <= n ; i++)
for(int j = c + 1 ; j <= n + 1 ; j++)
b[i][j] -= b[i][c] * b[r][j];
r++;
}
for(int i = n ; i ; i--)//求第i个未知数的解b[i][n + 1]
for(int j = i + 1 ; j <= n ;j++)//第j个未知数的解b[j][n + 1]
b[i][n + 1] -= b[i][j] * b[j][n + 1];
}
int main()
{
cin >> n;
for(int i = 1 ; i <= n + 1 ; i++)
for(int j = 1 ; j <= n ; j++)
cin >> a[i][j];
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n ; j++)
{
b[i][j] = 2 * (a[i + 1][j] - a[1][j]);
b[i][n + 1] += a[i + 1][j] * a[i + 1][j] - a[1][j] * a[1][j];
}
gauss();
for(int i = 1 ; i <= n ; i++) printf("%.3lf " , b[i][n + 1]);
return 0;
}
Orz
操作过程中r和c是等价的
这里确实,因为一定存在唯一一个解