Python 三元隐式二次系统的求解

Python 三元隐式二次系统的求解,python,numpy,system,implicit,quadratic,Python,Numpy,System,Implicit,Quadratic,我试图解一个方程组,它有3个变量和一个可变数量的方程 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.mini

我试图解一个方程组,它有3个变量和一个可变数量的方程

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
基本上,这个系统的长度在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中取出来才能起作用。 救命啊

您可能需要()来处理任意(非线性)方程。numpy.linalg.lstsq()只解一个线性方程组,这个问题肯定是非线性的(虽然有一些技术可以使方程组线性化,但我认为这不是你想要的)

一个由3个变量中的>3个方程组成的系统很可能没有解,因此您必须定义如何衡量给定的“解”有多好,即使它实际上没有解方程组。如何将其视为最小化问题取决于物理或问题域的解释,以及您实际要做的事情。一种可能性是,对于以下等式(这是您的稍微重新排列的版本)

尝试最小化所有左侧的绝对值之和(如果方程精确求解,则应为零)。换句话说,你需要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,)的n数组;A,B,C,tid是(N)的N列,其中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、

您可能需要的是()它可以处理任意(非线性)方程。numpy.linalg.lstsq()只解一个线性方程组,这个问题肯定是非线性的(虽然有一些技术可以使方程组线性化,但我认为这不是你想要的)

一个由3个变量中的>3个方程组成的系统很可能没有解,因此您必须定义如何衡量给定的“解”有多好,即使它实际上没有解方程组。如何将其视为最小化问题取决于物理或问题域的解释,以及您实际要做的事情。一种可能性是,对于以下等式(这是您的稍微重新排列的版本)

尝试最小化所有左侧的绝对值之和(如果方程精确求解,则应为零)。换句话说,你需要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,)的n数组;A,B,C,tid是(N)的N列,其中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,…

getData()返回什么?两个数组的元组?无论如何,我认为你需要一个由(不少于)三个方程组成的系统,它们必须是线性独立的(这很重要!),才能求出x,y,z的值。因为您将提取每个未知值作为左值,并将其替换为其他两个值,然后对第二个值重复此过程,这样您将得到一个只有一个未知值的方程。然后,您可以求解它并替换结果,然后对其他两个重复该过程。这有意义吗?getData()返回什么?两个数组的元组?无论如何,我认为你需要一个由(不少于)三个方程组成的系统,它们必须是线性独立的(这很重要!),才能求出x,y,z的值。因为您将提取每个未知值作为左值,并将其替换为其他两个值,然后对第二个值重复此过程,这样您将得到一个只有一个未知值的方程。然后,您可以求解它并替换结果,然后对其他两个重复该过程。这有意义吗?@KevinSchaffer:请看一看,让我知道这是否适合你。@KevinSchaffer:请看一看,让我知道这是否适合你。