gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:21 29 4
gpt4 key购买 nike

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

最佳答案

您可能需要的是 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,) 的 ndarrays,其中 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

这应该接近工作,但我还没有测试过。您可能需要一些额外的参数来最小化(),例如方法,tol,...

关于python - 求解 3 个变量的隐式二次系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572605/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com