Math 找到这个二次方程组的解析解

Math 找到这个二次方程组的解析解,math,equation-solving,Math,Equation Solving,我将问题归结为3个二次方程组: (k1*x + k2*y + k4)^2 = k7 (k2*y + k3*z + k5)^2 = k8 (k3*z + k1*x + k6)^2 = k9 (Solve for x, y, z, k1..k9 are constants) 我花了很长时间没有找到解析解。有人能给我答案吗 另外,常数之间存在一些关系,可以简化问题。如果明天需要的话,我可以把它们寄出去 Thx Peter纯数学,但可通过编程解决,。。。首先使

我将问题归结为3个二次方程组:

  (k1*x + k2*y + k4)^2 = k7      
  (k2*y + k3*z + k5)^2 = k8      
  (k3*z + k1*x + k6)^2 = k9

  (Solve for x, y, z, k1..k9 are constants)
我花了很长时间没有找到解析解。有人能给我答案吗

另外,常数之间存在一些关系,可以简化问题。如果明天需要的话,我可以把它们寄出去


Thx Peter

纯数学,但可通过编程解决,。。。首先使用Gilles-Philippe Paillé注释和单独变量:

(k1*x + k2*y + k4)^2 = k7
(k2*y + k3*z + k5)^2 = k8
(k3*z + k1*x + k6)^2 = k9
-------------------------
k1*x + k2*y + k4 = sqrt(k7)
k2*y + k3*z + k5 = sqrt(k8)
k3*z + k1*x + k6 = sqrt(k9)
-------------------------
k1*x + k2*y = sqrt(k7) - k4
k2*y + k3*z = sqrt(k8) - k5
k3*z + k1*x = sqrt(k9) - k6
-------------------------
k1*x + k2*y +  0*z = sqrt(k7) - k4
 0*x + k2*y + k3*z = sqrt(k8) - k5
k1*x +  0*y + k3*z = sqrt(k9) - k6
-------------------------
现在您可以重写为矩阵形式

    | k1 k2  0 |
A = |  0 k2 k3 |
    | k1  0 k3 |

    | x |
B = | y |
    | z |

    | sqrt(k7) - k4 |
C = | sqrt(k8) - k5 |
    | sqrt(k9) - k6 |


             A * B =              C
Inverse(A) * A * B = Inverse(A) * C
                 B = Inverse(A) * C
所以它是3x3矩阵的简单逆。如果通过zeor填充将其扩展为4x4,并向对角线添加1,则可以使用4x4矩阵逆,如下所示:

< >在C++代码示例中查找<代码> MatrxIn vn/代码>。你也可以在那里找到矩阵和向量的乘法
matrix\u mul\u vector

< C++中的代码看起来是这样的:

双A[16]=
{
k1,0,k1,0,
k2,k2,0,0,
0,k3,k3,0,
0, 0, 0, 1
};
双B[4],C[4]=
{
sqrt(k7)-k4,
sqrt(k8)-k5,
sqrt(k9)-k6
};
矩阵_inv(A,A);
矩阵μmul(B,A,C);
现在
B
应该保存结果
x,y,z
值,如果方程有解。剩下的只是添加符号组合,作为系统的
sqrt
。。。如果所有常数和变量都是非负的,你可以忽略这一点,直接使用结果,而不必尝试8种组合

如果我看对了,组合就是这样做的

double C[4]=
{
(+/-)sqrt(k7)-k4,
(+/-)sqrt(k8)-k5,
(+/-)sqrt(k9)-k6
};
因此,对于8个
C
组合中的每一个,计算结果。。。组合本身可以通过for循环完成,使用迭代器变量的3个最低位来决定符号,如:

matrix_inv(A,A);

对于(int i=0;我来谈谈StackOverflow。这是一个怎样的编程问题?如果你添加更多的上下文,包括你迄今为止在这个问题上所做工作的证据,以及你所处困境的陈述,这个问题将更适合这个网站。我投票结束这个问题,因为它不是关于实用的计算机编程,而是而是在提问者添加了更多自己的工作并解释了他所处的困境后继续提问。我同意这应该是数学交流。然而,解决方案是:取k7、k8和k9的平方根,得到一个线性方程组。因为平方根可以是正的或负的,所以你需要为所有人解这个系统8个标志组合(±sqrt(k7),±sqrt(k8),±sqrt(k9))。如果你接受复系数,你将得到最多8个实值答案,或者正好8个答案。Thx很多,我在解一个x方程时没有求平方根,并且被许多±sqrt项卡住了。我不认为你可以做±置换作为最后一步。Thx也要对Gilles Philippe Paillé说。@PeterPohl这不是最后一步在组合了
+/-
之后,你从左边乘以A的逆矩阵,但我明白了你的意思:)@Spektre谢谢你的详细回答!我注意到
逆(A)*B=inverse(A)*C
行中有一个小错误。应该是
逆(A)*A*B=inverse(A)*C
。此外,我认为使用4x4反转对这项任务来说有点过分。我知道这是为了重用现有代码,但性能可能会受到很大影响。@Gilles PhilippePailléNice catch thx我修复了它。是的,4x4速度较慢,但没有那么多。我也有3x3,但太懒了,无法搜索它,而且4x4已经存在发布。顺便说一句,我用它来表示正交矩阵,它的速度快得多,但在这种情况下不可用…因为正交正态性是不被授予的。这里是一般情况,我在那里也得到了N维矩阵/向量模板…@Gilles PhilippePaillébtw,最后一个模板是作为我的4D引擎的核心数学编写的,与此QA相关: