matlab求导
Python,MATLAB代码)
在很多学科中的很多计算任务中都需要⽤到曲线的曲率(或者曲率半径),numpy库⾥和matlab build-in⾥都没有现成的能从离散点来算曲率的⽅法,⽹上到的代码⼜不敢直接⽤,毕竟是要⾼频率⽤到⾃⼰科研上的⼯具,所以决定结合到的资料⾃⼰推⼀下,并造出python和matlab的轮⼦,造福后⼈
公式很简单:
曲率:
在⼆维情况下,其标量形式为:
所以对于解析情况⾮常简单,可以直接对于曲线表达式进⾏解析求导,但是对于离散的点,情况反倒会⽐较复杂,因为这⾥的x和y的⼀阶和⼆阶导数如果直接⽤差分⽅法来计算的话会造成⽐较⼤的误差。
这⾥⽐较保险的做法是,使⽤三个点确定的⼆次曲线的的曲率作为我们估计的曲率:
然后使⽤中间这个点(x2,y2)处的曲率作为这三个点的曲率估计
具体⽅法是先表⽰成参数⽅程的样⼦,
对于曲线参数t,有:
6个未知数,三个点⾥有6个已知分量,列六个⽅程,解出这 (a1,a2,a3), (b1,b2,b3)即可。
这⾥使⽤两段⽮量的长度来作为取值范围:
这⾥我们希望参数⽅程中的t满⾜如下条件:
则有:
以及
写成矩阵形式:
以及
简写为:
可以使⽤求矩阵逆的⽅式求解线性⽅程:
有了(a1,a2,a3)和(b1,b2,b3)就有了曲线的解析⽅程,接下来就和解析求曲率⼀样了,先算变量导数:
然后就是最终的曲率:
这样,任意给定三个点,都可以估计出这三个点是⽐较【弯的】还是⽐较【直的】,直的曲率⼩,van的曲率⼤。随⼿⽣成两个例⼦算算:
(1)圆形:
(2)正弦
波峰和波⾕最弯,0点附近最直。
看起来没⽑病,核对了⽅向和曲率半径⼤⼩的数值,都能对上。这是⼀个可以放⼼使⽤的轮⼦
这⾥我把这个算法实现为Python和MATLAB,详见github:
github/Pjer-zhang/PJCurvature g ithub
===================
Pjer内容分类整理:
精选 射电 编程 科研⼯具 太阳物理
发布评论