找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1828|回复: 5

[求助] [求助]:二阶导数SECONDDERIV的问题

[复制链接]
发表于 2006-2-27 20:14:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
高数学的不好,不过还依稀记得二阶导数是一阶导数的变化率,VLA-GETSECONDDERIV得到的是一个矢量,如何比较二阶导数的大小?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-2-27 20:17:17 | 显示全部楼层
太高深了,期待高人解决,好学习一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-28 09:06:34 | 显示全部楼层
这个问题应该比较有趣,于是查了一下资料
A. acad本身的帮助,first second
vlax-curve-getFirstDeriv:返回曲线在指定位置的第一个衍生(在 WCS 中),vlax-curve-getSecondDeriv第二个
应该可以说看了等于白看,于是google,发现如下两个讨论
B.mjtd的http://www.mjtd.com/bbs/printpage.asp?BoardID=3&id=14731
C. Autodesk论坛的http://discussion.autodesk.com/thread.jspa?threadID=328817
看了B之后,有了一定的认识,C的讨论比较深入,也有诸多高人开口。
于是借B中的程序,修改了一下,得到如下测试程序

  1. (defun c:test (/ os ent curve-obj pt para dir1 ang)
  2.   (vl-load-com)
  3.   (setq os (getvar "osmode"))
  4.   (setq ent (car (entsel)))
  5.   (setq curve-obj (vlax-ename->vla-object ent))
  6.   (setvar "osmode" 512)
  7.   (while (setq pt (getpoint "Pick a point:"))
  8.     (setq para (vlax-curve-getParamAtPoint curve-obj pt))
  9.     (setq dir0 (vlax-curve-getFirstDeriv curve-obj para))
  10.     (setq dir1 (vlax-curve-getsecondDeriv curve-obj para))
  11.     (setq oring (list 0 0 0))
  12.     (grdraw oring dir0 2)
  13.     (grdraw oring dir1 3)
  14.     (setq ang0 (angle oring dir0))
  15.     (setq ang (angle oring dir1))
  16.     (setq leng0 (distance oring dir0))
  17.     (setq leng (distance oring dir1))
  18.     (setvar "osmode" 0)                       
  19.     (command "_.color" 2)
  20.     (command "_.line" pt (polar pt ang0 leng0) "")
  21.         (getstring "\nBreakpoint 1, 这个是firstderiv画出来的线...");Erase_BP
  22.     (command "_.color" 3)
  23.     (command "_.line" pt (polar pt ang leng) "")
  24.         (getstring "\nBreakpoint 1, 这个是secondderiv画出来的线...");Erase_BP
  25.     (setvar "osmode" os)
  26.   )
  27.   (setvar "osmode" os)
  28.   (princ)
  29. )

然后作几个测试,参照C中的好多思路,得到如下个人一些看法
1. 按道理一条曲线的一阶导数和二阶导数都应该是一个标量(数值),为什么会变成一个矢量

个人看法:
这个是基于笛卡儿座标系的标量代数(这个说法可能不标准)和矢量代数的区别,
在平面标量代数中,一个曲线的表达是y=f(x),它只有数值,没有方向
而在矢量代数中,函数的表达是r=r(t),它和时间有关系,其中的r是一个从原点指向函数上一点的一个矢量。

在标量代数中,导数就是dy/dx,这个得到的是一个数值,二阶导数d2y/d2x仍然是一个数值。
而在矢量代数中,导数是dr/dt=dx/dt+dy/dt,可以看出,它是由一个x方向的增量矢量和一个y方向的增量矢量的叠加,从下图可以看出,一阶导数dr1或者dr2,在时间t为无穷小时,就代表了曲线的切线,把这个切线的斜率取出,就是标量代数的斜率数值,对于二阶导数,标量代数代表的是曲线的凹度,也就是曲率变化程度
而对于矢量代数,同样的道理,它是一阶导数矢量的变化率,把dr1和dr2平移到蓝色位置(为了好显示),得到一个d2r/dt2,这个就是二阶导数的矢量数值
也就是acad中vlax-curve-getSecondDeriv得到的矢量方向(注意,这个时候得到的一个点和原点要连接,就代表了这个向量,而向量是可以平移的),因此楼主说的大小比较,其实也可以从一个曲线的弯曲变化程度来看的,曲的越厉害,二阶导数越大

但是那么这个矢量长度究竟是多少,其实我们可以发现,在前面的过程中,存在着一个时间t的函数,那么时间又代表什么意思呢。

在mjtd里面,最后一位大哥提到了位移,速度,加速度这个,应该让人豁然开朗。

这里面,首先要假设的是:一个物体沿着这条直线作匀速运动(这个很重要),那么,一阶导数就代表了速度,二阶导数就代表了加速度,比如我们平常
提到的匀速圆周运动,速度就是圆的切线,而加速度就对准圆心,各位可以用lisp测试一下。这里面,由于运动速度不知道,因此一阶导数和二阶导数的
具体大小(矢量的模)其实存在着问题,acad会自己规定一个大小,这个在2中讨论
不过mjtd的那位大哥提到的有了切线,法线还难么,个人有些不同的看法,二阶导数不一定是垂直于一阶导数的,对椭圆而言,其二阶导数是指向椭圆中心的

2.矢量长度具体大小的多少,似乎随着不同的曲线类型有所变化,大家可以测试一下各种曲线
个人参考C中说法,测试了直线、椭圆、圆、pline,spline几种
发现,对于直线而言,vlax-curve-getFirstDeriv得到的是一个与直线切线方向相同矢量,长度和直线长度相同,vlax-curve-getSecondDeriv为0(这个是肯定的)
对于圆而言,vlax-curve-getFirstDeriv得到的一个切线矢量,长度和圆半径相同,vlax-curve-getSecondDeriv为得到的矢量和一阶矢量垂直,大小等于圆半径(这个是规定的)
对于椭圆而言,vlax-curve-getFirstDeriv得到的一个切线矢量,长度等于某种椭圆半径(这个比较难表达,大家测试就知道),vlax-curve-getSecondDeriv为得到的矢量指向椭圆中心,大小等于点到中心半径(这个是规定的)
对于折线型pline,vlax-curve-getFirstDeriv得到的一个切线矢量,长度等于所选段pline长度,vlax-curve-getSecondDeriv为得到0(这个是肯定的)
对于spline而言,vlax-curve-getFirstDeriv得到的一个切线矢量,长度很小,不知道怎么规定的,vlax-curve-getSecondDeriv一个切线矢量的变化率矢量,长度也不知道怎么规定的(这个是肯定的)

不好意思,罗里罗嗦讲了一堆,可能把一个简单的问题复杂化了,也可能不是很对题,也说不定讲错了,请指正。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-1 06:09:13 | 显示全部楼层
平面上的曲线好理解,空间曲线怎么有跟时间有关系???如果跟时间有关,那么对于给定的一条空间曲线,它的二阶导数岂不是随时间变化???
简单的说,二阶导数是曲线陡缓的一个度量,用一个矢量怎么计算大小:
点1 (setq deriv1(vlax-curve-getFirstDeriv cur pt1))
点2 (setq deriv2vlax-curve-getFirstDeriv cur pt2))
我想知道曲线在点1的弯陡一些,还是点2陡一些,
如果 (>  点1的二阶导数 点2的二阶导数) ,那么,在点1曲线要陡。
可是,点1的二阶导数与(vlax-curve-getFirstDeriv cur pt1)到底是什么关系?
是(distance '(0 0 0) (vlax-curve-getFirstDeriv cur pt1))即矢量长度吗?那么正负号又怎么确定呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-1 18:46:43 | 显示全部楼层
(setq para (vlax-curve-getParamAtPoint curve-obj pt)) 一句中,para 参数中得到值表示什么呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-4 09:14:17 | 显示全部楼层
首先,我先指出我前面的一个错误,认为物体是匀速运动的,这个是片面的。

通过几天的思索,我觉得这个问题越来越有意思了,也想的越来越多。

---------------------------------
关于时间t的问题。
我是这样认为的,可以这样来看待一条曲线,一条在座标平面(空间)上客观存在的曲线是一条曲线,把一个手榴弹扔出去形成的一条和时间有关系的抛物线也是一条曲线。
---------------------------------
acad对曲线采用了参数方程的定义。就是一个parameter,我们可以通过下面这个lisp检查一条曲线的parameter分布。
在这里面,曲线是有起点0,也有终点endparam的,我们可以简单的认为这个param是一个时间,在0时刻的时候它停在起点,在param时刻它到达终点。
[php]
(defun c:L1 ()
(vl-load-com)
(setvar "pdmode" 3)
(setq obj (vlax-ename->vla-object(car(entsel))))
(setq endparam (vlax-curve-getEndParam obj))
(setq divi (/ endparam 50.0))
(setq sdivi 0)
(repeat 50
(setq start (vlax-curve-getpointatparam obj sdivi))
(setq sdivi (+ sdivi divi))
(command "point" start)
)
)
[/php]


我们也可以看出,param的分布对于直线,圆是均匀的,而对于椭圆、spline及pline的不同区间是不均匀的,这个表明了,这个不是匀速运动的。在椭圆比较平缓的地方,单位时间内的位移比较大,而在急转弯的地方,单位时间内的位移比较小,也就是速度比较小,firstderiv的矢量长度比较小,方向呢,始终沿着切线方向(这个由微时间内的两个位移矢量相减可以容易得到)

---------------------------------
我们可以看出,对于一条直线,它的起点par是0,终点是1,中间是均匀的。假如它的长度是L的话,那么,它的速度就是L/1=L,方向沿着这个方向,而加速度由于不同时间的速度方向及大小都相同,因此加速度为0,secondderiv为0。

---------------------------------
对于一个圆,它的起点par是0,终点是2π=6.28(为什么这么定义呢?我现阶段的认为就是acad公司人为的规定,autodesk的disccusion中也分为两派,一派认为要弄清楚它为什么,另外一派认为是黑箱操作,不要去理它)。由于圆的par也是均匀分布的(为什么要均匀分布呢?我认为par的分布是为了给secondderiv服务,为了让secondderiv得到的加速度矢量数值可以来表示曲线的凹凸程度),因此圆的周长是2πR,那么其速度大小为2πR/2π=R,其加速度大小为a=V*V/R=R*R/R=R(这个是物理匀速圆周运动的公式),这两个大小可以通过3楼的Lisp得到验证。可以发现,时间是在这里面出现了,param=2π,由于时间是人为规定了,在运算过程中被消掉了。

我们完全可以这样认为,这是autodesk公司的人为规定,因为假如沿着圆进行加速运动的时候,这个firstderiv和secondderiv将完全不一样。

---------------------------------
对于一个椭圆,概念和圆差不多,但是它的para是不均匀的,在平缓处分布得疏,在急弯处分布的密,我们可以发现这样的情况,加速度始终指向中心,速度大小也始终变化。在平缓处的速度大,加速度小,凹凸度也小。在急弯处的速度小,加速度大,凹凸度也大,所以我个人认为,加速度矢量的大小可以代表凹凸程度,也就是楼主说的可以用distance的绝对值大小来代表凹凸度,这个在spline里面也可以得到验证,对于平面曲线和空间曲线都是一样的,因为我们发现,用参数方程表示的曲线,firstderiv和secondderiv和座标系,座标原点是没有关系的,这个非常好。
对于椭圆,我发现存在这样的规律,就象是星系中的星空开普勒定律
开普勒定律认为:行星(地球)绕着恒星(太阳)旋转的时候,太阳和行星的连线在相等的时间内扫过相等的面积。
所以对于椭圆,其加速度指向中心是符合万有引力,其速度的大小满足r*mv=定值(注意,是矢量乘法,r和v是矢量)的物理规律。


所以,反过来,我认为,param的不均匀分布是为secondderiv满足合理化规律而服务的。

---------------------------------
对于一个折线pline,它的param分布是第一个折段为0-1,第二个折段为1-2,依次递加的,所以,它的速度沿着同段是均匀的,不同段间是不均匀的。

---------------------------------
对于spline,它的param值非常大,可以达到几十,现在还没有发现它的大小规律,但是初步的感觉是这样的,spline是一种高次曲线,比直线1次,圆2次的都高,随着次数的增大,其param值变大,而且增长速度快。所以我们可以发现,其速度值非常小,因为同样的 ds/dt,由于t变的很大,所以速度变小,同样的,加速度也变得很小,所以我们看到的firstderiv和seconderiv都很小。但是由于对凹凸度secondderiv的矢量长度及Param的分布研究,我们同样可以认为,secondderiv的矢量大小可以表示凹凸度的大小。

---------------------------------

总结如上的测试结果及思想,个人的看法是
1.不能把firstderiv 和secondderiv和一阶导数和二阶导数等同起来,但是
一阶导数确实是firstderiv的矢量的方向角tan值。而secondderiv的矢量大小可以定量的来判断同一个曲线不同位置的凹度(曲度)
secondderiv的矢量长度越大,代表的曲线在这个位置的曲度越大。它不存在座标代数的正负数值,对空间曲线及平面曲线都一样。
二阶导数和一阶导数的关系是:secondderiv是firstderiv对param的导数,可以通过画出一个微param内的两个速度的差,比上d(param),不过验证起来可能有点难。


2.时间这个参数t是蕴涵在firstderiv和seconderiv里面的,但由于autodesk人为定义了param的分布,所以,时间参数最终没有体现出来。

我的问题是:
acad定义param的方法是什么,我只是看出了大概,但是应该有一个统一的定义的,大概是我数学不过关,请大家指点。

可能是这个问题我想的有点偏吧,好像对楼主的问题一直都回答的不好,也希望哪位大侠再发表一下讲解,谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 23:58 , Processed in 0.345890 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表