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")上述**先定義了帶有一階偏導數的非線性方程組類:myfunctionset,因為有兩個變數及兩個方程,再分別實現計算方程值及偏導數的虛函式。#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**)
然後使用類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日 現在 我的面前時一堆白紙黑字,那麼多人的心情要我體會,那麼多人的思考要我識辨,然後用最準確的方式寫在卷子上,署上我的名字,接下來的考試,就是這個形式,似乎到了大學也就考試的時候享受那種筆力風劍的刀光血影了,寫完是一陣得酣暢淋漓,寫之前是一陣得鬧心。寫作是文人的生活...