Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GNU MultiRootFinder“;“没有进展”;_C++_Algorithm_Math_Mathematical Optimization_Root Framework - Fatal编程技术网

C++ GNU MultiRootFinder“;“没有进展”;

C++ GNU MultiRootFinder“;“没有进展”;,c++,algorithm,math,mathematical-optimization,root-framework,C++,Algorithm,Math,Mathematical Optimization,Root Framework,我正在使用GNU MultiRootFinder的CERN根数据分析框架实现来解决以下系统中的未知数,x和y: 系统描述了本地化问题的解决方案。也就是说,考虑到三方的位置、某些信号的速度以及各方“看到”信号的时间,我想确定源的坐标。为了简单起见,我们可以假设三方和源是共面的 我的代码如下。请注意,此代码设计为在CLANG中运行,它是一个完全有效的程序void localize()在这里扮演int main()的角色。要在gcc中编译这个,比如说,gcc,需要做一些更改 #define x1 3

我正在使用GNU MultiRootFinder的CERN根数据分析框架实现来解决以下系统中的未知数,
x
y

系统描述了本地化问题的解决方案。也就是说,考虑到三方的位置、某些信号的速度以及各方“看到”信号的时间,我想确定源的坐标。为了简单起见,我们可以假设三方和源是共面的

我的代码如下。请注意,此代码设计为在CLANG中运行,它是一个完全有效的程序
void localize()
在这里扮演
int main()
的角色。要在gcc中编译这个,比如说,
gcc
,需要做一些更改

#define x1 300000
#define y1 360000

#define x2 210000
#define y2 210000

#define x3 96000
#define y3 360000

#define c  29980000000

void localize(){

    ROOT::RDataFrame frame("D","./path/to/data");

    auto statn1 = frame.Take<double>("statn1");
    auto statn2 = frame.Take<double>("statn2");
    auto statn3 = frame.Take<double>("statn3");

    TF2 *f1 = new TF2("f1","sqrt((x-[0])^2 + (y-[1])^2) + [2]*([3] - [4]) - sqrt((x-[5])^2 + (y-[6])^2)");
    TF2 *f2 = new TF2("f2","sqrt((x-[0])^2 + (y-[1])^2) + [2]*([3] - [4]) - sqrt((x-[5])^2 + (y-[6])^2)");

    ROOT::Math::MultiRootFinder rootFinder(0);

    int i = 0;

        f1->SetParameters(x1,y1,c, statn2->at(i), statn1->at(i), x2,y2);
        f2->SetParameters(x2,y2,c, statn3->at(i), statn2->at(i), x3,y3);

        ROOT::Math::WrappedMultiTF1 g1(*f1,2);
        ROOT::Math::WrappedMultiTF1 g2(*f2,2);

        rootFinder.AddFunction(g1);
        rootFinder.AddFunction(g2);

        rootFinder.SetPrintLevel(1); 

        double init[2] = {2000, 3200};

        rootFinder.Solve(init); 


}
#定义
#定义Y1360000
#定义x2210000
#定义Y210000
#定义x3 96000
#定义y3 360000
#定义c 299800000
void本地化(){
根::RDataFrame帧(“D”,“/path/to/data”);
auto statn1=frame.Take(“statn1”);
auto statn2=frame.Take(“statn2”);
auto statn3=frame.Take(“statn3”);
TF2*f1=新的TF2(“f1”,“sqrt((x-[0])^2+(y-[1])^2)+[2]*([3]-[4])-sqrt((x-[5])^2+(y-[6])^2”);
TF2*f2=新的TF2(“f2”,“sqrt((x-[0])^2+(y-[1])^2)+[2]*([3]-[4])-sqrt((x-[5])^2+(y-[6])^2”);
ROOT::Math::MultiRootFinder rootFinder(0);
int i=0;
f1->设置参数(x1、y1、c、statn2->at(i)、statn1->at(i)、x2、y2);
f2->设置参数(x2、y2、c、statn3->at(i)、statn2->at(i)、x3、y3);
根::数学::WrappedMultiTF1 g1(*f1,2);
根::数学::WrappedMultiTF1 g2(*f2,2);
rootFinder.AddFunction(g1);
rootFinder.AddFunction(g2);
rootFinder.SetPrintLevel(1);
双初始化[2]={20003200};
rootFinder.Solve(init);
}
当我运行代码时,我得到了错误

中的错误:迭代不是
有什么进展吗
我已经将迭代次数设置为可能的最大数目,并且我选择了起点作为由三方限定的圆的中心

我只给解算器输入了前两个方程。按照我的理解,将这三个元素全部输入是不必要的,并且会产生一个错误,因为这三个元素的解决方案都包含第三个未知元素,即发射时间

我做错了什么?如果这是一个基本问题,请道歉。这不是我很熟悉的东西

编辑:

我想知道这是否与两个方程通常会产生两个解这一事实有关。那么,也许根查找器没有收敛到单个解决方案上,从而导致了错误?我在文档中找不到任何建议,但我也找不到任何不建议的

如果是这样的话,我想知道,我怎样才能引入第三个等式来消除这种疑虑呢

编辑:

我尝试过使用迭代的公差和#。如果我从3次迭代开始,我会得到一个新错误:

ROOT::Math::GSLMultiRootFinder::Solve:超出了最大迭代次数,达到的容差不够;Absol=1e-06


其中,公差设置为默认值1E-06(显然)。当我得到“未取得进展”错误时,这将持续10次迭代。

迭代算法中的“未取得进展”可能是它报告不可行方程组的方式。一般来说,对于超定系统,你想做一些类似于最小化残差的事情。@Davidisenstat感谢你的建议。如果你不介意的话,你能详细说明一下“最小化残差”吗。准确地说,如何最小化方程组的残差(我熟悉这个概念,我想你会在这里特别使用LSR,但不确定它如何与方程组一起工作)。那么,如何从中获得未知呢?谢谢我可以试着回答,但老实说,这更像是在驾驶室里。@KeithMadison你想最小化误差的平方和。得到两个方程,偏导数都是0。表达式很混乱,但是两个变量中的两个方程是可以解的。我们能看到完整的数据吗。我们有x1,y1,x2,y2,x3,y3,它们的顺序是10^5,但我们不知道s,t1,t2,t3。我们可能正在接近精度极限,因为输入数据的顺序为od 10^5,结果的精度为10^6。我们有10^11位精度。您期望双进位浮点的小数位数为15-17,因此其可能的中间计算精度可能超过位数。迭代算法中的“未取得进展”可能是它报告不可行方程组的方式。一般来说,对于超定系统,你想做一些类似于最小化残差的事情。@Davidisenstat感谢你的建议。如果你不介意的话,你能详细说明一下“最小化残差”吗。准确地说,如何最小化方程组的残差(我熟悉这个概念,我想你会在这里特别使用LSR,但不确定它如何与方程组一起工作)。那么,如何从中获得未知呢?谢谢我可以试着回答,但老实说,这更像是在驾驶室里。@KeithMadison你想最小化误差的平方和。得到两个方程,偏导数都是0。表达式很混乱,但是两个变量中的两个方程是可以解的。我们能看到完整的数据吗。我们有x1,y1,x2,y2,x3,y3,它们的顺序是10^5,但我们不知道s,t1,t2,t3。我们可能正在接近精度极限,因为输入数据的顺序为od 10^5,结果的精度为10^6。我们有10^11位精度。双进动浮点需要15-17位十进制数字,因此其可能的中间计算可能超过精度的位数。
Error in <ROOT::Math::GSLMultiRootFinder::Solve>: The iteration is not 
making any progress