【问题标题】:solve a system of nonlinear equations with c++用 C++ 求解非线性方程组
【发布时间】:2016-09-29 10:08:29
【问题描述】:

我想用 C++ 求解方程组。有没有提供求解器的工具/包?我的系统看起来像

(x-a)^2 + (y-b)^2 = d1 
(x-c)^2 + (y-d)^2 = d2

在这种情况下,我知道 a,..,d, d1,d2。

我知道我采用了一个特殊情况(a、b、d = 0,而 c 不是 0),但我希望在所有情况下都有一个解决方案。

有人有想法吗?

【问题讨论】:

  • blaslapack ...
  • 在 c++ 中,^ 是二元运算符,而不是平方数运算符。
  • @StackDanny ^ 可以重载(尽管它的优先级很低);他使用大括号来执行操作顺序,尽管他需要换行,所以看起来更像((x-a)^2) + ((y-b)^2) = d1
  • 我认为 OP 意味着权力,即。 (x-a)*(x-a)。所以它基本上是两个半径为 sqrt(d1) 和 sqrt(d2) 的圆,中心在 [a,b] 和 [c,d]。当圆确实接触(单点)或交叉(两点)(并且 0
  • 解是垂直平分线,你可以手动推导出来。

标签: c++ system equations


【解决方案1】:

如果您需要对求解非线性方程的一般支持,CeresPetSCdlib 都有非线性求解器,您可以使用 C++ 来解决您描述的问题。尽管您更有可能在 Matlab 甚至 python 的 scipy 中找到对此类工作的更好支持。特别是如果您对性能不感兴趣,只需要轻松解决小规模方程。

如果你只需要解决你发布的系统,有一个简单的封闭式解决方案:

  1. 从 eq1 中减去 eq2 并表示 x = f(y) [s1]
  2. 在其中一个方程中用 f(y) 代替 x 并求解 y
  3. 将 y 替换回 [s1] 以找到 x

【讨论】:

    【解决方案2】:

    我建议您阅读“数字食谱”。 这本书有一章是关于方程求解的,它们的前言通常用足够简单的术语很好地概述了所有主题。 请注意,数值求解方程有许多精细的细节,使用任何软件包而不处理细节可能会导致糟糕的解决方案(或者可能只是缓慢,或不够好)。

    【讨论】:

      【解决方案3】:

      在几何意义上,方程组(SOE) 代表两个圆圈。第一个是一个圆圈 中心在 (a,b) 和半径 sqrt(d1) 处,并且 第二个是 (c,d) 处的圆,半径为 sqrt(d2)。

      需要考虑三种情况

      the first case is if the two circles do not
      intersect. In this case the equation does not have a 
      solution.
      
      The second case is if the two circles intersect at 
      two points. In such case the equations will have two 
      solutions. i.e two possible values for (x,y)
      
      In third case the two circles intersect at exactly 
      two points. In this case the SOE has exactly one 
      solution. i.e one pair of solution (x,y).
      

      那么我们如何检查国有企业是否有解决方案。好吧,我们 检查两个圆是否相交。 两个圆相交 iff: 两个圆之间的距离小于或 等于它们的半径之和。

      sqrt( (a-c)^2 + (b-d)^2 ) <= sqrt(d1) + sqrt(d2).
      

      如果等式成立,则两个圆相交 正好一分,因此国企正好一分 解决方案。

      我可以继续解释,但我会留给你 方程。看看这个:

      https://math.stackexchange.com/questions/256100/how-can-i-find-the-points-at-which-two-circles-intersect#256123

      【讨论】:

        【解决方案4】:

        是的,this one supports nonlinear systems 和重载的 ^ 运算符。

        这里是一个例子:https://github.com/ohhmm/NonLinearSystem

        【讨论】:

          猜你喜欢
          • 2021-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-02
          相关资源
          最近更新 更多