2

我正在使用 GNU Scientific Library 的多根查找器的实现来求解以下非线性方程组中的未知数 (x和):y

在此处输入图像描述

但是,我对“起点”有点困惑:

Solve(const double *x, int maxIter = 0, double absTol = 0, double relTol = 0) 从点 X 开始求根;如果给定,则使用迭代次数和容差,否则使用可以由静态方法 SetDefault 定义的默认参数值

起点如何选择?

4

1 回答 1

2

在一维多项式问题中,这是一个经过充分研究的Real-root_isolation域。在二维中它不太为人所知。

首先注意我们可以将方程转换为多项式,取第一个

sqrt[(x-x1)^2 + (y-y1)^2] + s (t2 -t1) = sqrt[(x-x1)^2 + (y-y1)^2]

两边正方形

[(x-x1)^2 + (y-y1)^2] + 2 sqrt[(x-x1)^2 + (y-y1)^2][s (t2 -t1)] + [s (t2 -t1)]^2 = [(x-x1)^2 + (y-y1)^2]

改编

2 sqrt[(x-x1)^2 + (y-y1)^2][s (t2 -t1)] = [(x-x1)^2 + (y-y1)^2] - [(x-x1)^2 + (y-y1)^2] - [s (t2 -t1)]^2

再次正方形

4 [(x-x1)^2 + (y-y1)^2] [s (t2 -t1)]^2 = ([(x-x1)^2 + (y-y1)^2] - [(x-x1)^2 + (y-y1)^2] - [s (t2 -t1)]^2)^2

给我们一个多项式。(注)

一旦我们有了一组多项式,就可以使用一些代数技术。

我使用的一种技术是将多项式转换为Bernstein polynomials。首先,重新调整您的域,使两个变量都位于 [0,1] 中。如果 m, n 是两个多项式的次数,则多项式可以表示为和

sum i=0..m sum j=0..n b_ij mCi nCj x^i (1-x)^(n-i) y^j (1-y)^(n-j)

其中 mCi、nCj 是二项式系数。

这些多项式具有很好的凸性。如果系数 b_ij 都是正的,那么多项式的值对于 [0,1] 中的所有 x,y 都是正的。如果系数都是负数,则类似。

这让你可以说“这个地区没有解决方案”。

因此,解决问题的策略可能是:

  1. 选择解决方案可能出现的最大区域。
  2. 将其细分为一组较小的区域
  3. 对于每个区域,计算每个方程的伯恩斯坦多项式
  4. 检查 Bernstein 多项式的系数,如果它们都是正数(或全负数),则拒绝该区域
  5. 您现在应该已经拒绝了大部分域。使用每个剩余区域中的一个点启动多根查找器。

如果您想了解如何构造 Berstein 多项式的详细信息,可以阅读我的论文A new method for drawing Algebraic Surfaces

注意:通过平方我们实际上得到了更多我们想要的解决方案。在最初的问题中,我们想要原理 sqareroot,即 +sqrt(A),也有使用另一个根 -sqrt(A) 的解决方案。这使得问题变得更容易,而不是我们从两条双曲线的交点得到的四个解决方案,我们只有一个分支的交叉点,所以问题的一两个解决方案。


对于您的问题,有一种非常简单的方法可以获取其中一个起点。

假设 s=0。然后每个方程将给出与两点等距的点集。这是一条线,连接点的线段的垂直平分线,然后简单地找到三个垂直平分线的交点。这将是Circumscribed_circle的中心。这对于算法来说可能已经足够了。更简单的是简单地取三个点的平均值。

于 2020-10-03T08:29:54.450 回答