求解圆方程

时间:2012-09-12 10:51:58

标签: java geometry quadratic equation-solving

我正在寻找一些帮助解决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

x1y1r1x2y2r2&的值已知x3y3r3。 我需要解决abr

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

2 个答案:

答案 0 :(得分:3)

我认为你需要用于高斯消元的线性方程。

如果a,b和r是你需要解决的问题,很明显这些是非线性方程式。

你需要一个非线性求解器,比如Newton-Raphson。

你必须线性化你的方程式。计算差分da,db和dr的Jacobean。

你将从最初的猜测开始

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)吗?或者你有更多的积分?如果是后者,则需要最小二乘拟合。

答案 1 :(得分: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;
                }
            }
        }
    }

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