问题描述
我正在使用GNU MultiRootFinder的CERN ROOT数据分析框架实现来解决以下系统中的未知数x
和y
:
系统描述了本地化问题的解决方案。也就是说,给定三方的位置[x_i,y_i]
,某些信号的速度以及每一方“看到”信号的时间,我想确定源的坐标[x,y]
。为了简单起见,我们可以假设这三个方和源是共面的。
我的代码如下。请注意,此代码旨在在Cling中运行,它是一个非常有效的程序。 void localize()
在这里扮演int main()
的角色。需要进行一些更改才能将其编译为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,statn3->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);
}
Error in <ROOT::Math::GSLMultiRootFinder::Solve>: The iteration is not making any progress
我已将迭代次数设置为可能的最大值,并且我选择了起点为三方外接圆的中心。
我只向求解器提供前两个方程式。据我了解,这三个部分都是不必要的,并且会产生错误,因为这三个部分的解决方案都包含第三个未知数,即发射时间。
我在这里做错了什么?抱歉,这是一个基本问题。这不是我很熟悉的东西。
编辑:
我想知道这是否与通常两个方程产生两个解的事实有关。因此,也许根查找程序没有收敛于单个解决方案,从而导致错误?我在文档中找不到任何建议的内容,但也找不到没有的任何内容。
如果是这种情况,我想知道,如何引入第三个方程式以消除歧义?
编辑:
我尝试过公差和迭代次数。如果我从3次迭代开始,则会收到一个新错误:
ROOT :: Math :: GSLMultiRootFinder :: Solve:超过最大迭代次数,达到的公差还不够; absTol = 1e-06
其中容差设置为默认值1E-06(显然)。当我收到“未取得进展”错误时,此过程最多可持续10次迭代。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)