1

いくつかの非線形最適化問題があります (できれば Python で解決します):

2D 平面に 3 つの円 (中心 x1..3、y1..3、半径 d1..3) が与えられています。

(x-x1)^2 + (y-y1)^2 - r1^2 = 0
(x-x2)^2 + (y-y2)^2 - r2^2 = 0
(x-x3)^2 + (y-y3)^2 - r3^2 = 0

共通点 (x/y) が必要であり、この場合は fsolve (scipy.optimize) で計算できます。しかし、半径 r1..3 がそれぞれ u1..3 の不確実性を持つ場合、どのように問題を解決するのでしょうか? つまり、円の真の半径は ru ... r+u の区間にあります。

半径の不確実性を組み込んだ最適点 (x/y) を見つけるにはどうすればよいですか?

4

2 に答える 2

1

ここの説明を考えると、これは実際にはそれほど難しいことではありません: http://mathworld.wolfram.com/Circle-CircleIntersection.html

提案されたアルゴリズム:

  1. リンクで説明されているように、 x - を見つけます。
  2. y を計算します。

どちらも任意の 2 つの円を使用して実行する必要があります。

  1. 点 (x,y) と (x,-y) を 3 つの円に差し込みます。
  2. 解決策は、3 つの円すべてが x,y x,-y で交差するか、まったく交差しないかのいずれかです。

別の提案...私はあなたの質問をもう一度読んで、あなたが自分でポイントを見つけようとしていないことに気づきました...

ただし、紙に 9 つの円すべてを描くと (交差する 3 つに加えて、r+e と re の小さい方と大きい方の 2 つ、e はエラー)、次のことがわかります。交点はポリゴン内にあります。このポリゴンの頂点は簡単に計算できます。そして、問題は次のいずれかになります。ポリゴン内のポイントを見つけます。または、これらの頂点を見つける異議関数を作成してから、その領域を最小化します。

円について私が何を意味するかを確認するには、次を実行します。

# excuse me for the ugly code ...
import pylab
pylab.axes()

cir = pylab.Circle((1,0), radius=1, alpha =.2, fc='b')
cir1 = pylab.Circle((1,0), radius=0.9, alpha =.2, fc='b')
cir2 = pylab.Circle((1,0), radius=1.1, alpha =.2, fc='b')
cir3 = pylab.Circle((-1,0), radius=1, alpha =.2, fc='b')
cir4 = pylab.Circle((-1,0), radius=0.9, alpha =.2, fc='b')
cir5 = pylab.Circle((-1,0), radius=1.1, alpha =.2, fc='b')
cir6 = pylab.Circle((0,-1), radius=0.9, alpha =.2, fc='b')
cir7 = pylab.Circle((0,-1), radius=1.1, alpha =.2, fc='b')
cir8 = pylab.Circle((0,-1), radius=1, alpha =.2, fc='b')
pylab.gca().add_patch(cir)
pylab.gca().add_patch(cir1)
pylab.gca().add_patch(cir2)
pylab.gca().add_patch(cir3)
pylab.gca().add_patch(cir4)
pylab.gca().add_patch(cir5)
pylab.gca().add_patch(cir6)
pylab.gca().add_patch(cir7)
pylab.gca().add_patch(cir8)

pylab.axis('scaled')
pylab.show()
于 2011-11-15T18:55:07.460 に答える
0

私はこの方法を試してみます。与えられた点 p について、その点から 3 つの円のそれぞれまでの距離を計算します。これは、(1)点と円の原点との間の距離と(2)円の半径の差の絶対値を取ることによって行うことができます。次に、目的関数は、3 つの距離の合計を最小化することです (円 A への p、円 B への p、円 C への p)。算術合計を試してみますが、別の方法で集計する正当な理由があるかもしれません (平均的な種類の数学をアンサンブルします)。次に、非線形パッケージを使用して、目的関数 (つまり、3 つの距離の合計) を最小化します。

これで、各円の重みができました。そのため、目的関数を変更して、各円の不確実性によって距離を割り引きます。繰り返しますが、この重み付けがどのように達成されるかについてのロジックが必要です...単純な方法は、各距離の重みとして 1/sigma^2 を取る「加重平均」を使用することです。だからあなたの目的関数は

(weighted average distance) 
= ( distA * sigmaA^-2 + distB * sigmaB^-2 + distC * sigmaC^-2 ) 
   / ( sigmaA^-2 + sigmaB^-2 + sigmaC^-2) 

ここで、distX は点から円までの距離、sigmaA は円の位置の標準偏差 (円の位置とサイズの不確実性による) であり、^-22 乗して除算します。

上記の obj を最小化するには、nonlin パッケージを使用します。ポイントの x と y を変更することによって機能します。

于 2011-11-15T19:14:14.980 に答える