c語言曲面擬合
❶ matlab 散點擬合三維曲面寫出曲面表達式
為了直觀表達我們所求的結果,我們喜歡用圖像來表達。對於圖像來說分類很多,如散點圖,連續圖,等高圖等等。往往我們習慣把理論圖像和模擬圖像畫在同一個圖像,用來區分理論和模擬的吻合程度。
開啟分步閱讀模式
工具材料:
matlab
操作方法
01
scatter(X,Y,S,C),這是matlab畫散點圖的命令;這里X,Y是畫散點圖的數據。 其中S為大小,系統默認大小為50,C表示所畫圖的顏色。
02
x=1:0.05:10;
.
scatter(x,sin(x),100,'r')
.
.
.
這里通過散點畫的是一個sinx 的圖像,這里100表示所畫圖像點的大小,r代表標記散點的顏色。
03
scatter(X,Y)這個是默認畫散點圖的方法,一切設置按系統默認!X,Y表示散點圖的X,Y坐標。下圖的命令。
x=1:0.05:10;
scatter(x,cos(x))
04
scatter(X,Y,S) 這里所畫的散點圖,可以調節對應的大小。也就是說可以通過S這個參數調節標記點的大小。下圖是我們將S=1000設置為1000的圖像。scatter(...,M)更改標記的圖形,默認是圓圈標記。如果需要用其他符號標記可以在這里修改。
scatter(...,'s') ;通過方形標記。
注意別忘了添加單引號。
02
scatter(...,'filled') 通過實心圖像來標記。 前面的介紹中,一直是空心符號標記的。
03
scatter3: 立體散點圖的畫法,具體命令如下。
[x,y,z] = sphere(16);
X = [x(:)*.5 x(:)*.75 x(:)];
Y = [y(:)*.5 y(:)*.75 y(:)];
Z = [z(:)*.5 z(:)*.75 z(:)];
S = repmat([1 .75 .5]*10,numel(x),1);
C = repmat([1 2 3],numel(x),1);
scatter3(X(:),Y(:),Z(:),S(:),C(:),'filled'), view(-60,60)
❷ 如何用matlab進行多元非線性擬合
matlab擬合工具箱cftool
%擬合數據曲線;線性最小二乘法是解決曲線擬合的最常用的方法,
%1、多項式擬合函數;p=polyfit(x,y,n);求p擬合函數在xi處的近似值pi=polyval(p,xi);
%2、利用常用矩陣的除法解決復雜函數的擬合;
%3、利用lsqcurvefit函數和lsqnonlin函數擬合;
%4、利用cftool工具箱,自定義編寫函數再通過M文件導出的形式
http://phylab.fudan.e.cn/doku.php?id=howtos:matlab:mt1-5
http://hi..com/zzz700/blog/item/f313a3f5869659b5a40f52d7.html英文參考
一、 單一變數的曲線逼近
Matlab有一個功能強大的曲線擬合工具箱 cftool ,使用方便,能實現多種類型的線性、非線性曲線擬合。下面結合我使用的 Matlab R2007b 來簡單介紹如何使用這個工具箱。
假設我們要擬合的函數形式是 y=A*x*x + B*x, 且A>0,B>0。
1、在命令行輸入數據:
》x=[110.3323 148.7328 178.064 202.8258033 224.7105 244.5711 262.908 280.0447 296.204 311.5475];
》y=[5 10 15 20 25 30 35 40 45 50];
2、啟動曲線擬合工具箱
》cftool
3、進入曲線擬合工具箱界面「Curve Fitting tool」
(1)點擊「Data」按鈕,彈出「Data」窗口;
(2)利用X data和Y data的下拉菜單讀入數據x,y,可修改數據集名「Data set name」,然後點擊「Create data set」按鈕,退出「Data」窗口,返回工具箱界面,這時會自動畫出數據集的曲線圖;
(3)點擊「Fitting」按鈕,彈出「Fitting」窗口;
(4)點擊「New fit」按鈕,可修改擬合項目名稱「Fit name」,通過「Data set」下拉菜單選擇數據集,然後通過下拉菜單「Type of fit」選擇擬合曲線的類型,工具箱提供的擬合類型有:
Custom Equations:用戶自定義的函數類型
Exponential:指數逼近,有2種類型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x)
Fourier:傅立葉逼近,有7種類型,基礎型是 a0 + a1*cos(x*w) + b1*sin(x*w)
Gaussian:高斯逼近,有8種類型,基礎型是 a1*exp(-((x-b1)/c1)^2)
Interpolant:插值逼近,有4種類型,linear、nearest neighbor、cubic spline、shape-preserving
Polynomial:多形式逼近,有9種類型,linear ~、quadratic ~、cubic ~、4-9th degree ~
Power:冪逼近,有2種類型,a*x^b 、a*x^b + c
Rational:有理數逼近,分子、分母共有的類型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子還包括constant型
Smoothing Spline:平滑逼近(翻譯的不大恰當,不好意思)
Sum of Sin Functions:正弦曲線逼近,有8種類型,基礎型是 a1*sin(b1*x + c1)
Weibull:只有一種,a*b*x^(b-1)*exp(-a*x^b)
選擇好所需的擬合曲線類型及其子類型,並進行相關設置:
——如果是非自定義的類型,根據實際需要點擊「Fit options」按鈕,設置擬合演算法、修改待估計參數的上下限等參數;
——如果選Custom Equations,點擊「New」按鈕,彈出自定義函數等式窗口,有「Linear Equations線性等式」和「General Equations構造等式」兩種標簽。
在本例中選Custom Equations,點擊「New」按鈕,選擇「General Equations」標簽,輸入函數類型y=a*x*x + b*x,設置參數a、b的上下限,然後點擊OK。
(5)類型設置完成後,點擊「Apply」按鈕,就可以在Results框中得到擬合結果,如下例:
general model:
f(x) = a*x*x+b*x
Coefficients (with 95% confidence bounds):
a = 0.009194 (0.009019, 0.00937)
b = 1.78e-011 (fixed at bound)
Goodness of fit:
SSE: 6.146
R-square: 0.997
Adjusted R-square: 0.997
RMSE: 0.8263
同時,也會在工具箱窗口中顯示擬合曲線。
這樣,就完成一次曲線擬合啦,十分方便快捷。當然,如果你覺得擬合效果不好,還可以在「Fitting」窗口點擊「New fit」按鈕,按照步驟(4)~(5)進行一次新的擬合。
不過,需要注意的是,cftool 工具箱只能進行單個變數的曲線擬合,即待擬合的公式中,變數只能有一個。對於混合型的曲線,例如 y = a*x + b/x ,工具箱的擬合效果並不好。下一篇文章我介紹幫同學做的一個非線性函數的曲線擬合。
上邊對cftool工具箱做了很詳盡的說明,但並沒有對各種曲線擬合的性能做點評,在單變數曲線擬合中,如何選取一種最優化的擬合方式是非常重要的,我們在採用CFTOOL擬合後,會有一些性能說明,如:
Goodness of fit:
SSE: 6.146
R-square: 0.997
Adjusted R-square: 0.997
RMSE: 0.8263
官方的解釋:
Results -- Displays detailed results for the current fit including the fit type (model, spline, or interpolant), the fitted coefficients and 95% confidence bounds for parametric fits, and these goodness of fit statistics:
SSE -- The sum of squares e to error. This statistic measures the deviation of the responses from the fitted values of the responses. A value closer to 0 indicates a better fit.
R-square -- The coefficient of multiple determination. This statistic measures how successful the fit is in explaining the variation of the data. A value closer to 1 indicates a better fit.
Adjusted R-square -- The degree of freedom adjusted R-square. A value closer to 1 indicates a better fit. It is generally the best indicator of the fit quality when you add additional coefficients to your model.
RMSE -- The root mean squared error. A value closer to 0 indicates a better fit.
Matlab曲面擬合和插值 AAAAAAAAAAA風雲博客
http://xiaoqiang851224.blog.163.com/blog/#m=0&t=1&c=fks_
http://suhao198706.blog.163.com/blog/static/62173403201121095512602/?fromdm&fromSearch&isFromSearchEngine=yes
Matlab曲線擬合
http://xiaoqiang851224.blog.163.com/blog/static/30247003201153083539419/?fromdm&fromSearch&isFromSearchEngine=yes
多項式擬合函數polyfit之C語言的源碼
http://xiaoqiang851224.blog.163.com/blog/static/30247003201010251055758/
matlab二元函數擬合;
http://..com/question/141374449.html?fr=qrl&cid=93&index=2
matlab非線性擬合1(指數函數)
http://apps.hi..com/share/detail/43922314
❸ origin曲面擬合哪個精確
origin曲面擬合表格精確。
將數據粘貼至origin的表格處。雖然兩個軟體的擬合原理一樣,但迭代次數的不同,需要達到的結果精度要求不同等均會導致結果的差異。若擬合的各種參數設定均一致,則結果必定相同。兩個軟體沒什麼優劣之分,結果都可選用。
界面:
Origin是一個具有電子數據表前端的圖形化用戶界面軟體。與常用的電子製表軟體不同,如Excel。Origin的工作表是以列為對象的,每一列具有相應的屬性,例如名稱,數量單位,以及其他用戶自定義標識。Origin以列計算式取代數據單元計算式進行計算。
Origin可使用自身的腳本語言(LabTalk)去控制軟體,該語言可使用Origin C進行擴展。Origin C是內置的基於C/C++的編譯語言。
值得注意的是,Origin可以作為一個COM伺服器,通過VB.NET,C#,LabVIEW等程序進行調用。
❹ C語言演算法速查手冊的目錄
第1章緒論1
1.1程序設計語言概述1
1.1.1機器語言1
1.1.2匯編語言2
1.1.3高級語言2
1.1.4C語言3
1.2C語言的優點和缺點4
1.2.1C語言的優點4
1.2.2C語言的缺點6
1.3演算法概述7
1.3.1演算法的基本特徵7
1.3.2演算法的復雜度8
1.3.3演算法的准確性10
1.3.4演算法的穩定性14
第2章復數運算18
2.1復數的四則運算18
2.1.1[演算法1]復數乘法18
2.1.2[演算法2]復數除法20
2.1.3【實例5】 復數的四則運算22
2.2復數的常用函數運算23
2.2.1[演算法3]復數的乘冪23
2.2.2[演算法4]復數的n次方根25
2.2.3[演算法5]復數指數27
2.2.4[演算法6]復數對數29
2.2.5[演算法7]復數正弦30
2.2.6[演算法8]復數餘弦32
2.2.7【實例6】 復數的函數運算34
第3章多項式計算37
3.1多項式的表示方法37
3.1.1系數表示法37
3.1.2點表示法38
3.1.3[演算法9]系數表示轉化為點表示38
3.1.4[演算法10]點表示轉化為系數表示42
3.1.5【實例7】系數表示法與點表示法的轉化46
3.2多項式運算47
3.2.1[演算法11]復系數多項式相乘47
3.2.2[演算法12]實系數多項式相乘50
3.2.3[演算法13]復系數多項式相除52
3.2.4[演算法14]實系數多項式相除54
3.2.5【實例8】復系數多項式的乘除法56
3.2.6【實例9】實系數多項式的乘除法57
3.3多項式的求值59
3.3.1[演算法15]一元多項式求值59
3.3.2[演算法16]一元多項式多組求值60
3.3.3[演算法17]二元多項式求值63
3.3.4【實例10】一元多項式求值65
3.3.5【實例11】二元多項式求值66
第4章矩陣計算68
4.1矩陣相乘68
4.1.1[演算法18]實矩陣相乘68
4.1.2[演算法19]復矩陣相乘70
4.1.3【實例12】 實矩陣與復矩陣的乘法72
4.2矩陣的秩與行列式值73
4.2.1[演算法20]求矩陣的秩73
4.2.2[演算法21]求一般矩陣的行列式值76
4.2.3[演算法22]求對稱正定矩陣的行列式值80
4.2.4【實例13】 求矩陣的秩和行列式值82
4.3矩陣求逆84
4.3.1[演算法23]求一般復矩陣的逆84
4.3.2[演算法24]求對稱正定矩陣的逆90
4.3.3[演算法25]求托貝里斯矩陣逆的Trench方法92
4.3.4【實例14】 驗證矩陣求逆演算法97
4.3.5【實例15】 驗證T矩陣求逆演算法99
4.4矩陣分解與相似變換102
4.4.1[演算法26]實對稱矩陣的LDL分解102
4.4.2[演算法27]對稱正定實矩陣的Cholesky分解104
4.4.3[演算法28]一般實矩陣的全選主元LU分解107
4.4.4[演算法29]一般實矩陣的QR分解112
4.4.5[演算法30]對稱實矩陣相似變換為對稱三對角陣116
4.4.6[演算法31]一般實矩陣相似變換為上Hessen-Burg矩陣121
4.4.7【實例16】 對一般實矩陣進行QR分解126
4.4.8【實例17】 對稱矩陣的相似變換127
4.4.9【實例18】 一般實矩陣相似變換129
4.5矩陣特徵值的計算130
4.5.1[演算法32]求上Hessen-Burg矩陣全部特徵值的QR方法130
4.5.2[演算法33]求對稱三對角陣的全部特徵值137
4.5.3[演算法34]求對稱矩陣特徵值的雅可比法143
4.5.4[演算法35]求對稱矩陣特徵值的雅可比過關法147
4.5.5【實例19】 求上Hessen-Burg矩陣特徵值151
4.5.6【實例20】 分別用兩種雅克比法求對稱矩陣特徵值152
第5章線性代數方程組的求解154
5.1高斯消去法154
5.1.1[演算法36]求解復系數方程組的全選主元高斯消去法155
5.1.2[演算法37]求解實系數方程組的全選主元高斯消去法160
5.1.3[演算法38]求解復系數方程組的全選主元高斯-約當消去法163
5.1.4[演算法39]求解實系數方程組的全選主元高斯-約當消去法168
5.1.5[演算法40]求解大型稀疏系數矩陣方程組的高斯-約當消去法171
5.1.6[演算法41]求解三對角線方程組的追趕法174
5.1.7[演算法42]求解帶型方程組的方法176
5.1.8【實例21】 解線性實系數方程組179
5.1.9【實例22】 解線性復系數方程組180
5.1.10【實例23】 解三對角線方程組182
5.2矩陣分解法184
5.2.1[演算法43]求解對稱方程組的LDL分解法184
5.2.2[演算法44]求解對稱正定方程組的Cholesky分解法186
5.2.3[演算法45]求解線性最小二乘問題的QR分解法188
5.2.4【實例24】 求解對稱正定方程組191
5.2.5【實例25】 求解線性最小二乘問題192
5.3迭代方法193
5.3.1[演算法46]病態方程組的求解193
5.3.2[演算法47]雅克比迭代法197
5.3.3[演算法48]高斯-塞德爾迭代法200
5.3.4[演算法49]超鬆弛方法203
5.3.5[演算法50]求解對稱正定方程組的共軛梯度方法205
5.3.6[演算法51]求解托貝里斯方程組的列文遜方法209
5.3.7【實例26】 解病態方程組214
5.3.8【實例27】 用迭代法解方程組215
5.3.9【實例28】 求解托貝里斯方程組217
第6章非線性方程與方程組的求解219
6.1非線性方程求根的基本過程219
6.1.1確定非線性方程實根的初始近似值或根的所在區間219
6.1.2求非線性方程根的精確解221
6.2求非線性方程一個實根的方法221
6.2.1[演算法52]對分法221
6.2.2[演算法53]牛頓法223
6.2.3[演算法54]插值法226
6.2.4[演算法55]埃特金迭代法229
6.2.5【實例29】 用對分法求非線性方程組的實根232
6.2.6【實例30】 用牛頓法求非線性方程組的實根233
6.2.7【實例31】 用插值法求非線性方程組的實根235
6.2.8【實例32】 用埃特金迭代法求非線性方程組的實根237
6.3求實系數多項式方程全部根的方法238
6.3.1[演算法56]QR方法238
6.3.2【實例33】用QR方法求解多項式的全部根240
6.4求非線性方程組一組實根的方法241
6.4.1[演算法57]梯度法241
6.4.2[演算法58]擬牛頓法244
6.4.3【實例34】 用梯度法計算非線性方程組的一組實根250
6.4.4【實例35】 用擬牛頓法計算非線性方程組的一組實根252
第7章代數插值法254
7.1拉格朗日插值法254
7.1.1[演算法59]線性插值255
7.1.2[演算法60]二次拋物線插值256
7.1.3[演算法61]全區間插值259
7.1.4【實例36】 拉格朗日插值262
7.2埃爾米特插值263
7.2.1[演算法62]埃爾米特不等距插值263
7.2.2[演算法63]埃爾米特等距插值267
7.2.3【實例37】 埃爾米特插值法270
7.3埃特金逐步插值271
7.3.1[演算法64]埃特金不等距插值272
7.3.2[演算法65]埃特金等距插值275
7.3.3【實例38】 埃特金插值278
7.4光滑插值279
7.4.1[演算法66]光滑不等距插值279
7.4.2[演算法67]光滑等距插值283
7.4.3【實例39】 光滑插值286
7.5三次樣條插值287
7.5.1[演算法68]第一類邊界條件的三次樣條函數插值287
7.5.2[演算法69]第二類邊界條件的三次樣條函數插值292
7.5.3[演算法70]第三類邊界條件的三次樣條函數插值296
7.5.4【實例40】 樣條插值法301
7.6連分式插值303
7.6.1[演算法71]連分式插值304
7.6.2【實例41】 驗證連分式插值的函數308
第8章數值積分法309
8.1變步長求積法310
8.1.1[演算法72]變步長梯形求積法310
8.1.2[演算法73]自適應梯形求積法313
8.1.3[演算法74]變步長辛卜生求積法316
8.1.4[演算法75]變步長辛卜生二重積分方法318
8.1.5[演算法76]龍貝格積分322
8.1.6【實例42】 變步長積分法進行一重積分325
8.1.7【實例43】 變步長辛卜生積分法進行二重積分326
8.2高斯求積法328
8.2.1[演算法77]勒讓德-高斯求積法328
8.2.2[演算法78]切比雪夫求積法331
8.2.3[演算法79]拉蓋爾-高斯求積法334
8.2.4[演算法80]埃爾米特-高斯求積法336
8.2.5[演算法81]自適應高斯求積方法337
8.2.6【實例44】 有限區間高斯求積法342
8.2.7【實例45】 半無限區間內高斯求積法343
8.2.8【實例46】 無限區間內高斯求積法345
8.3連分式法346
8.3.1[演算法82]計算一重積分的連分式方法346
8.3.2[演算法83]計算二重積分的連分式方法350
8.3.3【實例47】 連分式法進行一重積分354
8.3.4【實例48】 連分式法進行二重積分355
8.4蒙特卡洛法356
8.4.1[演算法84]蒙特卡洛法進行一重積分356
8.4.2[演算法85]蒙特卡洛法進行二重積分358
8.4.3【實例49】 一重積分的蒙特卡洛法360
8.4.4【實例50】 二重積分的蒙特卡洛法361
第9章常微分方程(組)初值問題的求解363
9.1歐拉方法364
9.1.1[演算法86]定步長歐拉方法364
9.1.2[演算法87]變步長歐拉方法366
9.1.3[演算法88]改進的歐拉方法370
9.1.4【實例51】 歐拉方法求常微分方程數值解372
9.2龍格-庫塔方法376
9.2.1[演算法89]定步長龍格-庫塔方法376
9.2.2[演算法90]變步長龍格-庫塔方法379
9.2.3[演算法91]變步長基爾方法383
9.2.4【實例52】 龍格-庫塔方法求常微分方程的初值問題386
9.3線性多步法390
9.3.1[演算法92]阿當姆斯預報校正法390
9.3.2[演算法93]哈明方法394
9.3.3[演算法94]全區間積分的雙邊法399
9.3.4【實例53】 線性多步法求常微分方程組初值問題401
第10章擬合與逼近405
10.1一元多項式擬合405
10.1.1[演算法95]最小二乘擬合405
10.1.2[演算法96]最佳一致逼近的里米茲方法412
10.1.3【實例54】 一元多項式擬合417
10.2矩形區域曲面擬合419
10.2.1[演算法97]矩形區域最小二乘曲面擬合419
10.2.2【實例55】 二元多項式擬合428
第11章特殊函數430
11.1連分式級數和指數積分430
11.1.1[演算法98]連分式級數求值430
11.1.2[演算法99]指數積分433
11.1.3【實例56】 連分式級數求值436
11.1.4【實例57】 指數積分求值438
11.2伽馬函數439
11.2.1[演算法100]伽馬函數439
11.2.2[演算法101]貝塔函數441
11.2.3[演算法102]階乘442
11.2.4【實例58】伽馬函數和貝塔函數求值443
11.2.5【實例59】階乘求值444
11.3不完全伽馬函數445
11.3.1[演算法103]不完全伽馬函數445
11.3.2[演算法104]誤差函數448
11.3.3[演算法105]卡方分布函數450
11.3.4【實例60】不完全伽馬函數求值451
11.3.5【實例61】誤差函數求值452
11.3.6【實例62】卡方分布函數求值453
11.4不完全貝塔函數454
11.4.1[演算法106]不完全貝塔函數454
11.4.2[演算法107]學生分布函數457
11.4.3[演算法108]累積二項式分布函數458
11.4.4【實例63】不完全貝塔函數求值459
11.5貝塞爾函數461
11.5.1[演算法109]第一類整數階貝塞爾函數461
11.5.2[演算法110]第二類整數階貝塞爾函數466
11.5.3[演算法111]變型第一類整數階貝塞爾函數469
11.5.4[演算法112]變型第二類整數階貝塞爾函數473
11.5.5【實例64】貝塞爾函數求值476
11.5.6【實例65】變型貝塞爾函數求值477
11.6Carlson橢圓積分479
11.6.1[演算法113]第一類橢圓積分479
11.6.2[演算法114]第一類橢圓積分的退化形式481
11.6.3[演算法115]第二類橢圓積分483
11.6.4[演算法116]第三類橢圓積分486
11.6.5【實例66】第一類勒讓德橢圓函數積分求值490
11.6.6【實例67】第二類勒讓德橢圓函數積分求值492
第12章極值問題494
12.1一維極值求解方法494
12.1.1[演算法117]確定極小值點所在的區間494
12.1.2[演算法118]一維黃金分割搜索499
12.1.3[演算法119]一維Brent方法502
12.1.4[演算法120]使用一階導數的Brent方法506
12.1.5【實例68】使用黃金分割搜索法求極值511
12.1.6【實例69】使用Brent法求極值513
12.1.7【實例70】使用帶導數的Brent法求極值515
12.2多元函數求極值517
12.2.1[演算法121]不需要導數的一維搜索517
12.2.2[演算法122]需要導數的一維搜索519
12.2.3[演算法123]Powell方法522
12.2.4[演算法124]共軛梯度法525
12.2.5[演算法125]准牛頓法531
12.2.6【實例71】驗證不使用導數的一維搜索536
12.2.7【實例72】用Powell演算法求極值537
12.2.8【實例73】用共軛梯度法求極值539
12.2.9【實例74】用准牛頓法求極值540
12.3單純形法542
12.3.1[演算法126]求無約束條件下n維極值的單純形法542
12.3.2[演算法127]求有約束條件下n維極值的單純形法548
12.3.3[演算法128]解線性規劃問題的單純形法556
12.3.4【實例75】用單純形法求無約束條件下N維的極值568
12.3.5【實例76】用單純形法求有約束條件下N維的極值569
12.3.6【實例77】求解線性規劃問題571
第13章隨機數產生與統計描述574
13.1均勻分布隨機序列574
13.1.1[演算法129]產生0到1之間均勻分布的一個隨機數574
13.1.2[演算法130]產生0到1之間均勻分布的隨機數序列576
13.1.3[演算法131]產生任意區間內均勻分布的一個隨機整數577
13.1.4[演算法132]產生任意區間內均勻分布的隨機整數序列578
13.1.5【實例78】產生0到1之間均勻分布的隨機數序列580
13.1.6【實例79】產生任意區間內均勻分布的隨機整數序列581
13.2正態分布隨機序列582
13.2.1[演算法133]產生任意均值與方差的正態分布的一個隨機數582
13.2.2[演算法134]產生任意均值與方差的正態分布的隨機數序列585
13.2.3【實例80】產生任意均值與方差的正態分布的一個隨機數587
13.2.4【實例81】產生任意均值與方差的正態分布的隨機數序列588
13.3統計描述589
13.3.1[演算法135]分布的矩589
13.3.2[演算法136]方差相同時的t分布檢驗591
13.3.3[演算法137]方差不同時的t分布檢驗594
13.3.4[演算法138]方差的F檢驗596
13.3.5[演算法139]卡方檢驗599
13.3.6【實例82】計算隨機樣本的矩601
13.3.7【實例83】t分布檢驗602
13.3.8【實例84】F分布檢驗605
13.3.9【實例85】檢驗卡方檢驗的演算法607
第14章查找609
14.1基本查找609
14.1.1[演算法140]有序數組的二分查找609
14.1.2[演算法141]無序數組同時查找最大和最小的元素611
14.1.3[演算法142]無序數組查找第M小的元素613
14.1.4【實例86】基本查找615
14.2結構體和磁碟文件的查找617
14.2.1[演算法143]無序結構體數組的順序查找617
14.2.2[演算法144]磁碟文件中記錄的順序查找618
14.2.3【實例87】結構體數組和文件中的查找619
14.3哈希查找622
14.3.1[演算法145]字元串哈希函數622
14.3.2[演算法146]哈希函數626
14.3.3[演算法147]向哈希表中插入元素628
14.3.4[演算法148]在哈希表中查找元素629
14.3.5[演算法149]在哈希表中刪除元素631
14.3.6【實例88】構造哈希表並進行查找632
第15章排序636
15.1插入排序636
15.1.1[演算法150]直接插入排序636
15.1.2[演算法151]希爾排序637
15.1.3【實例89】插入排序639
15.2交換排序641
15.2.1[演算法152]氣泡排序641
15.2.2[演算法153]快速排序642
15.2.3【實例90】交換排序644
15.3選擇排序646
15.3.1[演算法154]直接選擇排序646
15.3.2[演算法155]堆排序647
15.3.3【實例91】選擇排序650
15.4線性時間排序651
15.4.1[演算法156]計數排序651
15.4.2[演算法157]基數排序653
15.4.3【實例92】線性時間排序656
15.5歸並排序657
15.5.1[演算法158]二路歸並排序658
15.5.2【實例93】二路歸並排序660
第16章數學變換與濾波662
16.1快速傅里葉變換662
16.1.1[演算法159]復數據快速傅里葉變換662
16.1.2[演算法160]復數據快速傅里葉逆變換666
16.1.3[演算法161]實數據快速傅里葉變換669
16.1.4【實例94】驗證傅里葉變換的函數671
16.2其他常用變換674
16.2.1[演算法162]快速沃爾什變換674
16.2.2[演算法163]快速哈達瑪變換678
16.2.3[演算法164]快速餘弦變換682
16.2.4【實例95】驗證沃爾什變換和哈達瑪的函數684
16.2.5【實例96】驗證離散餘弦變換的函數687
16.3平滑和濾波688
16.3.1[演算法165]五點三次平滑689
16.3.2[演算法166]α-β-γ濾波690
16.3.3【實例97】驗證五點三次平滑692
16.3.4【實例98】驗證α-β-γ濾波演算法693
❺ 數控機床上加工未知曲面
在機械設計時,利用三維設計軟體進行實體造型,比如UG、PRO/E等等,並且利用軟體自帶的CAM包自動生成NC程序,加工是無需曲面參數
三坐標測量儀是通過測定曲面上的點集,通過三維設計軟體,近似畫出全面,可以通過測量--造型--加工--再測量--再造型--在加工的不斷修正得到所需要的曲面
CAXA實體設計是國產的三維設計軟體,在功能上無法與國外一流的軟體相比
❻ 如何將一個工作表裡的數據做曲面擬合求具體的MATLAB程序
如:2.xls里的工作表數據格式為,A單元格為x值,B單元格為y值,C單元格為z值,則
A=xlsread('2.xls'); %讀數據
x=A(:,1)
y=A(:,2)
z=A(:,3)
X=(x,y)
func=inline('a(1).*X(:,1).^2+a(2).*X(:,2).^2+a(3)','a','X'); %自定義函數
a0=[a10 a20 a30] %函數系數的初值,為具體的數值
[a,r,J] = nlinfit(x,y,func,a0);
%方程z=a*x²+b*y²+c
c=a(3),b=a(2),a=a(1) %函數的系數值
❼ C++或Basic編程
1)數據數據的概念十分廣泛,它通常是對客觀事物的數量、特徵、性質的描述。對計算機而言,數據是計算機所能處理的一切數值、字元、圖形或其他特定符號的總稱,是計算機加工處理的「原料」和它所生產的「產品」(計算的結果)。2)數據元素數據元素是數據的基本單位,也稱作結點和記錄。在計算機程序中通常作為一個整體進行考慮和處理。一個數據元素可由若干個數據項組成。數據項是數據的不可分割的最小單位。3)數據對象數據對象是具有相同性質的數據元素的集合,是數據的子集。 1、 數據結構(Data Structure)
數據結構是指同一數據對象中個數據元素之間存在的關系(相互間存在一種或多種特定關系的數據元素的集合)。
根據數據結構的形式定義,數據結構是一個二元組:
S(Data-Structure)=(D,R)
其中:D是數據元素的有限集,R是D上關系的有限集。
邏輯結構與物理結構
數據之間的相互關系稱為邏輯結構。通常分為三類基本結構:
(一)集合:結構中的數據元素除了同屬於一種類型外,別無其它關系。
(二)線性結構:結構中的數據元素之間存在一對一的關系。
(三)非線性結構:
樹型結構——結構中的數據元素之間存在一對多的關系。
圖狀結構或網狀結構——結構中的數據元素之間存在多對多的關系。
數據結構在計算機中的表示稱為數據的物理結構,又稱為存儲結構。
(一般我們將數據的邏輯結構稱為是數據結構,)
存儲結構可分為:順序存儲與鏈式存儲。
順序存儲結構——藉助元素在存儲器中的相對位置來表示數據元素間的邏輯關系;
鏈式存儲結構——藉助指示元素存儲地址的指針表示數據元素間的邏輯關系。
數據的邏輯結構與存儲結構密切相關。
2.1.2 線性表
1)線性表定義
線性表(Linear List) :由n(n≧)個數據元素(結點)a1,a2, …an組成的有限序列。其中數據元素的個數n定義為表的長度。當n=0時稱為空表,常常將非空的線性表(n>0)記作:
L = (a1,a2,…an)
這里的數據元素ai(1≦i≦n)只是一個抽象的符號,其具體含義在不同的情況下可以不同。
2)線性表特點
線性表的邏輯結構有以下特點:
在數據元素的非空有限集中
Ø 存在唯一的一個被稱作「第一個」的數據元素
Ø 存在唯一的一個被稱作「最後一個」的數據元素
Ø 除第一個外,集合中的每個數據元素均只有一個前驅
Ø 除最後一個外,集合中的每個數據元素均只有一個後繼
3)線性表的基本運算
線性表的主要運算有:
插入:在兩個確定元素之間插入一個新元素;
刪除:刪除線性表中的某個元素;
查找:按某種要求查找線性表中的一個元素,需要時還可以進行更新;
排序:按給定要求對表中元素重新排序;
還有初始化、求長度等。
在不同問題的線性表中,需要進行的運算也不相同,實際應用中還可能涉及建立線性表、修改表中元素數值(編輯)等運算,但是基本上可以由上述四種運算組成。
4)順序存儲線性表
(1)順序存儲結構
把線性表的數據元素,按順序依次存放在一組地址連續的存儲單元里。用這種方法存儲的線性表簡稱順序表,也稱為向量式存儲結構。
假設線性表的每個元素需佔用個存儲單元,且線性表在內存中的首地址為,則線性表中第個數據元素的存儲地址為:
則線性表中第個數據元素的存儲位置和第個數據元素的存儲位置之間滿足下列關系:
這種存儲結構只要知道數據元素序號,就很容易找到第個數據元素。它的主要特點有:一、各數據元素存儲地址上相鄰;二、無論序號為何值,找到第個元素的時間相同。
這種存儲結構在高級語言中可以用一維數組的形式實現。
(2)順序存儲結構的優缺點
優點
Ø 邏輯相鄰,物理相鄰;
Ø 可隨機存取任一元素;
Ø 存儲空間使用緊湊。
缺點
Ø 插入、刪除操作需要移動大量的元素;
Ø 預先分配空間需按最大空間分配,利用不充分;
Ø 表容量難以擴充。
5)線性鏈表
特點:
Ø 用一組任意的存儲單元存儲線性表的數據元素;
Ø 利用指針實現了用不相鄰的存儲單元存放邏輯上相鄰的元素;
Ø 每個數據元素,除存儲本身信息外,還需存儲其直接後繼的信息。
數據元素由兩部分組成:
Ø 數據域:存放元素本身信息;
Ø 指針域:指示直接後繼的存儲地址。
線性鏈表一般在第一個結點之前附加一個頭結點:
2.1.3 棧與隊
棧和隊是兩種特殊的線性表,它們的運算規則較一般線性表由更多的約束和限制,因此稱作限定性數據結構。
1)棧的結構和運算
(1)棧的定義
棧(Stack)是限制在表的一端進行插入和刪除運算的線性表,通常稱插入、刪除的這一端為棧頂(Top),另一端為棧底(Bottom)。當表中沒有元素時稱為空棧。
假設棧,則稱為棧底元素,為棧頂元素。棧中元素按的次序進棧,的順序退棧,退棧的第一個元素應為棧頂元素。換句話說,棧的修改是按後進先出的原則進行的。因此,棧稱為後進先出表(LIFO,last in first out)。
棧的存儲結構也有順序與鏈式兩種,稱為順序棧與鏈棧。
(2)順序棧
由於棧是運算受限的線性表,因此線性表的存儲結構對棧也適應。
棧的順序存儲結構簡稱為順序棧,它是運算受限的線性表。因此,可用數組來實現順序棧。因為棧底位置是固定不變的,所以可以將棧底位置設置在數組的兩端的任何一個端點;棧頂位置是隨著進棧和退棧操作而變化的,故需用一個整型變數top來指示棧頂位置。如果用m來表示棧的最大容量,則top=0表示棧空,此時出棧,則下溢(underflow);top=m表示棧滿,此時入棧,則上溢(overflow)。
(3)棧的應用
表達式求值
表達式求值步驟:首先在OS棧中放入表達式結束符「;」,
l 若為操作數,將其壓入NS棧;
l 若為運算符,比較當前OS棧的棧頂元素:
ü 若當前運算符的優先數大於OS棧頂的運算符,則將當前運算符壓入OS棧;
ü 若當前運算符的優先數不大於OS棧頂運算符,則從NS棧中彈出兩個操作數x,y,再從OS中彈出一個運算符,,並將結果T送入NS棧。
ü 若當前運算符為「;」,且OS棧頂也為「;」,則表示表達式處理結束,此時,NS棧頂元素即為此表達式值。
過程嵌套和遞歸調用
過程嵌套調用如圖所示:
當調用子過程時,必須把斷點的信息及地址保存起來,當子過程執行完畢,返回時,取用這些信息,找到返回地址,從此斷點繼續執行。當程序中出現多重嵌套調用時,必須開辟一個棧,將各層斷點信息依次入棧,當各層子過程返回時,又以相反的次序從棧頂取出。
遞歸調用
函數直接或間接地調用自身叫遞歸調用,這主要時用遞歸工作棧來實現的。下面舉一個簡單的例子來說明遞歸調用。
例 一段遞歸調用的C語言程序如下:
void print(int w)
{
int I;
if (w!=0)
{
print (w-1);
for (I=1; I<=w; ++I)
printf(「%3d,」,w);
printf(「/n」);
}
}
在這段程序中,遞歸調用的執行過程如圖所示:
2) 隊的結構和運算
(1)隊的定義
隊是限定只能在表的一端進行插入,在表的另一端進行刪除的線性表。
隊尾(rear)——允許插入的一端
隊頭(front)——允許刪除的一端
隊的特點是:先進先出(FIFO)
(2)順序隊
存在問題:
設數組維數為M,則:
當front=-1,rear=M-1時,再有元素入隊發生溢出——真溢出
l當front¹-1,rear=M-1時,再有元素入隊發生溢出——假溢出
解決方案:
l 隊首固定,每次出隊剩餘元素向下移動——浪費時間
l 循環隊列
Ø 基本思想:把隊列設想成環形,讓sq[0]接在sq[M-1]之後,若rear+1==M,則令rear=0;
Ø 實現:利用「模」運算
入隊: rear=(rear+1)%M; sq[rear]=x;
出隊: front=(front+1)%M; x=sq[front];
Ø 隊滿、隊空判定條件
front=rear
解決方案:
n 另外設一個標志以區別隊空、隊滿
n 少用一個元素空間:
隊空:front==rear
隊滿:(rear+1)%M==front
2.1.4 數組
1)數組的定義
(1)定義
數組可以看成是一種特殊的線性表,即線性表中數據元素本身也是一個線性表。用線性表的一般表示形式定義二維數組為:
其中,K由個結點組成:
R由以下兩種關系組成:
(2)數組特點
l 數組結構固定
l 數據元素同構
(3)數組運算
數組一旦被定義,它的維數和數據元素的個數就已經固定,不能插入和刪除,所以數組運算只有:
l 給定一組下標,存取相應的數據元素
l 給定一組下標,修改數據元素的值
2)數組的順序存儲結構
由於計算機的內存結構是一維的,因此用一維內存來表示多維數組,就必須按某種次序將數組元素排成一列序列,然後將這個線性序列存放在存儲器中。
又由於對數組一般不做插入和刪除操作,也就是說,數組一旦建立,結構中的元素個數和元素間的關系就不再發生變化。因此,一般都是採用順序存儲的方法來表示數組。
根據不同的存放形式,可以分為按行優先和按列優先順序存放。
(1)按行優先順序存放
按行優先順序存放,對二維數組來說就是按行進行切分,如圖所示:
假設每個數據元素只佔一個單元地址,則元素的存放地址可以通過以下關系式計算:
(2)按列優先順序存放
如果數組按列切分,就得到按列優先順序存放方式。如圖所示:
元素的存放地址可以通過以下關系式計算:
2.1.5 樹與二叉樹
1)樹的定義及其存儲結構
(1)樹的定義和術語
定義:樹(Tree)是n(n>=0)個結點的有限集T,T為空時稱為空樹,否則它滿足如下兩個條件:
(1)有且僅有一個特定的稱為根(Root)的結點;
(2)其餘的結點可分為m(m>=0)個互不相交的子集T1,T2,T3…Tm,其中每個子集又是一棵樹,並稱其為子樹(Subtree)。
基本術語:
l 結點(node)——表示樹中的元素,包括數據項及若干指向其子樹的分支;
l 結點的度(degree)——結點擁有的子樹數;
l 葉子(leaf)——度為0的結點;
l 孩子(child)——結點子樹的根稱為該結點的孩子;
l 雙親(parents)——孩子結點的上層結點叫該結點的雙親;
l 兄弟(sibling)——同一雙親的孩子;
l 樹的度——一棵樹中最大的結點度數;
l 結點的層次(level)——從根結點算起,根為第一層,它的孩子為第二層……;
l 深度(depth)——樹中結點的最大層次數;
l 森林(forest)——m(m>=0)棵互不相交的樹的集合;
(2)樹的存儲結構
樹的存儲結構有多種形式,這里只討論鏈式存儲結構。因為樹是多分支非線性表,因此採用多重鏈表結構,即每個結點設有多個指針域,其中每個指針指向一棵子樹的根結點。對於每一個結點的結構類型有兩種形式:結點異構型、結點同構型。
結點異構型,是根據每個結點的子樹數設置相應的指針域,由於每個結點的度數不同,則同一棵樹中,結點形式也不同。這種結構形式雖然能節省存儲空間,但運算不方便。
結點同構型,是每個結點的指針域個數均為樹的度數。這種形式運算方便,但會使鏈表中出現很多空鏈域,浪費空間。
當樹的度數k=2時,空鏈域的比例最低,這就是要介紹的二叉樹。
2)二叉樹及其性質
二叉樹在樹結構的應用中起著非常重要的作用,因為對二叉樹的許多操作演算法簡單,而任何樹都可以與二叉樹 相互轉換,這樣就解決了樹的存儲結構及其運算中存在的復雜性。
(1)二叉樹定義及其存儲結構
定義:二叉樹是由n(n>=0)個結點的有限集合構成,此集合或者為空集,或者由一個根結點及兩棵互不相交的左右子樹組成,並且左右子樹都是二叉樹。
這也是一個遞歸定義。二叉樹可以是空集合,根可以有空的左子樹或空的右子樹。二叉樹不是樹的特殊情況,它們是兩個概念。
二叉樹結點的子樹要區分左子樹和右子樹,即使只有一棵子樹也要進行區分,說明它是左子樹,還是右子樹。這是二叉樹與樹的最主要的差別。
圖2-8 二叉樹
存儲結構:通常用具有兩個指針域的鏈表作為二叉樹的存儲結構,其中,每個結點由數據域(data)、左指針域(L child)和右指針域(R child)組成,如圖所示:
圖2-9 二叉鏈表
這就是二叉鏈表,還有三叉鏈表就是在這一基礎上增加一個雙親結點指針。
(2)二叉樹的基本性質
(1) 在二叉樹的第層上,至多有個結點。
(2) 深度為h的二叉樹中,至多含有個結點。
(3) 對任意一棵二叉樹,若有個子結點,個度為2的結點,則必有。
(3)幾種特殊形式的二叉樹
l 滿二叉樹
一棵深度為h且有2h-1個結點的二叉樹稱為滿二叉樹。
l 完全二叉樹
如果深度為h、有n個結點的二叉樹中的結點能夠與深度為h的順序編號的滿二叉樹從1到n標號的結點相對應,則該樹稱為完全二叉樹。
完全二叉樹的特點是:
所有的葉結點都出現在第h層或h-1層。
錯任一結點,如果其右子樹的最大層次為1,則其左子樹的最大層次為1或l+1。
滿二叉樹是完全二叉樹的特例。
(1) 平衡二叉樹
所有結點的平衡因子為-1、0、1。
(4)一般樹轉換為二叉樹
為了使一般樹也能象二叉樹一樣用二叉樹鏈表表示,必須找出樹與二叉樹之間的對應關系。將一般樹轉換為二叉樹的方法為:
(1) 在兄弟結點之間加一連線;
(2) 對每個結點,除了與它的第一個孩子保持聯系外,去除與其它孩子的聯系;
(3) 以樹根為軸心將整棵樹順時針旋轉45度。
任何一棵樹轉換為二叉樹,其根結點的右子樹必為空。
3)二叉樹的遍歷
遍歷——按一定規律走遍樹的各個結點,每一結點僅被訪問一次,即找一個完整而有規律的走法,以得到樹中所有結點的一個線性排列。
常用方法
先序遍歷(DLR):先訪問根結點,然後分別先序遍歷左子樹、右子樹
中序遍歷(LDR):先中序遍歷左子樹,然後訪問根結點,最後中序遍歷右子樹
後序遍歷(LRD):先後序遍歷左、右子樹,然後訪問根結點
2.2 工程手冊的數據處理
基本要求:
(1)熟悉工程手冊的數據處理方法;(2)掌握數表的程序化方法;(3)了解線圖的程序化方法;(4)掌握最小二乘法擬合方法及其應用;(4)能用高級程序設計語言(如C語言)編寫前述相應數據處理方法的基本程序並上機通過。
教學內容:
(1)數表的程序化;(2)線圖的程序化;(3)建立經驗公式的方法。
重點與難點:
重點:(1)查表程序設計;(2)一元函數的插值;(3)最小二乘法擬合。
難點:(1)拋物線插值中結點的選取;(2)插值程序設計及上機調試;(3)最小二乘法擬合程序設計及上機調試。
學時安排:
講課4學時,課外上機練習不少於2學時。
在機械設計過程中,往往需要從有關的工程手冊或設計規范中查找各種設計數據(資料)。這些數據在手冊或規范中一般是以數表和線圖的形式存放(記錄)的。在進行機械CAD時,首先要把這些數表、線圖形式的數據計算機化,即把它們存入計算機外、內存儲器中,並設計相應的自動檢索程序。
從總體上說,這些設計資料的計算機處理有以下三種方法:
(1)程序化:在應用程序內部對這些數表和線圖進行處理,包括數組法和擬合公式法。
(2)數據文件法:將數表或線圖中得數據編成一個獨立的數據文件,存入外存,供設計解題時調用。高級程序設計語言本身一般均具備相應的數據文件處理功能。
(3)資料庫法:將數表或線圖中的數據暗資料庫中的規定進行文件結構化,即建成資料庫。
本章重點討論程序化方法,補充介紹有關數據文件法的基本內容,資料庫存儲方法在後面第5章中介紹。
2.2.1 數表的程序化
l 數表的形式:
從函數角度看有:
單變數表:e.g. T.3-1~T.3-3
雙變數表:e.g. T.3-4~T.3-5 單值表:e.g. T.3-3~T.3-6
多變數表:e.g. T.3-6 多值表:e.g. T.3-1~T.3-2
無變數表:e.g. 齒輪標准模數(m)系列值。
l 數表數據的形成(來源)及處理原則:
(1)有些本來就有精確的計算公式,為了便於手工設計使用,才製成表格供設計時查用(如各種數學用表)——力求找到原來的理論計算公式或經驗公式→編入應用程序。(最簡單的方法)。
(2)對大多數數表而言,或本來就無法表達成公式,或一時難以找到原來公式——程序化處理。
l 數表程序化方法:
1) 數組法:適於只需要用數表中所列數據(離散點、型值點或結點數據),
2) 插值法(擬合公式法):對於需要用到數表中各離散點中間的數據。
1)數組法實例
本教材共介紹了六個實例,這里選取二個重點介紹,其餘四個自己分析。
例1 平鍵和鍵槽的剖面尺寸,見圖2-10和表2-1(摘引自GB/T 1095-1979)
它是單變數多值表。查表時,設計計算出的軸徑dgiven→D(范圍) →b,h,t,t1。可使用一維數組,D的范圍可用其上限表示。變數及數組的定義:
int i;
float dgiven,b,h,t,t1;
float D[12]={10.0,12.0,…,85.0};
float kb[12]=…
.
.
.
float kt[12]=…
圖2-10 平鍵和鍵槽的剖面圖
表2-1 平鍵和鍵槽的尺寸表
圖2-11平鍵和鍵槽的剖面尺寸查詢流程
尺寸查取流程圖見圖2-11。
要求:用C(Turbo C or Visual C++等均可)語言編程實現該數表數據存儲及查詢。
例2 齒輪傳動工況系數KA,見表2-2。
表2-2 齒輪傳動工況系數KA
圖2-12 齒輪傳動工況系數KA查詢流程
根據原動機機、工作機的工況→KA,使用二維數組:KK[i][j],i=0~2:表示原動機工況,j=0~2:表示工作機工況。
變數及數組定義:
float KA;
int i,j;
float;
KK[3][3]={{1.0,1.25,1.75},{1.25,1.5,2.0},{1.5,1.75,2.25}};
查表程序流程圖見圖2-12。
要求:用C(Turbo C or Visual C++等均可)語言編程實現該數表數據存儲及查詢。
例3 說明:多變數單值表
① P1值需用三維數組NN(4,4,14),可以將P1值→數據文件→NN數組。
② 降維處理:三維→二個二維。
2) 一元函數的插值
設有一用數據表格給出的列表函數y=f(x),如下表2-3:
表2-3 列表函數y=f(x)
表中只有幾個離散點(或型值點、結點)的數據,當自變數為結點間的中間值時,就要用到插值法求取其函數值。
基本思想:在插值點附近選取幾個合適的結點,過這些點構造一個簡單函數g(x),在此小段上用g(x)代替原來函數f(x),這樣插值點的函數值就用g(x)的值來代替,如圖2-13。
圖2-13 一元函數插值
插值的實質問題:如何構造一個既簡單又具有足夠精度的函數f(x)。
插值方法類型:線性插值、拋物線插值。
(1)線性插值
方法步驟:(1)選xi,xi+1,滿足xi<x< xi+1;(2)過(xi,yi)及(xi+1,yi+1)兩點構造直線g(x)→f(x)。
誤差問題:存在誤差,當自變數間隔較小,而插值精度不要很高時,可以滿足要求。
x(n),y(n)——一維數值,n——結點數。C語言下標從0開始。xgiven,ygiven——已知的x 插入值及求出的函數值。
圖2-14 線性插值流程
(2)拋物線插值
在f(x)上選取三點(xi-1,yi-1),(xi,yi),(xi+1,yi+1),構造拋物線g(x)→f(x)。比線性插值精度好。
關鍵問題:根據插值點x選取合適的三個點。選取方法歸納為(「靠近原則」):
設插值點為x,且xi-1<x≤xi,i=3,4,…,n-1,
(1)若|x-xi-1|≤|x-xi|,即x靠近xi-1點或居於xi-1與 xi之中點,則選xi-2,xi-1,xi三個點,上式中i=i-1;
(2)若|x-xi-1|>|x-xi|,即x靠近xi點,則選xi-1,xi,xi+1三個點,上式中i=I;
(3)若x1≤x≤x2,即x靠近表頭,則選x1,x2,x3三個點,上式中i=2;
(4)若x n-1≤x≤xn,即x靠近表尾,則選xn-2,xn-1,xn三個點,上式中i=n-1。
程序流程圖見下圖2-15。
圖2-15 拋物線插值流程
要求:將線性插值與拋物線插值統一編程。
3)二元函數的插值
有二元列表函數f(xi,yi),i=1,2,…,n,如下表2-4。
表2-4 二元列表函數
插值幾何意義:在3D空間中選定幾個點,通過這些點構造一塊曲面g(x,y),用它近似地表示在這區間內原有的曲面f (x,y),從而得到插值後的函數值Zk=g(xk,yk) , 如圖2-15所示。
插值方式類型,在一元函數插值方法的基礎上延伸,有以下幾種:
(1)直線-直線插值
最最基本、最簡單、精度最低。
如圖所示,g(x,y)形成:以AB、CD為導線,作//yoz平面的直母線(EF)直線的運動→柱狀面。
插值步驟:
圖2-15 二元函數插值
圖2-16 拋物線插值流程
(a)根據k點的(xk,yk)→周圍四點a,b,c,d,滿足xa=xc,xb=xd,ya=yb,yc=yd,xa<xk<xb,ya<yk<yb;
(b)A,B,C,D,過A,B用線性插值→E,過C,D用線性插值→F;
(c)過E,F用線性插值→K點。
(2)拋物線-直線插值
將導線AB、CD→拋物線ABE,CDF。插值步驟:
(1)據k點的(xk,yk)→a,b,c,d+e,f;
(2)據a,b,c,d,e,f→A,B,C,D,E,F,過A,B,E 用拋物線插值→U點,過C,D,F用拋物線插值→V點;
(3)U,V用線性插值→K點。
(3)拋物線-拋物線插值
(1)據k點的(xk,yk)→a,b,c,d+e,f+r,s,t;
(2)據a,b,c,d, e,f,r,s,t→A,B,C,D,E,F,R,S,T,
過A,B,E用拋物線插值→U點,過C,D,F用拋物線插值→V點,過R,S,T用拋物線插值→W點;
(3) 過U,V,W用拋物線插值→K點。
上述三種插值方法統一的程序流程圖見P44圖3-10,三種方法由變數II控制。
要求:讀懂該流程圖,有餘力的學生編程上機。
2.2.2 數表的公式擬合
工程實際中常需要用一定的數學方法將一系列測試數據或統計數據擬合成近似的經驗公式——曲線擬合。
插值法的實質是在幾何上用嚴格通過各結點的曲線或曲面來近似代替列表函數曲線或曲面。但通過試(實)驗所得的數據離散性很大,誤差比較大,因此,插值法建立的公式必然保留了所有誤差,此外,要構造這樣的函數的復雜度或難度比較大。有鑒於此,採用構造近似曲線、曲面,此曲線、曲面並不嚴格通過所有結點,而是盡可能反映所給數據的趨勢,這種利用所給數據建立擬合或近似曲線或曲面經驗公式的過程稱為曲線、曲面擬合或公式擬合。
本節介紹最常用最基本的單變數曲線擬合方法——最小二乘法。(其他常用的還有Bezier法、三次參數樣條法、B樣條法等)。
1)最小二乘法擬合的基本思想
根據離散點的大致分布規律,先確定擬合函數的類型,如多項式函數、指數函數、對數函數等,計算出各數據點橫坐標處的函數值與縱坐標之間的偏差的平方,求其和並使之為最小值,從而解出函數的待定系數。
已知由線圖或實驗所得m個點的值為:(x1,y1),(x1,y1),……,(xm,ym),設擬合函數公式為:y=f(x),則每一結點處的偏差為: (i=1,2,…,m),偏差的平方和為:
求 min 函數f(x)的待定系數→ f(x)
擬合函數的類型,常選取初等函數,如對數函數、指數函數、代數多項式等。一般是根據數據曲線形態判斷所採用的函數類型。最常用的是代數多項式擬合。本節只討論在選定函數類型的情況下如何確定各系數值的問題。
2)最小二乘法的(代數)多項式擬合
設擬合公式為: (n次多項式)
已知m個點的值(x1,y1),(x1,y1),……,(xm,ym),且m>>n,結點偏差的平方和為:
為使 j=0,1,2,…,n
其中:(k=1,2,…,2m+1)
這是一個關於的n+1個線性方程組,求解該方程組→→f(x)
常用二次三項式擬合公式:
例1 介紹
程序流程圖,見P.44圖3-13
要求:看懂該流程圖,該流程圖中採用了高斯消去法解聯立方法(詳見3.3.4節),有餘力的學生編程上機。
❽ 什麼叫UG程序
UG的開發始於1990年7月。如今大約十人正工作於核心功能之上。當前版本具有大約450,000行的C代碼。
UG是一個在二和三維空間無結構網格上使用自適應多重網格方法開發的一個靈活的數值求解偏微分方程的軟體工具。其設計思想足夠靈活地支持多種離散方案。因此軟體可對許多不同的應用再利用。
一個給定過程的有效模擬需要來自於應用領域 (自然科學或工程)、數學(分析和數值數學) 及計算機科學的知識。一些非常成功的解偏微分方程的技術,特別是自適應網格加密(adaptive mesh refinement)和多重網格方法在過去的十年中已被數學家研究。計算機技術的巨大進展,特別是大型並行計算機的開發帶來了許多新的可能。
然而,所有這些技術在復雜應用中的使用並不是太容易。這是因為組合所有這些方法需要巨大的復雜性及交叉學科的知識。最終軟體的實現變得越來越復雜,以致於超出了一個人能夠管理的范圍。
UG的目標是用最新的數學技術,即自適應局部網格加密、多重網格和並行計算,為復雜應用問題的求解提供一個靈活的可再使用的軟體基礎。
一般結構
一個如UG這樣的大型軟體系統通常需要有不同層次抽象的描述。UG具有三個設計層次,即結構設計(architectural design)、子系統設計(subsystem design)和組件設計(component design)。
至少在結構和子系統層次上,UG是用模塊方法設計的並且信息隱藏原則被廣泛地使用。所有陳述的信息被分布於各子系統之間。UG是用C語言來實現的。
圖1給出了詳細的結構設計,其構建模塊是動態分布式資料庫(DDD: Dynamic Distributed Data Library)、UG內核、問題類和應用。
圖1:UG結構設計
DDD編程模式
提供了處理不規則數據結構和並行機上分布式對象的一種並行編程模式。它處理分布式對象的識別(創建)、分布式對象間的通訊及分布式對象的動態轉移等基本任務。可提供本工具的一個獨立的版本,移植性通過提供對Paragon NX、PARIX、T3D/T3E shared mem、MPI和PVM的介面來保證。
UG內核程序
UG內核程序意欲與待求解的偏微分方程是無關的。它提供幾何和代數數據結構及許多網格處理選項、數值演算法、可視化技術和用戶界面。
當然,每個程序設計抽象都基於某種基本假設。網格管理子系統當前被編寫得僅支持層次結構化網格。數據結構本身可支持更一般松耦合網格層次。並行化基於具有極小重疊的數據劃分。
UG內核程序具有如下特徵:
靈活的區域描述界面。由於UG可生成/修改網格,它需要區域邊界的一個幾何描述。當前支持兩種格式,正在進行CAD界面的工作。
一種支持二和三維無結構網格的管理器,具有多種元類型,如三角形、四邊形、四面體、稜柱、棱椎和六面體。為重新啟動的完全網格結構及解的存儲和載入。
局部、層次加密和粗化。在每個網格層提供一個相容且穩定的三角形剖分。
一個靈活的稀疏矩陣數據結構允許相應於網格的節點、邊、面和元的自由度。在數據結構上已實現了一和二級BLAS類過程及迭代方法。
已經實現了問題無關的和面向對象框架的廣泛的數值演算法。包括BDF(1), BDF(2)時間步方案、(不精確) Newton方法、CG、CR、BiCGSTAB、乘法局部多重網格、不同類型的的網格轉移運算元、 ILU、Gauss-Seidel、Jacobi和SOR光滑器。這些演算法可用於方程組及標量方程。它們可被任意地嵌套到簡單的腳本命令中,例如,BDF(2)使用Newton法在每個時間步求解非線性問題,Newton法使用具有BiCGSTAB加速的多重網格,多重網格使用一個ILU光滑器和特殊的適合於跳躍系數的截斷網格轉移、粗層解法器使用一個ILU預條件的BiCGSTAB。
腳本語言解釋程序和互動式圖形工具提供了程序運行時的簡單的可視化工具,進一步,例如,稀疏矩陣數據結構可用圖形給出,這對調試是非常有用的。UG的設備驅動程序支持X11和Apple Macintosh。還提供對AVS、TECPLOT和GRAPE的圖形輸出。
此功能的數據並行實現基於DDD。
問題類層次
一個問題類使用UG內核程序來對一類特殊偏微分方程實現離散化、誤差估計子和最終的一個非標准解法器。只有當不能用任何已提供的工具來實現時才需要提供解法器。離散化可由一些工具支持,這些工具允許元素類型和維數與有限元和有限體積法代碼無關。
基於最新版UG內核程序的問題類包括:標量對流擴散、非線性擴散、線彈性、彈塑性、不可壓縮、多孔滲流中密度驅動流和多相。所有這些問題類運行2D/3D且是並行的。
UG獲得2001年最突出設計HLRS金穗獎
如何在UNIX環境中安裝UG
許可協議
UG編程手冊:progmanual.ps,431頁,(771KB),1998.10
UG參考手冊(第I部分):refmanualI.ps,431頁,(918KB),1998.10
UG參考手冊(第II部分):refmanualII.ps,637頁,(1017KB),1998.10
UG應用現問題類文檔:applmanual.ps,254頁,(437KB),1998.10