笛卡尔坐标系与Frenet坐标系互转,可能需要曲率的导数信息。此出给出推导过程与计算式,方便以后写代码时查阅。

1. 曲线的表示形式

二维平面上的曲线有两种参数化形式,如下所示:

  • 参数方程1
    {xt=x(t)yt=y(t)\left\{\begin{matrix} x_t=x(t) \\ y_t=y(t) \end{matrix} \right. {xt​=x(t)yt​=y(t)​

  • 参数方程2
    {xt=xtyt=y(xt)\left\{\begin{matrix} x_t=x_t \\ y_t=y(x_t) \end{matrix} \right. {xt​=xt​yt​=y(xt​)​

以上两种参数方程都可以唯一确定一条二维平面内的曲线。因此,下文计算的曲率、曲率的导数以及曲率导数的导数的公式都有两种等价的形式。

2. 曲率计算公式及推导

先给出熟悉的曲率计算公式:
k=x′y′′−y′x′′(x′2+y′2)32(对应参数方程1)(1)k=\frac{x'y''-y'x''}{(x'^{2}+y'^{2})^{\frac{3}{2}}} (对应参数方程1)\tag{1}k=(x′2+y′2)23​x′y′′−y′x′′​(对应参数方程1)(1)以及:
k=y′′(1+y′2)32(对应参数方程2)(2)k=\frac{y''}{(1+y'^2)^{\frac{3}{2}}}(对应参数方程2)\tag{2}k=(1+y′2)23​y′′​(对应参数方程2)(2)

2.1 参数方程1曲率公式推导

假定点(xt,yt)(x_t, y_t)(xt​,yt​)处的切角为α\alphaα,则此点处曲线的斜率为tan⁡(α)\tan(\alpha)tan(α)。xt,ytx_t,y_txt​,yt​的变量都为ttt,假定ttt有一个小的增量Δt\Delta_tΔt​,则,xtx_txt​与yty_tyt​相应的都有一个小的增量Δx\Delta_xΔx​与Δy\Delta_yΔy​。如下图所示,当Δt\Delta_tΔt​很小时,ΔyΔx≈tan(α)\frac{\Delta_y}{\Delta_x}\approx tan(\alpha)Δx​Δy​​≈tan(α)。

当Δt→0\Delta_t\rightarrow 0Δt​→0时,Δx\Delta_xΔx​与Δy\Delta_yΔy​为xtx_txt​与yty_tyt​在ttt处的微分,一般分别表示为dxdxdx与dydydy。此时有(其中x′x'x′与y′y'y′表示函数x(t),y(t)x(t),y(t)x(t),y(t)对ttt的导数):dydx=tan⁡(α)⇒dydtdxdt=tan⁡(α)⇒y′x′=tan⁡(α)\frac{dy}{dx}=\tan(\alpha)\Rightarrow \frac{\frac{dy}{dt}}{\frac{dx}{dt}}=\tan(\alpha)\Rightarrow \frac{y'}{x'}=\tan(\alpha)dxdy​=tan(α)⇒dtdx​dtdy​​=tan(α)⇒x′y′​=tan(α)得:

y′x′=tan⁡(α)\frac{y'}{x'}=\tan(\alpha)x′y′​=tan(α)

对上式两边分别求导得:
y′′x′−x′′y′x′2dt=(1+tan⁡2(α))dα=(x′2+y′2x′2)dα\frac{y''x'-x''y'}{x'^{2}}dt=(1+\tan^2(\alpha))d\alpha=(\frac{x'^2+y'^2}{x'^2})d\alphax′2y′′x′−x′′y′​dt=(1+tan2(α))dα=(x′2x′2+y′2​)dα
化简得:
y′′x′−x′′y′x′2+y′2dt=dα\frac{y''x'-x''y'}{x'^2+y'^2}dt=d\alphax′2+y′2y′′x′−x′′y′​dt=dα

又ds=x′2+y′2dtds=\sqrt{x'^2+y'^2}dtds=x′2+y′2​dt,代入上式得到式(1)所示的曲率计算公式(曲率为角度对弧度的导数):

k=dαds=y′′x′−x′′y′(x′2+y′2)32k=\frac{d\alpha}{ds}=\frac{y''x'-x''y'}{(x'^2+y'^2)^{\frac{3}{2}}}k=dsdα​=(x′2+y′2)23​y′′x′−x′′y′​

2.2 参数方程2曲率公式推导

此时曲线的自变量为xxx,曲线在点(xt,yt)(x_t, y_t)(xt​,yt​)处的导数为y′=f′(x)=tan⁡(α)y'=f'(x)=\tan(\alpha)y′=f′(x)=tan(α)得:
y′=tan⁡(α)y'=\tan(\alpha)y′=tan(α)

对上式两边分别求导得:
y′′dx=(1+tan⁡2(α))dα=(1+y′2)dαy''dx=(1+\tan^{2}(\alpha))d\alpha=(1+y'^2)d\alphay′′dx=(1+tan2(α))dα=(1+y′2)dα

化简得:
y′′1+y′2dx=dα\frac{y''}{1+y'^2}dx=d\alpha1+y′2y′′​dx=dα

又ds=1+y′2dxds=\sqrt{1+y'2}dxds=1+y′2​dx,代入上式得到式(2)所示的曲率计算公式:

k=y′′(1+y′2)32k=\frac{y''}{(1+y'^2)^{\frac{3}{2}}}k=(1+y′2)23​y′′​

2.3 小结

两种参数方程得到的曲率公式推导过程相似,最终公式形式也差不多。在表示曲线时,不同情况下用到的参数化方程不一样。为了简便 ,可以统一两种参数方程,令x(t)=tx(t)=tx(t)=t时,参数方程1就变成了参数方程2。此时,x′=1,x′′=0x'=1,x''=0x′=1,x′′=0,代入式(1)就得到式(2)。下文中,只求针对参数方程1的曲率导数k′k'k′以及曲率导数的导数k′′k''k′′。

3. 曲率的导数(或称为变化率)公式及推导

对曲率公式k=y′′x′−x′′y′(x′2+y′2)32k=\frac{y''x'-x''y'}{(x'^2+y'^2)^{\frac{3}{2}}}k=(x′2+y′2)23​y′′x′−x′′y′​两边分别求导:

k′=dkds=(y′′x′−x′′y′)′(x′2+y′2)32−((x′2+y′2)32)′(y′′x′−x′′y′)(x′2+y′2)3dtdsk'=\frac{dk}{ds}=\frac{\frac{(y''x'-x''y')'(x'^2+y'^2)^{\frac{3}{2}}-((x'^2+y'^2)^{\frac{3}{2}})'(y''x'-x''y')}{(x'^2+y'^2)^3}dt}{ds}k′=dsdk​=ds(x′2+y′2)3(y′′x′−x′′y′)′(x′2+y′2)23​−((x′2+y′2)23​)′(y′′x′−x′′y′)​dt​

将ds=x′2+y′2dtds=\sqrt{x'^2+y'^2}dtds=x′2+y′2​dt代入上式得:
k′=(y′′′x′+y′′x′′−x′′′y′−x′′y′′)(x′2+y′2)32−32(x′2+y′2)12(2x′x′′+2y′y′′)(y′′x′−x′′y′)(x′2+y′2)3(dtds)=(x′2+y′2)12[(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)](x′2+y′2)31(x′2+y′2)12=(y′′′x′+y′′x′′−x′′′y′−x′′y′′)(x′2+y′2)32−32(x′2+y′2)12(2x′x′′+2y′y′′)(y′′x′−x′′y′)(x′2+y′2)3(dtds)=(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)(x′2+y′2)3k'=\frac{(y'''x'+y''x''-x'''y'-x''y'')(x'^2+y'^2)^{\frac{3}{2}}-\frac{3}{2}(x'^2+y'^2)^{\frac{1}{2}}(2x'x''+2y'y'')(y''x'-x''y')}{(x'^2+y'^2)^3}(\frac{dt}{ds})\\=\frac{(x'^2+y'^2)^{\frac{1}{2}}[(y'''x'-x'''y')(x'^2+y'^2)-3(x'x''+y'y'')(y''x'-x''y')]}{(x'^2+y'^2)^3}\frac{1}{(x'^2+y'^2)^{\frac{1}{2}}}\\=\frac{(y'''x'+y''x''-x'''y'-x''y'')(x'^2+y'^2)^{\frac{3}{2}}-\frac{3}{2}(x'^2+y'^2)^{\frac{1}{2}}(2x'x''+2y'y'')(y''x'-x''y')}{(x'^2+y'^2)^3}(\frac{dt}{ds})\\=\frac{(y'''x'-x'''y')(x'^2+y'^2)-3(x'x''+y'y'')(y''x'-x''y')}{(x'^2+y'^2)^3}k′=(x′2+y′2)3(y′′′x′+y′′x′′−x′′′y′−x′′y′′)(x′2+y′2)23​−23​(x′2+y′2)21​(2x′x′′+2y′y′′)(y′′x′−x′′y′)​(dsdt​)=(x′2+y′2)3(x′2+y′2)21​[(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)]​(x′2+y′2)21​1​=(x′2+y′2)3(y′′′x′+y′′x′′−x′′′y′−x′′y′′)(x′2+y′2)23​−23​(x′2+y′2)21​(2x′x′′+2y′y′′)(y′′x′−x′′y′)​(dsdt​)=(x′2+y′2)3(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)​

最后提取k′k'k′的计算公式如下:

k′=(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)(x′2+y′2)3(对应参数方程1)(3)k'=\frac{(y'''x'-x'''y')(x'^2+y'^2)-3(x'x''+y'y'')(y''x'-x''y')}{(x'^2+y'^2)^3} (对应参数方程1) \tag{3}k′=(x′2+y′2)3(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)​(对应参数方程1)(3)

令x′=1,x′′=0,x′′′=0x'=1, x''=0, x'''=0x′=1,x′′=0,x′′′=0代入式(3)可得参数方程2的k′k'k′计算公式如下:

k′=y′′′+y′′′y′2−3y′y′′2(1+y′2)3(对应参数方程2)(4)k'=\frac{y'''+y'''y'^2-3y'y''^2}{(1+y'^2)^3} (对应参数方程2)\tag{4}k′=(1+y′2)3y′′′+y′′′y′2−3y′y′′2​(对应参数方程2)(4)

4. 曲率导数的导数公式及推导

k′′=dk′ds=d(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)(x′2+y′2)3dsk''=\frac{dk'}{ds}=\frac{d\frac{(y'''x'-x'''y')(x'^2+y'^2)-3(x'x''+y'y'')(y''x'-x''y')}{(x'^2+y'^2)^3}}{ds}k′′=dsdk′​=dsd(x′2+y′2)3(y′′′x′−x′′′y′)(x′2+y′2)−3(x′x′′+y′y′′)(y′′x′−x′′y′)​​

算不下去了。。。。。

不过计算方式和曲率的导数一样。

5. C++与Python函数实现

计算曲率和曲率导数的c++函数如下:

// kappa = (dx * d2y - dy * d2x) / [(dx * dx + dy * dy)^(3/2)]
double CurveMath::ComputeCurvature(const double dx, const double d2x,const double dy, const double d2y) {const double a = dx * d2y - dy * d2x;auto norm_square = dx * dx + dy * dy;auto norm = std::sqrt(norm_square);const double b = norm * norm_square;return a / b;
}double CurveMath::ComputeCurvatureDerivative(const double dx, const double d2x,const double d3x, const double dy,const double d2y,const double d3y) {const double a = dx * d2y - dy * d2x;const double b = dx * d3y - dy * d3x;const double c = dx * d2x + dy * d2y;const double d = dx * dx + dy * dy;return (b * d - 3.0 * a * c) / (d * d * d);
}

计算曲率和曲率导数的python函数如下:

def ComputeCurvature(dx, ddx, dy, ddy):a = dx*ddy - dy*ddxnorm_square = dx*dx+dy*dynorm = sqrt(norm_square)b = norm*norm_squarereturn a/bdef ComputeCurvatureDerivative(dx, ddx, dddx, dy, ddy, dddy):a = dx*ddy-dy*ddxb = dx*dddy-dy*dddxc = dx*ddx+dy*ddyd = dx*dx+dy*dyreturn (b*d-3.0*a*c)/(d*d*d)def ComputeCurvature(dy, ddy):a = ddy norm_square = 1+dy*dynorm = sqrt(norm_square)b = norm*norm_squarereturn a/bdef ComputeCurvatureDerivative(dy, ddy, dddy):a = ddyb = dddyc = dy*ddyd = 1.0+dy*dyreturn (b*d-3.0*a*c)/(d*d*d)

END
by windSeS
2020.9.6

曲率、曲率(对弧长)的导数以及曲率导数(对弧长)的导数的计算相关推荐

  1. Spline导数及曲率计算

    0 前言 曲率的公式为: 因此求曲率的重点在于获得拟合曲线的一阶导数和二阶导数. 1 实例1 根据参考资料[5]的提示,可以使用csape()对离散点进行Spline插值,然后使用fnder()对得到 ...

  2. 高等数学笔记-乐经良老师-第四章-微分中值定理和导数的应用-第四节-利用导数研究函数性态

    高等数学笔记-乐经良 第四章 微分中值定理和导数的应用 第四节 利用导数研究函数性态 一.极值与最值 01 极值 必要条件:费马定理 充分条件(充分非必要条件) 第一充分条件(极值第一判别法) 设 f ...

  3. 考研高数 专题3:导数的概念及应用(用导数定义求_极限_导数_判断可导性)【难】

    文章目录: 例题1:导数定义 一:利用导数定义求极限 例题1:导数定义

  4. 等于x分之a的平方的导数_清华学霸丨手把手教你导数大题如何骗分(文理通用),家长为孩子收...

    文科和理科导数题差异不明显(大概就是理科有三题,文科考前两题这种难度差异),因此文科的同学也可以阅读此文章,对于导数过于难以理解的知识,跳过即可. Ⅰ.在解题之前 有几件事大家需要明白: 1.导数题作 ...

  5. matlab 导数表达式,matlab语言怎样表示x的导数,matlab 如何求自定义函数的导数

    matlab的求导命令与求导法 建立符号变量命令sym和syms调用格式: x=sym('x'), 建立符号变量x: syms x y z , 建立多个符号变量x,y,z: matlab求导命令dif ...

  6. Oracle导数常见问题-IMP-00003: 遇到 ORACLE 错误 20001,导数据出现问题

    遇到这个错误是因为exp和imp的版本存在差异,最简单的解决方法是在写的sql语句后加上statistics=none,即: imp 用户名/密码@orcl log=D:\存放log的位置 file= ...

  7. c语言算法求e的x次方的导数,【e的x次方的导数】-e的x次方的导数-数学-宣苹谕...

    概述:本道作业题是俞林友同学的课后练习,分享的知识点是假如世界上没有音乐,指导老师为宦老师,涉及到的知识点涵盖:[假如世界上没有了音乐,世界就会变得越来越平凡乏味.访写]-假如世界上没有音乐,下面是俞 ...

  8. 高等数学笔记-乐经良老师-第四章-微分中值定理和导数的应用-第五节-曲线的曲率

    高等数学笔记-乐经良 第四章 微分中值定理和导数的应用 第五节 曲线的曲率 一.弧长和弧微分 弧长 曲线内接折线长度的极限 ( 组成折线的线段长 → 0 \rightarrow 0 →0​​ ) 设曲 ...

  9. 【机器学习的高等数学基础】导数的几何意义和物理意义、函数的可导性与连续性之间的关系、平面曲线的切线和法线、基本导数与微分表、微分中值定理,泰勒公式、弧微分、曲率、曲率半径、洛必达法则、渐近线的求法等

    机器学习的数学基础 高等数学 文章目录 机器学习的数学基础 高等数学 1.导数定义: 导数和微分的概念 2.左右导数导数的几何意义和物理意义 3.函数的可导性与连续性之间的关系 4.平面曲线的切线和法 ...

  10. 光滑曲线_微分几何笔记(4) —— 二维三维空间中曲线的曲率以及环绕数

     本篇文章我们从一般化的 空间回到我们生活的 空间,看看低维空间中的曲线有哪些性质,主要计算下在非弧长参数下的曲线,曲率挠率的一般表达式. 最后引入环绕数的概念,讲讲怎么数曲线转了多少圈. 4.1 ...

最新文章

  1. 软考网络工程师身份证忘记领取啦怎么办
  2. php内存缓存设计,求选择哪个缓存设计好一些?
  3. 皮一皮:好的团队合作比什么都有用!
  4. php面试常问的问题
  5. 4.7 参数 vs 超参数-深度学习-Stanford吴恩达教授
  6. 机器学习算法基础——机器学习概述
  7. Sea Battle
  8. w10计算机无法打印,老司机解答win10系统电脑无法打印的详细技巧
  9. Ramfs、rootfs 和initramfs
  10. 如何用一段代码证明JVM加载类是懒加载模式?分享PDF高清版
  11. (2015省赛系列--团体热身赛第二场)
  12. Redis安装教程(各种坑)
  13. 1996年考研数学一解析pdf
  14. linux 卸载skype,在Ubuntu 20.04系统下使用snap和apt安装Skype的方法
  15. Atom处理器喜迎周岁生日 主频达2GHz
  16. 百度女程序员半夜打车被司机嘲讽:加班到一点,收入不如我,图啥
  17. vivo信号无服务器,vivo X50上手实测,连央视都夸的国货之光究竟体验如何?
  18. 三维坐标 偏转_三维坐标系旋转
  19. php时间戳、日期datetime转换
  20. IBM Websphere MQ 使用详解

热门文章

  1. ORACLE RAC 11.2.0.4 一节点出现Suspending MMON slave action kewrmrfsa_ for 82800 seconds
  2. vue项目,地址栏中含有#是什么意思?如何去掉?
  3. 重试利器之Guava Retrying
  4. openoffice java_java代码实现开启openoffice服务和关闭sffice.exe进程
  5. android是什么意思
  6. python实现中文情感分析与可视化
  7. TOP15 科幻小说系列
  8. 把txt 转换成CHM的目录或Index
  9. tibco往服务器发消息,教程:使用 TIBCO EMS 消息上下文属性 - BizTalk Server | Microsoft Docs...
  10. 计算机多媒体中的媒体种类,多媒体计算机中的媒体信息是指什么