MATLAB 如何求取離散點(diǎn)的曲率最大值
我就廢話不多說了,大家還是直接看代碼吧~
x0 = linspace(0.1,2,100);%x0,y0驗(yàn)證函數(shù)離散點(diǎn),可以非等間隔 y0 = 1./x0; h1 = abs(diff(x0)) ; h = [h1 h1(end)]; ht = h; yapp1 = gradient(y0)./ht; %matlab數(shù)值近似 yapp2 = del2(y0)./ht; %matlab數(shù)值近似 k2 = abs(yapp2)./(1+yapp1.^2).^(3/2); figure plot(k2) title('曲率曲線') [~,maxFlag] = max(k2);%曲率最大位置 x_max = x0(maxFlag); y_max = y0(maxFlag); %畫出圖像 標(biāo)注曲率最大點(diǎn) figure plot(x0,y0,'.-'); hold on; plot(x_max,y_max,'rp') title('標(biāo)注最大曲率點(diǎn)') xlabel('log10((norm(B*Xk-L)))') ylabel('log10((norm(Xk)))')
補(bǔ)充:MATLAB 插值+計(jì)算離散點(diǎn)曲率
思路:點(diǎn)足夠密的話直接用 diff、gradient 求曲率,稀疏的話先插值再算曲率。
公式:
點(diǎn)密的情況 輸入曲線坐標(biāo)(1-2)求一、二階導(dǎo)數(shù)(4-9)通過公式求得曲率(10)
x = 0:0.01:7; y = cos(x*0.5*pi); h1 = abs(diff(x)); h = [h1 h1(end)]; ht = h; y1 = gradient(y)./ht; y2 = gradient(y1)./ht; curv = abs(y2)./sqrt((1+y1.^2).^3); plot(x,y,'-',x,curv,'--r); legend('Raw Data, 'Curvature','Location',"best"); grid on
圖像與下文理論值圖像相同
點(diǎn)稀疏的情況
1、輸入散點(diǎn)坐標(biāo)(1-2)
2、用樣條曲線(B-Spline)等方法插值得到擬合曲線(3-4)
3、diff、gradient 函數(shù)求擬合曲線的一、二階導(dǎo)數(shù)(6-11)
4、通過公式求得曲率(12)
例:余弦函數(shù)取 8 個(gè)點(diǎn),用 B-Spline 插值
x = 0:1:7; y = cos(x*0.5*pi); xx = 0:0.01:7; yy = spline(x,y,xx); h1 = abs(diff(xx)); h = [h1 h1(end)]; ht = h; yy1 = gradient(yy)./ht; yy2 = gradient(yy1)./ht; curv = abs(yy2)./sqrt((1+yy1.^2).^3); plot(xx,yy,'-',xx,curv,'--r',x,y,'o-'); legend('B-Spline', 'Curvature','Raw Data','Location',"best"); grid on
補(bǔ)充用法
求最大曲率并在圖中標(biāo)出
[max_val,max_ind]=max(curv); hold on plot(xx(max_ind),yy(max_ind),'*r');
與理論值(余弦函數(shù)曲線)對(duì)比
曲率對(duì)比
幾種插值方法對(duì)比
列舉四種方法,分別為:分段線性插值、三次樣條曲線(B-Spline)插值、三次 Hermite 插值(PCHIP)、修正 Akima 分段三次 Hermite 插值(Akima)
Case 1: 三維螺線
三維螺線散點(diǎn)
插值
俯視
側(cè)視
Case 2:二維梯形波
二維梯形波
Case 3:三維不規(guī)則折線
三維不規(guī)則折線(不等間距)
對(duì)比可得:
Case 1:B-Spline>Akima>PCHIP>Linear
Case 2:Linear>PCHIP>Akima>B-Spline
Case 3:Linear≈PCHIP≈Akima>B-Spline
故在插值的時(shí)候需要選擇適合的計(jì)算方法
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
利用PyCharm操作Github(倉庫新建、更新,代碼回滾)
這篇文章主要介紹了利用PyCharm操作Github(倉庫新建、更新,代碼回滾),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12在Django中進(jìn)行用戶注冊(cè)和郵箱驗(yàn)證的方法
這篇文章主要介紹了在Django中進(jìn)行用戶注冊(cè)和郵箱驗(yàn)證的方法的相關(guān)資料,需要的朋友可以參考下2016-05-05python分布式爬蟲中消息隊(duì)列知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是python分布式爬蟲中消息隊(duì)列知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們可以參考下。2020-11-11使用Python?matplotlib繪制簡單的柱形圖、折線圖和直線圖
Matplotlib是Python的繪圖庫, 它可與NumPy一起使用,提供了一種有效的MatLab開源替代方案,下面這篇文章主要給大家介紹了關(guān)于使用Python?matplotlib繪制簡單的柱形圖、折線圖和直線圖的相關(guān)資料,需要的朋友可以參考下2022-08-08