1 概述
曲率的公式为:
因此求曲率的重点在于获得拟合曲线的一阶导数和二阶导数。
2 Matlab中的实现
2.1 实例1
根据参考资料[5]的提示,可以使用csape()对离散点进行Spline插值,然后使用fnder()对得到Spline曲线求导,最后使用fnval()对导数求值即可。
%% 原数据
x = 0 : 0.1 : 2 * pi;
y = sin(x);
plot(x, y, 'o')
%% spline拟合
pp = csape(x, y);
%% 拟合图
hold on
plot( x, fnval(pp, x), 'g' );
%% 求导
pp1 = fnval(fnder(pp, 1), x); %求一阶导
pp2 = fnval(fnder(pp, 2), x); %求二阶导
%% 曲率,K = |y''| / ((1 + y'^2)^(3/2))
curvature = abs(pp2) ./ sqrt( (1 + pp1 .^ 2) .^ 3 );
%% 曲率图
hold on
plot( x, curvature, 'r' );
%% 图例
legend('原始散点', 'Spline拟合结果', '曲率图');
%% 显示网格
grid on
上述代码的运行结果如下图所示:
2.2 实例2
参考资料[11]给出了另外一个实例:
%% 原始数据点
xx=[-1 0 3 5 8 9 ];
yy=[1 7 -4 0 7 3 ]; %给定6个点
%% spline拟合
sp = spline(xx,yy); % spline(x,y) 曲线插值
x = xx(1):0.01:xx(length(xx)); %通常取x(1)至x(n)
y = ppval(x,sp); % ppval( , ) 分段多项式的值 y的值变为数组y()
subplot(311)
for i=1:length(xx)
plot(xx(i), yy(i),'b*')
hold on
end
plot(x,y,'r');
grid on
title('B样条插值曲线')
%% 斜率计算
for i=1:(length(x)-1)
dx(i)=x(i+1)-x(i);
dy(i)=y(i+1)-y(i); % 离散一次导(相当于连续一次导数)
dddy(i)= dy(i)/dx(i);
end
%% 曲率计算
for i = 1 : (length(x)-2)
ddx(i) = dx(i+1) - dx(i);
ddy(i) = dy(i+1) - dy(i); % 离散二次差分(相当于连续二次导)
K(i)=(dx(i)*ddy(i)-dy(i)*ddx(i))/((dx(i)*dx(i)+dy(i)*dy(i))^1.5); % 曲率
end
subplot(312)
ud=linspace(xx(1),xx(length(xx)),(length(x)-1));
plot(ud,dddy)
grid on
title('曲线斜率变化图')
subplot(313)
uu=linspace(xx(1),xx(length(xx)),(length(x)-2));
plot(uu,K)
grid on
title('曲线曲率变化图')
上述代码执行效果如下图:
参考资料
[1]三次B样条曲率与导数算法Matlab代码
[2]样条曲线
[3]B样条曲线曲率简易求解算法
[4]如何用matlab提取曲线各点曲率
[5]如何得到matlab三次样条曲线插值(csape)之后得到的拟合曲线的曲率图
[6]用matlab求出最小曲率半径曲线方程实例
[7]对离散样点做三次样条曲率计算和求导的matlab程序
[8]知道一些坐标,怎么用matlab画出曲线并计算出曲线的曲率
[9]计算曲率
[10]用MATLAB求曲线在某一点的曲率
[11]对给定的离散点,先拟合成B样条曲线,再求B样条曲线曲率
[12]Curvature of a spline
[13]Curvature of Approximating Curve Subdivision Schemes