OpenCASCADE解非線性方程組

2021-09-07 08:48:35 字數 3496 閱讀 2355

[email protected]

abstract.在科學技術領域裡常常提出求解非線性方程組的問題,例如,用非線性函式擬合實驗資料問題、非線性網路問題、幾何上的曲線曲面求交問題等。opencascade中有關於非線性方程組定義的類及其求解類,本文主要介紹如何在opencascade中定義非線性方程組,及對其進行求解。

key words.function set, function set root, newton raphson algorithm

在科學技術領域裡常常提出求解非線性方程組的問題,例如,用非線性函式擬合實驗資料問題、非線性網路問題等。在幾何造型中很多問題也可以利用非線性方程組來解決。如曲線的光順,曲線求交、曲面求交、blend造型問題等。

opencascade提供了非線性方程組的類math_functionset,可以先從類圖上來看看有哪些演算法使用了這個類:

圖1 曲線光順包fairecurve

圖2 blending su***ce between two su***ces

感興趣的同學可以自己開啟opencascade的類索引檔案檢視。可以看到很多演算法涉及到方程組的求解問題。本文主要介紹如何定義非線性方程組及對其進行求解。理解這些套路後,對math_functionset相關的派生類及其用用途就會有個清晰的認識,便於對原始碼的理解。

設有非線性方程組

為實變數的非線方程函式。引入向量形式表示,引進記號:

於是非線性方程組可以簡單記作:f(x)=0。我們的問題是尋求x使f(x)=0,這個x就是非線性方程組的解。

opencascade中使用類math_functionset來表示方程組,這是個抽象類,定義了如下純虛函式:

l nbvariables():變數的個數,即末知量的個數;

l nbequations():方程的個數,即方程組中有幾個方程;

l value(const math_vector&x, math_vector& f):方程組的值,即代入變數每個方程的值;

解非線性方程組的牛頓法和解方程式的思路一樣,要求方程有一階導數。而非線性方程組即是要求有偏導數。由fi(x)偏導數作成的矩陣記為j(x)或f』(x),稱為f(x)的jacobi矩陣:

求解非線性方程組的牛頓法為:

其中xk為方程線的近似解向量。

opencascade中也提供了非線性方程組的求解類,如:math_functionsetroot,math_newtonfunctionsetroot。而使用這些類的輸入都是要求具有一階偏導數的線性方程組的定義math_functionsetwithderivaties。這個類定義了具有一階偏導數的非線性方程組,其純虛函式除了前面說明的幾個以外,還增加了如下兩個:

l derivatives(const math_vector& x, math_matrix& d):一階偏導數值,即計算jacobi矩陣;

l values(const math_vector& x, math_vector& f, math_matrix& d):計算方程的值及一階偏導數矩陣jacobi矩陣。

下面給出乙個具體的例子來說明這些類的用法。設有非線性方程組:

從幾何上看其解就是圓心在原點,半徑為2的圓與曲線的交點:

圖3 圓與曲線求交

下面我們使用opencascade來對上述問題進行求解。首先定義這個非線性方程組: 

#include #include #include #pragma comment(lib, "tkernel.lib")

#pragma comment(lib, "tkmath.lib")

class myfunctionset : public math_functionsetwithderivatives

virtual standard_integer nbequations() const

virtual standard_boolean value(const math_vector& x, math_vector& f)

virtual standard_boolean derivatives(const math_vector& x, math_matrix& d)

virtual standard_boolean values(const math_vector& x, math_vector& f, math_matrix& d)

private:

};void test()

// 2. (1.0, -1.0)

astartingpoint(1) = 1.0;

astartingpoint(2) = -1.0;

asolver.perform(afunctionset, astartingpoint);

if (asolver.isdone())

}int main(int argc, char* ar**)

上述**先定義了帶有一階偏導數的非線性方程組類:myfunctionset,因為有兩個變數及兩個方程,再分別實現計算方程值及偏導數的虛函式。

然後使用類math_functionsetroot來對方程組進行求解,求解的結果如下圖所示:

圖4 非線性方程組求解結果

由圖3可知,兩個曲線相交有兩個交點,但是使用類math_functionsetroot一次只能計算乙個解。從圖4的計算結果還可以看出,初值的選擇對解的影響很大,既影響計算結果,也影響迭代次數。

綜上所述,opencascade的math工具箱中提供了方程組的定義、求解功能。其中對非線性方程組求解使用的是newton迭代法,所以要求方程組必須實現計算一階偏導數的虛函式,即計算jacobi矩陣。

從opencascade類圖中可以看出,方程組定義類用在了很多地方,所以理解上述對方程組的定義及解的用法,對其他使用這個派生類的地方更容易其原始碼。

同濟大學數學教研室. 高等數學 第四版. 高等教育出版社. 2004

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

線性與非線性

就是變數是一次的就叫做線性,否則就是非線性。不過每個具體問題都不盡相同。1.比如線性函式,就是自變數都是一次的,f x1,x2,xn a0 a1x1 a2x2 anxn 線性 與 非線性 常用於區別函式y f x 對自變數x的依賴關係。線性函式即一次函式,其影象為一條直線。其它函式則為非線性函式,其...

非線性優化

問題的一般表達 x 是 n 維實向量 x x x t in r n,s是 r n 的子集,f 0 x f m x 是x相關的實值函式。我們所要解決的主要是以下最小問題的變體 min f 0 x s.t.f j x 0,j 1.m,x in s,其中 可以是 geq,leq or f 0 是問題的目標...

時間非線性

時間非線性 2011年12月31日 現在 我的面前時一堆白紙黑字,那麼多人的心情要我體會,那麼多人的思考要我識辨,然後用最準確的方式寫在卷子上,署上我的名字,接下來的考試,就是這個形式,似乎到了大學也就考試的時候享受那種筆力風劍的刀光血影了,寫完是一陣得酣暢淋漓,寫之前是一陣得鬧心。寫作是文人的生活...