MATLABはどうやって離散点の曲率の最大値を取りますか?
余計なことを言わないで、コードを見てください。
補足:MATLAB補間+離散点曲率計算
考え:点が十分に密ならdiff、gradientで曲率を求め、まばらなら先に補間して曲率を計算します。
数式:
点密の場合は曲線座標(1-2)を入力し、1、2次微分(4-9)を求める。式により曲率を求める(10)
点々としている場合
1、散点座標を入力する(1-2)
2、スプライン曲線(B-Spline)などで補間して、フィット曲線(3-4)を得る。
3、diff、gradient関数は適合曲線の一、二次導関数(6-11)を求めます。
4、公式により曲率を求める(12)
例:余弦関数は8点を取って、B-Splineで補間します。
補足用法
最大曲率を求めて図に示す。
曲線のコントラスト
曲率コントラスト
いくつかの補間法の対比
4つの方法を列挙して、それぞれセグメント線形補間、三次スプライン曲線(B-Spline)補間、三次Hermite補間(PCHIP)、修正Akimaセグメントの三次Hermite補間(Akima)です。
Case 1:三次元ソレノイド
三次元ソレノイド点々
補間
視線を落とす
横目を使う
Case 2:二次元台形波
二次元台形波
Case 3:三次元不規則折れ線
三次元不規則折れ線(間隔なし)
比較可能:
Case 1:B-Spline>Akima>PCHIP>Linear
Case 2:Linear>PCHIP>Akima>B-Spline
Case 3:Linear≒PCHIP≒Akima>B-Spline
なので、内挿の時は適切な計算方法を選びます。以上は個人の経験ですので、参考にしていただければと思います。よろしくお願いします。間違いがあったり、完全に考えていないところがあれば、教えてください。
x0 = linspace(0.1,2,100);%x0,y0 ,
y0 = 1./x0;
h1 = abs(diff(x0)) ;
h = [h1 h1(end)];
ht = h;
yapp1 = gradient(y0)./ht; %matlab
yapp2 = del2(y0)./ht; %matlab
k2 = abs(yapp2)./(1+yapp1.^2).^(3/2);
figure
plot(k2)
title(' ')
[~,maxFlag] = max(k2);%
x_max = x0(maxFlag);
y_max = y0(maxFlag);
%
figure
plot(x0,y0,'.-');
hold on;
plot(x_max,y_max,'rp')
title(' ')
xlabel('log10((norm(B*Xk-L)))')
ylabel('log10((norm(Xk)))')
補足:MATLAB補間+離散点曲率計算
考え:点が十分に密ならdiff、gradientで曲率を求め、まばらなら先に補間して曲率を計算します。
数式:
点密の場合は曲線座標(1-2)を入力し、1、2次微分(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
画像は以下の理論値画像と同じです。点々としている場合
1、散点座標を入力する(1-2)
2、スプライン曲線(B-Spline)などで補間して、フィット曲線(3-4)を得る。
3、diff、gradient関数は適合曲線の一、二次導関数(6-11)を求めます。
4、公式により曲率を求める(12)
例:余弦関数は8点を取って、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
補足用法
最大曲率を求めて図に示す。
[max_val,max_ind]=max(curv);
hold on
plot(xx(max_ind),yy(max_ind),'*r');
理論値(コサイン関数曲線)と比較曲線のコントラスト
曲率コントラスト
いくつかの補間法の対比
4つの方法を列挙して、それぞれセグメント線形補間、三次スプライン曲線(B-Spline)補間、三次Hermite補間(PCHIP)、修正Akimaセグメントの三次Hermite補間(Akima)です。
Case 1:三次元ソレノイド
三次元ソレノイド点々
補間
視線を落とす
横目を使う
Case 2:二次元台形波
二次元台形波
Case 3:三次元不規則折れ線
三次元不規則折れ線(間隔なし)
比較可能:
Case 1:B-Spline>Akima>PCHIP>Linear
Case 2:Linear>PCHIP>Akima>B-Spline
Case 3:Linear≒PCHIP≒Akima>B-Spline
なので、内挿の時は適切な計算方法を選びます。以上は個人の経験ですので、参考にしていただければと思います。よろしくお願いします。間違いがあったり、完全に考えていないところがあれば、教えてください。