曲線擬合與繪製

2021-08-09 19:46:54 字數 1832 閱讀 5622

2017-07-27

在學習圖形學課程中,乙個很重要的部分就是繪製曲線、曲面。其實,這部分需要的基礎課程有「最優化」、「數值分析」,其實,想要完全弄清楚,還是有一定難度的。但是,曲線、曲面的繪製是分為兩部分的,一部分是數學,一部分是繪製。

一,擬合

簡單來講,問題的定義是:我們通常會獲取到一些離散的點,二維的、三維的, 比如在cad軟體開發需求中,我們經常獲取到的資料可能是手工測量的,可能是手繪的,可能是從檔案中儲存離散點,我們想要知道穿過這些點的曲線的函式,方便後續更加精密的加工。又或者我們已經有曲線方程。此後,我們需要把曲線繪製出來。

1.1,擬合簡單函式

當我們知道這些點表示的圖形大概是什麼曲線。比如說知道它是二次曲線,就想辦法求出來 f(x) = ax2 + bx +c , 如果是三次曲線,就求出來方程 f(x) = ax3 + bx2 + cx + d。對於更曲折的曲線,需要使用更高次的函式來擬合資料。

scipy.optimize.curve_fit() 可以用來擬合線性、非線性方程,這個演算法是利用 least squares實現的。至於least squares方法計算的時候,針對求解的問題,誤差和引數還有不同的演算法,如無約束問題採用「levenberg-marquardt方法」;如果提供了邊界值,則採用trust region reflective 演算法。我們需要特別注意「最小二乘」,它的重要性是如此之高,是一定要掌握的。上面的例子及**演示了我們知道函式是什麼形式的,但是,有些時候,我們並不知道曲線的方程形式,或者曲線過於曲折。 樣條曲線一般由多項式分段定義表示。在插值問題中,樣條插值通常比多項式插值好用。多項式分段時,每一條曲線都用低階的 多項式表示,我們可以用多段曲線連線成一條曲線。

1.2,擬合高次曲線

我們一般不會願意處理高次函式的,一者計算量大,二者計算誤差大。 所以,我們會使用多段的低次曲線連線起來,來擬合複雜曲線。 spline 有很多種,我們常見的有bezier spline,b-spline,nurbs,hermitian spline, catmull-rom spline等等,演算法都是不一樣的。

在向量作圖軟體中,多段三次bezier曲線用的較多,在cad中,bezier spline有所不足,每改變乙個控制點,就會改變曲線的整體樣式。可謂牽一髮而動全身。b-spline,nurbs使用較多,工業上實際的標準是nurbs,像一些簡單的場合,想我們團隊在做的製衣cad軟體裡,只用b-spline就足夠了。b-spline分為均勻與非均勻的,當節點等距,稱b樣條為均勻(uniform)否則為非均勻(non-uniform)。但是nurbs並不是後面乙個,它的全稱是」非均勻有理b樣條「。

scipy.interpolate.univariatespline() 的引數中,k,整型,可選值,預設為5,最高為5。為什麼呢?由於龍格現象會導致數值不穩定,得出來的曲線,可能並不是我們想要的。univariatespline 這個函式呼叫了 fitpack2模組的  splev(x, tck, der=0, ext=0) 函式,這裡寫著」evaluate a b-spline or its derivatives「,所以,我們可以看到scipy lib中使用b-spline來做曲線擬合的。對於n次 b-spline來講,它是有多條二,繪製

一般需要繪製曲線的,都是cad軟體的開發工作,基本上用c/c++、opengl來實現。其實沒有必要,這裡就使用最常見的python就能夠學習相關的演算法了。python2.7之後pip變得越來越好了,常見lib都能夠處理了。對於windows上的python lib,建議參考鏈結2,不用自己編譯或者安裝exe,可使用第三方已經做好的whl包。

對於計算機而言,一切都是離散的。所以,所謂的無限連續的曲線,展示的時候,也是一段段的小的直線段連線起來的。主流的顯示螢幕解析度1920×1080,展現出來的曲線,也只是離散的點連線起來的而已。

[主頁 ]

MATLAB 曲線擬合

x0.1 0.20.15 0.0 0.2 0.3y 0.95 0.84 0.86 1.06 1.50 0.72 函式功能多項式的擬合運算 呼叫方法polyfit x,y,n x為橫座標,y為縱座標,n為擬合階數。例子x 0 0.1 2.5 1y erf x p polyfit x,y,6 p 0.0...

matlab 曲線擬合

在matlab中經常需要對資料進行曲線擬合,如最常見的多項式擬合,一般可以通過cftool呼叫曲線擬合工具 curve fit tool 通過圖形介面可以很方便的進行曲線擬合,但是有些時候也會遇到不方便用圖形工具。因此這裡簡單的記下兩種常用的擬合方法。1 多項式擬合 polyfit和polyval ...

Python曲線擬合

z1 np.polyfit x,y,5 用3次多項式擬合 p1 np.poly1d z1 print p1 在螢幕上列印擬合多項式 yvals p1 x 也可以使用yvals np.polyval z1,x plot1 plt.plot x,y,k.markersize 16,label origi...