求解3个变量的隐式二次系统

时间:2012-11-26 20:26:31

标签: python numpy system implicit quadratic

我正在尝试解决一个包含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中取出才能使其工作。 救命啊!

1 个答案:

答案 0 :(得分:1)

你可能需要的是scipy.optimize.minimize(),它适用于任意(非线性)方程。 numpy.linalg.lstsq()只解决了线性方程的系统,这个问题非常非线性(虽然有线性化方程组的技术,我认为这不是你想要的情况)。

3个变量中的> 3个方程系统可能没有解,所以你必须定义如何测量给定“解”的好坏,即使它实际上并没有求解方程组。如何将此作为最小化问题,取决于您尝试实际执行的物理或问题域解释。一种可能性是,对于以下等式(这是你的稍微重新排列的版本)

(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,...