-2

我正在寻求一些帮助来解决 Java 中的以下方程

(a-x1)^2 + (b-y1)^2 = r1^2 + r^2
(a-x2)^2 + (b-y2)^2 = r2^2 + r^2
(a-x3)^2 + (b-y3)^2 = r3^2 + r^2

x1, y1, r1, x2, y2, r2& x3, y3,的值r3是已知的。我需要解决a, b,r

如何在 Java 中执行此操作?我检查了Commons Maths 库,但没有找到如何实现这一点。不过,它有助于线性方程。

4

2 回答 2

3

我认为你需要线性方程来消除高斯。

如果您需要求解 a、b 和 r,那么很明显这些是非线性方程。

您将需要一个非线性求解器,例如 Newton-Raphson。

你必须线性化你的方程。计算微分 da、db 和 dr 的雅可豆。

您将从最初的猜测开始

a = a(old)
b = b(old)
r = r(old)

使用方程的线性化版本来计算增量

2*(a(old)-x1)*da + 2*(b(old)-y1)*db = 2*r(old)*dr
2*(a(old)-x2)*da + 2*(b(old)-y2)*db = 2*r(old)*dr
2*(a(old)-x3)*da + 2*(b(old)-y3)*db = 2*r(old)*dr

更新你的猜测

a(new) = a(old) + da
b(new) = b(old) + db
r(new) = r(old) + dr

并重复直到它收敛(如果它收敛)。

您永远不应该使用高斯消元法求解线性方程:它存在许多问题。更好的想法是进行 LU 分解和前后替换。

如果我的线性化方程是正确的,它们会采用A(dx) = 0. 边界条件应该是什么?

(a, b)是圆心的坐标;r是半径。

你真的有三点(x1, y1),,(x2, y2)(x3, y3)?还是你有更多的积分?如果是后者,则需要最小二乘拟合。

于 2012-09-12T11:31:12.880 回答
0

希望这个方法能给你一些想法:

public int[] getCoordinates(float XR_1, float YR_1, float XR_2, float YR_2,
                             float XR_3, float YR_3, int R1, int R2, int R3) {
    //define the positions
    int XU_1 = 0, YU_1 = 0, XU_2 = 0, YU_2 = 0, XU, YU;
    //define variables and arrays that needed
    float D0[][] = new float[17][50];
    float D1[][] = new float[17][50];
    float f[][] = new float[17][50];
    float fmin_1 = 0;
    float fmin_2 = 0;
    //define columns and rows
    int i, j;
    //Y goes from 0 to 49
    for(j=0; j<=49; j++){
        //X goes from 0 to 16
        for(i=0; i<=16; i++){
            D0[i][j] = (float) (Math.pow((i-XR_1),2) + Math.pow((j-YR_1),2) - Math.pow(R1,2));
            D1[i][j] = (float) (Math.pow((i-XR_2),2) + Math.pow((j-YR_2),2) - Math.pow(R2,2));
            f[i][j] = (float) Math.sqrt(Math.pow(D0[i][j], 2) + Math.pow(D1[i][j], 2));
            //get two position where f[i][j] are the minimum
            //initialise the minimum two positions
            if(i==0 & j==0){
                fmin_1 = f[i][j];
                XU_1 = i;
                YU_1 = j;
            }
            else if(j==0 & i==1){
                if(f[i][j] < fmin_1){
                    fmin_2 = fmin_1;
                    fmin_1 = f[i][j];
                    XU_2 = XU_1;
                    XU_1 = i;
                    YU_2 = YU_1;
                    YU_1 = j;
                }
                else {
                    fmin_2 = f[i][j];
                    XU_2 = i;
                    YU_2 = j;
                }
            }
            else{
                if(f[i][j] < fmin_1){
                    fmin_2 = fmin_1;
                    fmin_1 = f[i][j];
                    XU_2 = XU_1;
                    XU_1 = i;
                    YU_2 = YU_1;
                    YU_1 = j;
                }
                else if(f[i][j] < fmin_2){
                    fmin_2 = f[i][j];
                    XU_2 = i;
                    YU_2 = j;
                }
            }
        }
    }

这种方法给出了坐标系中最近的两个点,你可以用类似的方法得到最理想的一个。

于 2018-04-09T10:05:16.980 回答