FreeCAD求解器PlaneGCS的求解算法?

Chinese forum

Moderator: paullee

Forum rules
论坛规矩 / 論壇規矩 , 有用的资讯 / 有用的資訊
重要:寻求帮助之前,请先看看这里 /
重要:尋求幫助之前,請先看看這裡

另外,对论坛用户 友善!阅读FreeCAD 行为准则!
/ 另外,對論壇用戶 友善! 閱讀FreeCAD
行為準則
_Nemo
Posts: 6
Joined: Sat Feb 06, 2021 8:25 am

FreeCAD求解器PlaneGCS的求解算法?

Postby _Nemo » Fri Apr 02, 2021 6:44 am

PlaneGCS中有四种求解算法:DogLeg、LM、BFGS和SQP,在求解过程中是依次调用的(第一种不行就用第二种),我发现Sketch.cpp中四种算法的调用顺序是DogLeg、LM、BFGS、SQP。请问这样安排算法顺序的原则是什么?是否是排在前面的算法效率更高且适用范围更大呢?
我是一名PlaneGCS的初学者,希望各位大佬多多指教!
_Nemo
Posts: 6
Joined: Sat Feb 06, 2021 8:25 am

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby _Nemo » Fri Apr 02, 2021 8:37 am

或者说应当如何设计测试用例来测试呢?
paullee
Posts: 3348
Joined: Wed May 04, 2016 3:58 pm

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby paullee » Fri Apr 02, 2021 11:32 am

_Nemo wrote:
Fri Apr 02, 2021 6:44 am
PlaneGCS中有四种求解算法:DogLeg、LM、BFGS和SQP ...
甚麼是 PlaneGCS ? :oops:
_Nemo
Posts: 6
Joined: Sat Feb 06, 2021 8:25 am

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby _Nemo » Sat Apr 03, 2021 10:50 am

paullee wrote:
Fri Apr 02, 2021 11:32 am
_Nemo wrote:
Fri Apr 02, 2021 6:44 am
PlaneGCS中有四种求解算法:DogLeg、LM、BFGS和SQP ...
甚麼是 PlaneGCS ? :oops:
就是FreeCAD使用的几何约束求解器 :)
https://github.com/FreeCAD/FreeCAD/tree ... p/planegcs
paullee
Posts: 3348
Joined: Wed May 04, 2016 3:58 pm

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby paullee » Sat Apr 03, 2021 11:37 am

_Nemo wrote:
Sat Apr 03, 2021 10:50 am
就是FreeCAD使用的几何约束求解器 :)
https://github.com/FreeCAD/FreeCAD/tree ... p/planegcs
看來是 @abdullah 的範疇,但他應不懂中文 :)

試麻煩@realthunder 問一下 :D
realthunder wrote: ping
_Nemo
Posts: 6
Joined: Sat Feb 06, 2021 8:25 am

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby _Nemo » Sat Apr 03, 2021 11:49 am

paullee wrote:
Sat Apr 03, 2021 11:37 am

看來是 @abdullah 的範疇,但他應不懂中文 :)

試痲煩@realthunder 問一下 :D
realthunder wrote: ping
感谢! :D
realthunder
Posts: 1954
Joined: Tue Jan 03, 2017 10:55 am

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby realthunder » 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-17-08.png (80.3 KiB) Viewed 312 times
Screenshot from 2021-04-04 18-29-54.png
Screenshot from 2021-04-04 18-29-54.png (53.92 KiB) Viewed 312 times
Try Assembly3 (latest version 0.11) along with my custom build of FreeCAD at here.
And if you'd like to show your support, you can donate through patreon, liberapay, or paypal
_Nemo
Posts: 6
Joined: Sat Feb 06, 2021 8:25 am

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby _Nemo » Tue Apr 06, 2021 2:30 am

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
太感谢了,帮助很大!以下是我截取的Sketch.cpp中的一部分代码,应该就是当默认算法失败后转向其他算法依次尝试吧。

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;
            }
paullee
Posts: 3348
Joined: Wed May 04, 2016 3:58 pm

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby paullee » Tue Apr 06, 2021 6:04 am

_Nemo wrote:
Tue Apr 06, 2021 2:30 am
太感谢了,帮助很大!以下是我截取的Sketch.cpp中的一部分代码,应该就是当默认算法失败后转向其他算法依次尝试吧。
不知道現時是否只是@abdullah 在做Sketcher, 他也不是地道 說英文的,如果你英文 可以 的話可在主論譠上討論一下 :D
_Nemo
Posts: 6
Joined: Sat Feb 06, 2021 8:25 am

Re: FreeCAD求解器PlaneGCS的求解算法?

Postby _Nemo » Wed Apr 07, 2021 12:30 am

paullee wrote:
Tue Apr 06, 2021 6:04 am
不知道現時是否只是@abdullah 在做Sketcher, 他也不是地道 說英文的,如果你英文 可以 的話可在主論譠上討論一下 :D
好的,再次表示感谢! :D