青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE Root-Finding Algorithm

Posted on 2014-10-21 19:06 eryar 閱讀(3449) 評論(2)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Root-Finding Algorithm

eryar@163.com

Abstract. A root-finding algorithm is a numerical method, or algorithm, for finding a value x such that f(x)=0, for a given function f. Such an x is called a root of the function f. In OpenCASCADE math package, implemente Newton-Raphson method to find the root for a function. The algorithm can be used for finding the extrema value for curve or surface, .i.e Point Inversion, find the parameter for a point on the curve or surface. The paper focus on the usage of OpenCASCADE method and its application.

Key Words. OpenCASCADE, Extrema, Newton-Raphson, Root-Finding, FunctionRoot

1. Introduction

代數方程求根問題是一個古老的數學問題,早在16世紀就找到了三次、四次方程的求根公式。但直到19世紀才證明n>=5次的一般代數方程式不能用代數公式求解。在工程和科學技術中,許多問題常常歸結為求解非線性方程的問題,因此,需要研究用數值方法求得滿足一定精度的代數方程式的近似解。

我國古代宋朝數學家秦九韶在他1247年所著的《數書九章》中,給出一個求代數方程根的近似方法,這個方法一般書上都稱為和納Horner方法(英國數學家W.G.Horner)。實際上Horner在1819年才提出這個方法,比秦九韶晚五百多年。每當看到教科書中這樣的介紹不知是該驕傲,還是該嗤之以鼻。古人發明創造的東西比外國人早,而現在國內用于CAD、CAM的軟件大都是國外進口的,像CATIA,AutoCAD,Pro/E,UG NX,SolidWorks,AVEVA Plant/Marine,Intergraph,ACIS,Parasolid……等等不勝枚舉,很少看到中國軟件的身影。而這些軟件廣泛應用于航空、造船、機械設計制造、工廠設計等各個行業,每年的軟件授權費用不知幾何?衷心希望當代國人奮發作為,為世界增添色彩。

閑話少說,本文主要關注非線性方程的數值解法,重點介紹了Newton-Rophson法及在OpenCASCADE中應用,即求點到曲線曲面的極值,也就是曲線曲面點的反求參數問題。對數值算法感興趣的讀者,可以參考《數值分析》、《計算方法》之類的書籍以獲取更詳細信息。

2.Numerical Methods

方程求根的方法有很多,在《數學手冊》中列舉了如下一些方法:

v 秦九韶法;

v 二分法;

v 迭代法;

v 牛頓法Newton’s Method;

v 弦截法;

v 拋物線法;

v 林士諤-趙訪熊法;

其中二分法是求實根的近似計算中行之有效的最簡單的方法,它只要求函數是連續的,因此它的使用范圍很廣,并便于在計算機上實現,但是它不能求重根也不能求虛根,且收斂較慢。

Newton法在單根鄰近收斂快,具有二階收斂速度,但Newton法對初值要求比較苛刻,即要求初值選取充分靠近方程的根,否則Newton法可能不收斂。擴大初值的選取范圍,可采用Newton下山法。

Newton’s Method的實現原理的演示動畫如下圖所示:

http://upload.wikimedia.org/wikipedia/commons/e/e0/NewtonIteration_Ani.gif

Figure 2.1 Newton’s Method(Newton-Raphson) 

由上面的動畫可以清楚理解Newton法的原理。用數學的文字描述如下:設f(x)二次連續可導,xk是f(x)=0的第k次近似解。我們用曲線y=f(x)過點(xk,yk)的切線Lk:

wps_clip_image-14907

來近似曲線f(x)。取Lk與X軸的交點為f(x)=0的第k+1次近似解為:

wps_clip_image-17600

wps_clip_image-25907

Figure 3.2 Newton-Raphson Method

其中:

wps_clip_image-29445

稱為Newton公式。

Newton法對初值x0要求苛刻,在實際應用中往往難以滿足。Newton下山法是一種降低對初值要求的修正Newton法。

關于Newton方法的公開課的視頻我找到網易上有節課,介紹了Newton方法的原理及用法,網址為:http://v.163.com/movie/2006/8/T/V/M6GLI5A07_M6GLLGSTV.html,在后半部分。老師用實際例子來講解還挺有意思的,感興趣的讀者也可以完整地看看,也可復習下微積分的知識點。

3.OpenCASCADE Function Root

OpenCASCADE的math包中實現了方程求根的算法,相關的類有math_FunctionRoot,math_FunctionRoots,math_NewtonFunctionRoot等。在《Fundation Classes User’s Guide》中有對通用數學算法的介紹,即OpenCASCADE中實現了常見的數學算法:

v 求解線性代數方程的根的算法;

v 查找方程極小值的算法;

v 查找非線性方程(組)的根;

v 查找對角矩陣的特征值及特征向量的算法;

所有的數學算法以相同的方式來實現,即:在構造函數中來做大部分的計算,從而給出適當的參數。所有相關數據都保存到結果對象中,因此所有的計算盡量以最高效的方式來求解。函數IsDone()表明計算成功。如下所示分別為采用不同的算法來計算如下方程在[0,2]區間上的根:

wps_clip_image-11905

實現程序代碼如下所示:

 

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2014-10-20 18:52
*        Version : 1.0v
*
*    Description : Test OpenCASCADE function root algorithm.
*
*      Key words : OpenCASCADE, Newton-Raphson, Root-Finding Algorithm, FunctionRoot
*/

#define WNT

#include 
<Precision.hxx>

#include 
<math_FunctionWithDerivative.hxx>

#include 
<math_BissecNewton.hxx>
#include 
<math_FunctionRoot.hxx>
#include 
<math_NewtonFunctionRoot.hxx>

#pragma comment(lib, 
"TKernel.lib")
#pragma comment(lib, 
"TKMath.lib")

class TestFunction : public math_FunctionWithDerivative
{
public:
    
virtual Standard_Boolean Value(const Standard_Real X, Standard_Real& F)
    {
        F 
= pow(X, 6- X - 1;

        
return Standard_True;
    }

    
virtual Standard_Boolean Derivative(const Standard_Real X, Standard_Real& D)
    {
        D 
= 6 * pow(X, 5- 1;

        
return Standard_True;
    }

    
virtual Standard_Boolean Values(const Standard_Real X, Standard_Real& F, Standard_Real& D)
    {
        Value(X, F);

        Derivative(X, D);

        
return Standard_True;
    }
};

void TestFunctionRoot(void)
{
    TestFunction aFunction;

    math_FunctionRoot aSolver1(aFunction, 
1.50.00.02.0);

    math_BissecNewton aSolver2(aFunction, 
0.02.00.0);

    math_NewtonFunctionRoot aSolver3(aFunction, 
1.5, Precision::Confusion(), Precision::Confusion());

    std::cout 
<< aSolver1 << std::endl;
    std::cout 
<< aSolver2 << std::endl;
    std::cout 
<< aSolver3 << std::endl;
}

int main(int argc, char* argv[])
{
    TestFunctionRoot();

    
return 0;
}

由上述代碼可知,要想使用求根算法,必須從math_FunctionWithDerivative派生且重載其三個純虛函數Value(), Derivative(), Values(),在這三個純虛函數中計算相關的值及導數值即可。所以實際使用時,正確重載這三個函數是正確使用求根算法的關鍵。

求根用了三個不同的類,即三種方法來實現:

v math_FunctionRoot:即Newton-Raphson法;

v math_BissecNewton:是Newton-Raphson和二分法的組合算法;

v math_NewtonFunctionRoot:Newton Method;

計算結果如下圖所示:

wps_clip_image-30180

Figure 3.1 Root-Finding result of OpenCASCADE

由計算結果可知,三種方法計算的結果相同,都是1.13472,與書中結果吻合。但是math_NewtonFunctionRoot的迭代次比math_FunctionRoot多一次,且計算精度要低很多。

使用math_BissecNewton求根不用設置初始值,比較方便,精度與math_FunctionRoot一致。

4.Application

在工程和科學技術中,許多問題常常歸結為求解非線性方程的問題。在OpenCASCADE中的應用更多了,從下面一張類圖可見一斑:

wps_clip_image-30754

Figure 4.1 math_FunctionWithDerivative class diagram

由圖可知,從類math_FunctionWithDerivative派生出了很多可導函數的類,這些函數都可用于求根的類中,從而計算出對應方程的根。

下面給出一個實際應用,即曲線曲面上點的反求問題,來說明如何應用上述求根算法來解決實際的問題。由于曲線曲面的參數表示法,通過參數u或(u,v)可以方便地求出曲線上的點或曲面上的點。若給定一個點P(x,y,z),假設它在p次NURBS曲線C(u)上,求對應的參數u’使得C(u’)=P,這個問題稱為點的反求(point inverse)。在OpenCASCADE中提供了簡單的函數接口來實現點的反求,使用類為GeomLib_Tool:

wps_clip_image-22117

如何將點的反求問題歸結為方程求根的問題,就要根據條件來建立方程了。一種簡單并完全可以解決這一問題的方法是:利用Newton迭代法來最小化點P和C(u)的距離,如下圖所示。如果最小距離小于一個事先指定的精度值,則認為點P在曲線上。這種方法有效地解決了更一般的“點在曲線上的投影”的問題。

因為方程求根的Newton方法需要指定初值u0,所以可按如下方法得到一個用于Newton法的初值u0:

v 如果已知點P在給定精度內位于曲線上,則用強凸包性確定候選的段,對于一般的點到曲線的投影問題,則選擇所要的段作為候選段;

v 在每個候選段上,計算n個按參數等間隔分布的點。計算出所有這些點和點P的距離,選擇其中距點P最近的點的參數作為u0。點數n一般利用某種啟發的方法來選擇。

wps_clip_image-529

Figure 4.2 Point projection and Point inversion

需要強調的是使用Newton方法,一個好的初值對于迭代的收斂性及收斂速度是非常重要的。現在假設已經確定了初值u0,利用數量積定義函數:

wps_clip_image-2914

不管P點是否位于曲線上,當f(u)=0時,點P到C(u)的距離達到最小。對f(u)求導得:

wps_clip_image-27493

代入Newton迭代公式得:

wps_clip_image-13481

在OpenCASCADE中曲線點的反求主要是使用了派生自math_FunctionWithDerivative的類Extrema_PCFOfEPCOfExtPC,類圖如下所示:

wps_clip_image-17760

Figure 4.3 class diagram for point inverstion

所以需要實現三個純虛函數Value(), Derivative(), Values(),將其實現代碼列出如下所示:

 

Standard_Boolean Extrema_FuncExtPC::Value (const Standard_Real U, Standard_Real& F)
{
  
if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
  myU 
= U;
  Vec D1c;
  Tool::D1(
*((Curve*)myC),myU,myPc,D1c);
  Standard_Real Ndu 
= D1c.Magnitude();
  
if (Ndu <= Tol) { // Cas Singulier (PMN 22/04/1998)
    Pnt P1, P2;
    P2 
= Tool::Value(*((Curve*)myC),myU + delta);
    P1 
= Tool::Value(*((Curve*)myC),myU - delta);
    Vec V(P1,P2);
    D1c 
= V;
    Ndu 
= D1c.Magnitude();
    
if (Ndu <= Tol) {
      Vec aD2;
      Tool::D2(
*((Curve*)myC),myU,myPc,D1c,aD2);    
      Ndu 
= aD2.Magnitude();
     
      
if(Ndu  <= Tol)
       
return Standard_False;
      D1c 
= aD2;    
    }
  }
  
  Vec PPc (myP,myPc);
  F 
= PPc.Dot(D1c)/Ndu;
  
return Standard_True;
}
//=============================================================================

Standard_Boolean Extrema_FuncExtPC::Derivative (
const Standard_Real U, Standard_Real& D1f)
{
  
if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
  Standard_Real F;
  
return Values(U,F,D1f);  /* on fait appel a Values pour simplifier la
                  sauvegarde de l'etat. 
*/
}
//=============================================================================

Standard_Boolean Extrema_FuncExtPC::Values (
const Standard_Real U, Standard_Real& F, Standard_Real& D1f)
{
  
if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
  myU 
= U;
  Vec D1c,D2c;
  Tool::D2(
*((Curve*)myC),myU,myPc,D1c,D2c);

  Standard_Real Ndu 
= D1c.Magnitude();
  
if (Ndu <= Tol) {// Cas Singulier (PMN 22/04/1998)
    Pnt P1, P2;
    Vec V1;
    Tool::D1(
*((Curve*)myC),myU+delta, P2, V1);
    Tool::D1(
*((Curve*)myC),myU-delta, P1, D2c);
    Vec V(P1,P2);
    D1c 
= V;
    D2c 
-= V1;
    Ndu 
= D1c.Magnitude();
    
if (Ndu <= Tol) {
      myD1Init 
= Standard_False;
      
return Standard_False;
    }
  }
  
  Vec PPc (myP,myPc);
  F 
= PPc.Dot(D1c)/Ndu;
  D1f 
= Ndu + (PPc.Dot(D2c)/Ndu) - F*(D1c.Dot(D2c))/(Ndu*Ndu);

  myD1f 
= D1f;
  myD1Init 
= Standard_True;
  
return Standard_True;
}

根據代碼可知,實現原理與上述一致。下面給出一個簡單的例子,來說明及方便調試點的反求算法。示例程序代碼如下所示:

 

/*
*    Copyright (c) 2014 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2014-10-20 18:52
*        Version : 1.0v
*
*    Description : Test OpenCASCADE function root algorithm.
*
*      Key words : OpenCascade, Extrema, Newton's Method
*/

#define WNT

#include 
<math_FunctionRoots.hxx>
#include 
<math_NewtonFunctionRoot.hxx>

#include 
<Extrema_PCFOfEPCOfExtPC.hxx>

#include 
<GC_MakeCircle.hxx>

#include 
<GeomAdaptor_Curve.hxx>

#pragma comment(lib, 
"TKernel.lib")
#pragma comment(lib, 
"TKMath.lib")
#pragma comment(lib, 
"TKG3d.lib")
#pragma comment(lib, 
"TKGeomBase.lib")


void TestExtrema(void)
{
    Handle_Geom_Curve aCircle 
= GC_MakeCircle(gp::XOY(), 2.0);

    GeomAdaptor_Curve aCurve(aCircle);

    Extrema_PCFOfEPCOfExtPC aFunction(aCircle
->Value(0.123456789), aCurve);

    math_FunctionRoots aSolver1(aFunction, 
-2.02.010);
    math_NewtonFunctionRoot aSolver2(aFunction, 
0.00.00.0);

    aSolver1.Dump(std::cout);
    std::cout 
<< "========================================" << std::endl;
    aSolver2.Dump(std::cout);
}

int main(int argc, char* argv[])
{
    TestExtrema();

    
return 0;
}

根據圓上一點,求出對應的參數值,計算結果如下所示:

wps_clip_image-5220

5.Conclusion

Newton法可以選作對導數能有效求值,且導數在根的鄰域中連續的任何函數方程的求根方法。Newton法在單根鄰近收斂快,精度高,具有二階收斂速度,但Newton法對初值要求比較高,即要求初值選取充分靠近方程的根,否則Newton法可能不收斂。

OpenCASCADE的math包中提供了求根的幾種實現算法,雖然代碼有些亂,但是這種抽象的思想還是相當不錯的,便于擴展應用。理解了math_FunctionRoot的算法,進而可以理解從math_FunctionWithDerivative派生的類的原理了。

通過曲線上點的反求問題引出使用求根算法的具體實例,從中可以看出關鍵還是要將實際問題抽象成一個方程。有了方程,根據Newton迭代公式,求出相應的值和導數值,就可以得到方程的高精度的根了。

對數值算法感興趣的讀者,可以參考《計算方法》、《數值分析》等相關書籍,從而可以在理解OpenCASCADE的代碼的基礎上,可以自己來實現相關算法。

6. References

1. 數學手冊編寫組. 數學手冊. 高等教育出版社. 1979

2. 趙罡,穆國旺,王拉柱譯. 非均勻有理B樣條. 清華大學出版社. 2010

3. Les Piegl, Wayne Tiller. The NURBS Book. Springer-Verlag. 1997

4. 易大義,沈云寶,李有法編. 計算方法. 浙江大學出版社. 2002

5. 易大義,陳道琦編. 數值分析引論. 浙江大學出版社. 1998

6. 李慶楊,王能超,易大義.數值分析.華中理工大學出版社. 1986

7. 同濟大學數學教研室. 高等數學(第四版). 高等教育出版社. 1996

8. Newton's Method video: 

http://v.163.com/movie/2006/8/T/V/M6GLI5A07_M6GLLGSTV.html

9. http://en.wikipedia.org/wiki/Root-finding_algorithm

10. http://mathworld.wolfram.com/Root-FindingAlgorithm.html

11. http://mathworld.wolfram.com/NewtonsMethod.html

 

Feedback

# re: OpenCASCADE Root-Finding Algorithm[未登錄]  回復  更多評論   

2014-10-22 09:12 by 哈哈
樓豬我看好你

# re: OpenCASCADE Root-Finding Algorithm  回復  更多評論   

2014-10-22 10:05 by eryar
@哈哈

:-)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品九九99久久| 欧美freesex交免费视频| 欧美在线观看一区| 一本色道久久精品| 欧美视频一区在线| 欧美一区二区三区视频免费| 日韩亚洲欧美中文三级| 欧美日韩精品免费| 亚洲欧美日韩国产综合| 亚洲欧美国产另类| 国内精品嫩模av私拍在线观看| 久久一区欧美| 欧美伦理91i| 欧美影院在线| 欧美国产日韩精品| 欧美一区国产二区| 欧美黑人多人双交| 欧美激情国产日韩| 亚洲免费一在线| 91久久极品少妇xxxxⅹ软件| 国产欧美日韩视频一区二区三区| 狠狠色丁香久久婷婷综合丁香| 午夜精品久久99蜜桃的功能介绍| 亚洲精品在线三区| 国产午夜精品全部视频在线播放| 久久精品亚洲热| 欧美日本高清视频| 久久青草福利网站| 欧美日韩成人综合| 久久躁狠狠躁夜夜爽| 欧美片第1页综合| 亚洲无人区一区| 欧美视频一二三区| 亚洲欧美日韩区| 久久久综合视频| 国产精品一区二区在线观看不卡 | 欧美性生交xxxxx久久久| 欧美黑人多人双交| 亚洲精品色婷婷福利天堂| 蜜桃久久精品乱码一区二区| 免费国产一区二区| 免费在线观看成人av| 亚洲成人在线视频播放 | 久久精品99国产精品| 久久久久久久999| 亚洲高清av| 国产精品扒开腿做爽爽爽软件 | 欧美三级网页| 欧美一区二区免费视频| 麻豆精品91| 午夜在线电影亚洲一区| 91久久久在线| 国产日本欧美一区二区三区在线| 久久亚洲春色中文字幕久久久| 亚洲日本在线观看| 久久成人精品无人区| 一本色道久久综合亚洲91| 国内成人精品视频| 国产精品三级久久久久久电影| 蜜臀av在线播放一区二区三区| 亚洲欧美资源在线| 一区二区三区精品视频在线观看 | 欧美成人嫩草网站| 欧美一区二区在线免费观看 | 久久频这里精品99香蕉| 亚洲图片欧美日产| 一区二区三区偷拍| 99国产一区二区三精品乱码| 亚洲国产综合在线看不卡| 久热国产精品| 久久婷婷综合激情| 久久尤物电影视频在线观看| 久久av资源网站| 久久男人资源视频| 蜜臀av一级做a爰片久久| 蜜桃视频一区| 亚洲人妖在线| 亚洲一二三四区| 欧美专区福利在线| 久久影院亚洲| 欧美日韩天堂| 国产精品毛片一区二区三区| 国产精品国产三级国产专播精品人 | 欧美日韩国产小视频在线观看| 欧美激情国产精品| 国产精品多人| 在线观看亚洲精品视频| 亚洲精品久久久久久久久久久久| 亚洲精品一区二| 久久国产精品黑丝| 亚洲电影第1页| 亚洲伊人伊色伊影伊综合网| 久久久久久久久一区二区| 欧美日本一区二区高清播放视频| 国产精品剧情在线亚洲| 亚洲电影观看| 免费欧美日韩| 亚洲国产欧美久久| 久久久久国产一区二区| 在线日韩电影| 免费观看日韩av| 欧美福利小视频| 亚洲自拍都市欧美小说| 亚洲电影免费观看高清完整版在线| 亚洲一级黄色av| 欧美日韩在线电影| 一本不卡影院| 亚洲成人直播| 欧美日韩成人综合天天影院| 亚洲国产专区校园欧美| 久久亚洲一区二区三区四区| 午夜老司机精品| 国产无遮挡一区二区三区毛片日本| 亚洲一区二区三区成人在线视频精品 | 免费国产自线拍一欧美视频| 欧美高清在线| 久久精品一区二区三区不卡牛牛| 欧美日韩免费网站| 亚洲精品社区| 亚洲精品国久久99热| 欧美日韩精品福利| 亚洲制服欧美中文字幕中文字幕| 亚洲国产二区| 欧美日韩免费区域视频在线观看| 亚洲乱码国产乱码精品精98午夜 | 在线亚洲欧美| 国产精品国产三级国产专播品爱网 | 亚洲在线视频观看| 国产精品素人视频| 亚洲欧洲日产国产网站| 欧美日韩亚洲一区二区| 一二三四社区欧美黄| 91久久夜色精品国产九色| 欧美激情综合网| 亚洲一区三区电影在线观看| 亚洲综合精品自拍| 亚洲精选大片| 久久av二区| 一本久道久久综合婷婷鲸鱼| 亚洲一区二区在线| 好吊妞这里只有精品| 亚洲欧洲综合另类| 狠狠色伊人亚洲综合成人| 亚洲精品国产精品乱码不99按摩 | 亚洲最新视频在线| 亚洲综合电影| 中文在线不卡| 久久亚洲精品视频| 亚洲欧美日韩人成在线播放| 亚洲国产精品一区二区第四页av | 一区二区高清在线观看| 一区二区三区久久久| 亚洲日本视频| 美女主播一区| 免费不卡欧美自拍视频| 国产欧美一区二区精品仙草咪 | 亚洲在线中文字幕| 亚洲一区二区视频在线| 中文在线资源观看网站视频免费不卡 | 亚洲天堂网在线观看| 日韩视频在线播放| 欧美大片在线影院| 亚洲电影自拍| 99精品国产一区二区青青牛奶| 欧美成人国产一区二区| 欧美激情五月| 99国产精品私拍| 欧美视频一区在线| 亚洲欧美成人网| 久久精品成人一区二区三区蜜臀| 国产精品尤物| 免费中文字幕日韩欧美| 欧美国产精品劲爆| 99riav1国产精品视频| 欧美三级电影一区| 亚洲综合精品| 欧美大胆人体视频| 欧美永久精品| 亚洲天堂av在线免费观看| 国产在线视频欧美一区二区三区| 久久久一区二区| 亚洲永久在线| 欧美电影在线观看完整版| 亚洲一区二区三区免费视频| 国产日韩欧美在线播放| 欧美成人a视频| 午夜免费电影一区在线观看| 亚洲高清一区二| 免播放器亚洲一区| 香蕉视频成人在线观看| 在线中文字幕日韩| 国产日韩欧美黄色| 欧美精品日韩三级| 亚洲新中文字幕| 久久综合五月| 国产精品久久激情| 久久九九热re6这里有精品| 久久夜色精品一区| 国产一区美女| 欧美日韩国产精品|