我正在寻找一些帮助解决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 library,但没有找到我如何实现这一点。它虽然有助于线性方程式。
答案 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;
}
}
}
}
这个方法给出了坐标系中最近的两个点,你可以用类似的方法得到最理想的点。