1

3 つの変数と可変数の方程式を持つ連立方程式を解こうとしています。

基本的に、システムは 5 ~ 12 の方程式の長さであり、方程式の数に関係なく、3 つの変数について解こうとしています。

次のようになります。

(x-A)**2 + (y-B)**2 + (z-C)**2 = (c(t-d))**2

私はA、B、C、そして右側全体を知っています。A、B、C および右辺はすべて長さ n の配列で、n は 5 から 12 の間でランダムに変化します。したがって、サイズが変化する連立方程式が得られます。numpy の lstsq 関数を使用して、次のようなことを行う必要があると思います。

data,data1 = getData()        # I will have to do this for 2 unique systems.
A   = data[:,0]
B   = data[:,1]
C   = data[:,2]
tid = data[:,3]
P = (x-A)**2 + (y-B)**2 + (z-C)**2              
b = tid
solved = lstsq(P,b)
print solved

ただし、x、y、z は暗黙的であることがわかっているため、これは機能しません。したがって、これを機能させるには P から取り出す必要があります。ヘルプ!

4

1 に答える 1

1

おそらく必要なのは、任意の (非線形) 方程式で動作するscipy.optimize.minimize () です。numpy.linalg.lstsq() は線形方程式系のみを解きます。この問題はかなり明確に非線形です (方程式系を線形化する手法はありますが、これはこの場合に必要なものではないと思います)。

3 変数の 3 つ以上の方程式系には解がない可能性が高いため、実際には連立方程式を解いていない場合でも、与えられた「解」がどれだけ優れているかを測定する方法を定義する必要があります。これを最小化の問題として提起する方法は、実際に何をしようとしているのか、物理的または問題領域の解釈によって異なります。1つの可能性は、次の方程式の場合です(これはあなたのものをわずかに再配置したバージョンです)

(x-A1)**2 + (y-B1)**2 + (z-C1)**2 - T1**2 = 0
(x-A2)**2 + (y-B2)**2 + (z-C2)**2 - T2**2 = 0
...

すべての左辺の絶対値の合計を最小化しようとします (方程式が正確に解かれた場合、左辺はゼロになるはずです)。つまり、次の関数の最小値を生成する x、y、z が必要です。

sum( abs( (x-A1)**2 + (y-B1)**2 + (z-C1)**2 - T1**2 ) + abs( (x-A2)**2 + (y-B2)**2 + (z-C2)**2 - T2**2 ) + ... )

コード例: v は、x、y、z を含む (3,) の ndarray です。A、B、C、tid は (N,) の ndarray です。ここで、N は方程式の数です。

def F(v, A, B, C, tid):
    x = v[0]
    y = v[1]
    z = v[2]
    return numpy.sum( numpy.abs( (x-A)**2 + (y-B)**2 + (z-C)**2 - tid ) )

v_initial = numpy.array([x0, y0, z0]) # starting guesses
result = scipy.optimize.minimize(F, v_initial, args=(A, B, C, tid))
v = result.x
x, y, z = v.tolist() # the best solution found

これはほぼ機能するはずですが、テストしていません。たとえば、method、tol、...など、minimize() に追加の引数が必要になる場合があります。

于 2012-11-27T09:29:12.407 に答える