【问题标题】:Solving a system of equations programmably? [duplicate]以编程方式求解方程组? [复制]
【发布时间】:2010-07-18 16:41:07
【问题描述】:

可能重复:
System of linear equations in C++?

我有以下 2 个方程组:

对于a、b、c、d:

0 = a * r1_x + b * r1_x * r1_y + c * r1_y + d
1 = a * r2_x + b * r2_x * r2_y + c * r2_y + d
0 = a * r3_x + b * r3_x * r3_y + c * r3_y + d
1 = a * r4_x + b * r4_x * r4_y + c * r4_y + d

对于 e,f,g,h:

0 = e * r1_x + f * r1_x * r1_y + g * r1_y + h
0 = e * r2_x + f * r2_x * r2_y + g * r2_y + h
1 = e * r3_x + f * r3_x * r3_y + g * r3_y + h
1 = e * r4_x + f * r4_x * r4_y + g * r4_y + h

我知道 r1_x、r1_y、r2_x、r2_y、r3_x、r3_y、r4_x、r4_y 的值, 并且需要在第一个中求解 a,b,c,d,在第二个中求解 ,e,f,g,h。

我知道如何用铅笔和纸解决这些问题,但我真的不确定如何编程。我如何用 C 或 C++(或伪代码)求解上述方程。

谢谢

【问题讨论】:

  • @ShreevatsaR - 这个问题更为笼统。这个有更简单的解决方案。
  • @IVlad:两者都是“线性方程组”,对吧?我认为没有什么比使用一般的线性方程组求解器更简单的了(顺便说一句,这并不难)。
  • @ShreevatsaR:对于这个特定的问题,Cramer 的规则可能更快,更不容易出错;但我认为使用一般线性方程求解器会更好。
  • @jpalacek:然而,Cramer 的规则也适用于一般的线性方程组(并且可能被这样的求解器用于小输入)。 :-) 我认为这里真正的问题是另一个问题的答案很差,在这种情况下,应该将这个问题重定向到那里,并且必须在那里发布更好的答案。至少我认为 Stack Overflow 的目标是,为代表永恒的问题汇编一组好的答案。
  • 因为这是我在这里写的方程式的副本:stackoverflow.com/questions/3273155/…,您可以简单地查看我在该答案中给出的链接,看看 AGG 是如何解决它的 - 它就在源代码上:antigrain.com/__code/include/agg_simul_eq.h.html

标签: c++ c algorithm equation


【解决方案1】:

您可以将其映射到矩阵系统A x = b,其中A 是系数矩阵,b 是解向量,x 是未知数。您可以实现高斯消除,也可以使用众所周知的库。如果你用LAPACK,你想要的套路dgesv

【讨论】:

  • 能否请您更正 Gauss 的拼写,帮助以后搜索 ;-)
【解决方案2】:

线性代数和矩阵是你的朋友。

Eigen 看起来像最近的 C++ 线性代数库。看看能不能帮到你。

这是您的方程组的样子。这是矩阵:


(来源:equationsheet.com

这是未知向量:


(来源:equationsheet.com

这是右边的向量:


(来源:equationsheet.com

你通过求解来求解这个方程组

由于您的矩阵是块对角矩阵,因此您的解决方案也是。

您可以将线性方程输入Wolfram Alpha 并获得符号解。

Here 是您的系统之一的解决方案。你可以看到矩阵的形式。

【讨论】:

  • 现在没时间了。也许以后。这是不真实的吗?它完全没有帮助吗? OP 甚至似乎都没有意识到它们。
  • 如果你接受 OP 确实可以用铅笔和纸解决它们,那么他就知道了。
  • 我不接受任何东西。来这里问这个问题的 OP 表明他们不知道下一步该做什么。
  • “铅笔和纸”并不意味着了解线性代数。我们在高中时通过重新排列方程来做这些事情,直到我们可以用另一个方程中的其他东西代替。 OP 可能正在寻找相同算法的编码版本。
【解决方案3】:

您可以使用 Gaussian elimination,但如果您只有 4 个方程和 4 个变量,这可能有点过头了。

如果你能在纸上解决它,那就在纸上解决它,找到a, b, c, de, f, g, h 的公式,然后将它们插入你的程序中。

【讨论】:

  • 这个问题比其他问题更不通用或更简单?高斯消元法也是另一种方法的解决方案,甚至对于 4 个变量(甚至 3 个,甚至 2 个变量)都值得使用——尽管在这种情况下,它与许多其他算法无法区分 :-))。
  • @IVlad:我也是这么认为的......但是将它们插入 Mathematica 会为每个变量提供超过 10 行的答案。
  • 完全高斯消除不是要走的路。如果不旋转,它可能会不稳定。如果这是您对改进答案的想法,那么您需要学习很多关于在现实世界中应用线性代数的知识。
  • @duffymo - 在关闭某人之前,您需要学习很多关于注意的知识。维基百科链接解释了旋转。
  • @duffymo - 我不确定其中有什么相关性。我提供了一个合理的建议,并链接到一个页面,该页面对其进行了深入的解释,并引用了其他可以更好地解释它的页面。如果您以此为生,那么您会受到我的尊重,但我不能尊重您提出个人论据来反对我的建议以及对您的工作历史和“线性代数”等广泛领域的模糊引用。我从您的帖子中删除了 -1,这更有帮助,而且我很确定写完不会超过几秒钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多