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