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