需要一个算法来解决这样的方程:
8*p^2+8*q^2+8*p-16=0
p^2+q^2+12*p+20=0
如果有人能指出我算法的名称就足够了。我本可以遵循任何与矩阵相关的算法,但这些线性内的二次方会导致问题。
在您写的情况下,我建议首先从第一个方程中减去第二个方程的 8 倍。
0 = (8*p^2+8*q^2+8*p-16) - 8*(p^2+q^2+12*p+20) = -88*p-176 = 0
p = -2
然后在 q 中留下一个简单的二次方程,您可以使用求解单变量二次方程的常用方法来求解。
Nelder-Mead 算法是一种非常易于编程的非线性求解器,可以在像这样的低维问题中快速准确地收敛。伪代码在 Wikipedia 上很容易理解,但您也可以在线找到一些编码实现。
在这种情况下,您的成本函数将是左侧平方的总和,以确保较低的成本更接近正确的解决方案。
这是一个非线性问题。您将需要一个迭代解决方案,例如 Newton Raphson 或 BFGS。
这是一个简单的方法。
首先线性化它:
16*p*dp + 16*q*dq + 8 = 0
2*p*dp + 2*q*dq + 12 = 0
这变成了一个线性代数问题:
| 16*p 16*q |[ dp ] [ -8 ]
| 2*p 2*q |[ dq ] = [ -12 ]
您将从最初的猜测开始(p, q)
:
(p, q) = (p0, q0)
您将使用常用的线性代数技术求解 dp 和 dq。
您将更新您对 p 和 q 的猜测:
(p1, q1) = (p0 + dp, q0 + dq)
您将再次迭代,直到您的解决方案发散或收敛。
不能保证它会收敛,这取决于你最初的猜测。