在GNU科学图书馆multiroot finder中选择起点

问题描述

我正在使用GNU科学图书馆的多根查找器实现来解决以下非线性方程组中的未知数(xy):

enter image description here

但是,关于“起点”我有些困惑:

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

如何选择起点?

解决方法

在一维多项式问题中,这是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. 对于每个区域,为您的每个方程式计算Bernstein多项式
  4. 检查伯恩斯坦多项式的系数,如果它们均为正(或全部为负),则拒绝该区域
  5. 您现在应该已经拒绝了大部分域。使用其余每个区域中的一个点启动多根查找器。

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

注意:通过平方,我们实际上得到了我们想要的更多解决方案。在第一个问题中,我们需要平方根,即+ sqrt(A),也有使用其他根-sqrt(A)的解决方案。这使问题比起从两个双曲线的交点得到的四个解决方案要容易一些,我们只有一个分支的交集,所以一个或两个问题的解决方案。


对于您的问题,有一种非常好的简单方法来获得起点之一。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...