FreeCAD求解器PlaneGCS的求解算法?
Moderator: paullee
Forum rules
论坛规矩 / 論壇規矩 , 有用的资讯 / 有用的資訊
论坛规矩 / 論壇規矩 , 有用的资讯 / 有用的資訊
FreeCAD求解器PlaneGCS的求解算法?
PlaneGCS中有四种求解算法:DogLeg、LM、BFGS和SQP,在求解过程中是依次调用的(第一种不行就用第二种),我发现Sketch.cpp中四种算法的调用顺序是DogLeg、LM、BFGS、SQP。请问这样安排算法顺序的原则是什么?是否是排在前面的算法效率更高且适用范围更大呢?
我是一名PlaneGCS的初学者,希望各位大佬多多指教!
我是一名PlaneGCS的初学者,希望各位大佬多多指教!
Re: FreeCAD求解器PlaneGCS的求解算法?
或者说应当如何设计测试用例来测试呢?
Re: FreeCAD求解器PlaneGCS的求解算法?
Re: FreeCAD求解器PlaneGCS的求解算法?
看來是 @abdullah 的範疇,但他應不懂中文_Nemo wrote: ↑Sat Apr 03, 2021 10:50 am 就是FreeCAD使用的几何约束求解器
https://github.com/FreeCAD/FreeCAD/tree ... p/planegcs
試麻煩@realthunder 問一下
realthunder wrote: ping
Re: FreeCAD求解器PlaneGCS的求解算法?
感谢!paullee wrote: ↑Sat Apr 03, 2021 11:37 am
看來是 @abdullah 的範疇,但他應不懂中文
試痲煩@realthunder 問一下
realthunder wrote: ping
-
- Veteran
- Posts: 2190
- Joined: Tue Jan 03, 2017 10:55 am
Re: FreeCAD求解器PlaneGCS的求解算法?
太感谢了,帮助很大!以下是我截取的Sketch.cpp中的一部分代码,应该就是当默认算法失败后转向其他算法依次尝试吧。realthunder wrote: ↑Sun Apr 04, 2021 10:31 am 这个我也不太清楚。不过我想应该不会依次选算法吧?你可以打开算法高级设置自己试下。关于这些算法更多的资料可以参考SciPy文档。不过PlaneCSG并没有使用SciPy,所以可能会有些出入,仅供参考。
Screenshot from 2021-04-04 18-17-08.png
Screenshot from 2021-04-04 18-29-54.png
Code: Select all
if(!valid_solution && !isInitMove) { // Fall back to other solvers
for (int soltype=0; soltype < 4; soltype++) {
if(soltype==defaultsoltype){
continue; // skip default solver
}
switch (soltype) {
case 0:
solvername = "DogLeg";
ret = GCSsys.solve(isFine, GCS::DogLeg);
break;
case 1: // solving with the LevenbergMarquardt solver
solvername = "LevenbergMarquardt";
ret = GCSsys.solve(isFine, GCS::LevenbergMarquardt);
break;
case 2: // solving with the BFGS solver
solvername = "BFGS";
ret = GCSsys.solve(isFine, GCS::BFGS);
break;
case 3: // last resort: augment the system with a second subsystem and use the SQP solver
solvername = "SQP(augmented system)";
InitParameters.resize(Parameters.size());
int i=0;
for (std::vector<double*>::iterator it = Parameters.begin(); it != Parameters.end(); ++it, i++) {
InitParameters[i] = **it;
GCSsys.addConstraintEqual(*it, &InitParameters[i], GCS::DefaultTemporaryConstraint);
}
GCSsys.initSolution();
ret = GCSsys.solve(isFine);
break;
}