家园首页· 下载中心· 图纸中心· 文章中心· 教学中心· 晓东词典· 资源中心· FTP联盟· 校友录· 邮购服务
   论坛首页免费注册个人设置帮助退出论坛 爱心币规则  快速链接 游乐园  

  为改善网站速度,本站接受大家捐款,共建家园,点击查看汇款方法和捐款朋友名单...


晓东CAD家园 : Powered by vBulletin version 2.2.1 家园首页 >> 家园论坛 > …编程开发版块 > ※AutoLISP/VLISP 开发技术※ > [求助]:二阶导数SECONDDERIV的问题
  上一主题   下一主题
作者
主题 发布新主题    回复主题
LADESIGNER [查找更多关于LADESIGNER的帖子]
超级会员


ID: No.155489
发贴数: 353

经验值: 53%
等级: 17 级

现金:435¥
存款:47¥

积分: 6
注册日期: 2004.07.06
日均在线: 0.14 小时
来  自: 青岛
1楼楼主说:[求助]:二阶导数SECONDDERIV的问题

高数学的不好,不过还依稀记得二阶导数是一阶导数的变化率,VLA-GETSECONDDERIV得到的是一个矢量,如何比较二阶导数的大小?



向版主反映该贴 | IP: 已记录


2006年02月27日 12:14
LADESIGNER 离线引用回复 点这里给 LADESIGNER 发送一条悄悄话 查找 LADESIGNER 的更多帖子 编辑/删除
marcoyuwen [查找更多关于marcoyuwen的帖子]
高级会员


ID: No.197673
发贴数: 184

经验值: 61%
等级: 12 级

现金:141¥
存款:

积分: 0
注册日期: 2004.11.29
日均在线: 0.08 小时
来  自: 河北保定
2楼楼主说:

太高深了,期待高人解决,好学习一下。



向版主反映该贴 | IP: 已记录



云山苍苍江水泱泱
XLiang

2006年02月27日 12:17
marcoyuwen 离线引用回复 点这里给 marcoyuwen 发送一条悄悄话 查找 marcoyuwen 的更多帖子 编辑/删除
snoopychen [查找更多关于snoopychen的帖子]积分28
超级会员


ID: No.8476
发贴数: 365

经验值: 82%
等级: 17 级

现金:633¥
存款:

积分: 28
注册日期: 2002.08.04
日均在线: 0.31 小时
来  自:
3楼楼主说:

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

(defun c:test (/ os ent curve-obj pt para dir1 ang)
  (vl-load-com)
  (setq os (getvar "osmode"))
  (setq ent (car (entsel)))
  (setq curve-obj (vlax-ename->vla-object ent))
  (setvar "osmode" 512)
  (while (setq pt (getpoint "Pick a point:"))
    (setq para (vlax-curve-getParamAtPoint curve-obj pt))
    (setq dir0 (vlax-curve-getFirstDeriv curve-obj para))
    (setq dir1 (vlax-curve-getsecondDeriv curve-obj para))
    (setq oring (list 0 0 0))
    (grdraw oring dir0 2)
    (grdraw oring dir1 3)
    (setq ang0 (angle oring dir0))
    (setq ang (angle oring dir1))
    (setq leng0 (distance oring dir0))
    (setq leng (distance oring dir1))
    (setvar "osmode" 0)		       
    (command "_.color" 2)
    (command "_.line" pt (polar pt ang0 leng0) "")
	(getstring "\nBreakpoint 1, 这个是firstderiv画出来的线...");Erase_BP
    (command "_.color" 3)
    (command "_.line" pt (polar pt ang leng) "")
	(getstring "\nBreakpoint 1, 这个是secondderiv画出来的线...");Erase_BP
    (setvar "osmode" os)
  )
  (setvar "osmode" os)
  (princ)
)

然后作几个测试,参照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一个切线矢量的变化率矢量,长度也不知道怎么规定的(这个是肯定的)

不好意思,罗里罗嗦讲了一堆,可能把一个简单的问题复杂化了,也可能不是很对题,也说不定讲错了,请指正。



snoopychen 附带了这个的图片 (这个图片经过缩小处理,鼠标滚轮缩放图片或点击图片可以查看清晰效果) :

斑竹加积分:3   by eachy
向版主反映该贴 | IP: 已记录



结构分析、CAD Autolisp技术、软件使用技巧
http://qjchen.yo2.cn

由 snoopychen 于 2006年02月28日 01:10 最后编辑

2006年02月28日 01:06
snoopychen 离线引用回复 点这里给 snoopychen 发送一条悄悄话 查找 snoopychen 的更多帖子 编辑/删除
LADESIGNER [查找更多关于LADESIGNER的帖子]
超级会员


ID: No.155489
发贴数: 353

经验值: 53%
等级: 17 级

现金:435¥
存款:47¥

积分: 6
注册日期: 2004.07.06
日均在线: 0.14 小时
来  自: 青岛
4楼楼主说:

平面上的曲线好理解,空间曲线怎么有跟时间有关系???如果跟时间有关,那么对于给定的一条空间曲线,它的二阶导数岂不是随时间变化???
简单的说,二阶导数是曲线陡缓的一个度量,用一个矢量怎么计算大小:
点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))即矢量长度吗?那么正负号又怎么确定呢?



向版主反映该贴 | IP: 已记录


2006年02月28日 22:09
LADESIGNER 离线引用回复 点这里给 LADESIGNER 发送一条悄悄话 查找 LADESIGNER 的更多帖子 编辑/删除
zzyong00 [查找更多关于zzyong00的帖子]
初级会员


ID: No.395744
发贴数: 26

经验值: 83%
等级: 3 级

现金:38¥
存款:0¥

积分: 0
注册日期: 2006.02.17
日均在线: 0.01 小时
来  自:
5楼楼主说:

(setq para (vlax-curve-getParamAtPoint curve-obj pt)) 一句中,para 参数中得到值表示什么呢?



向版主反映该贴 | IP: 已记录


2006年03月01日 10:46
zzyong00 离线引用回复 点这里给 zzyong00 发送一条悄悄话 查找 zzyong00 的更多帖子 编辑/删除
snoopychen [查找更多关于snoopychen的帖子]积分28
超级会员


ID: No.8476
发贴数: 365

经验值: 82%
等级: 17 级

现金:633¥
存款:

积分: 28
注册日期: 2002.08.04
日均在线: 0.31 小时
来  自:
6楼楼主说:

首先,我先指出我前面的一个错误,认为物体是匀速运动的,这个是片面的。

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

---------------------------------
关于时间t的问题。
我是这样认为的,可以这样来看待一条曲线,一条在座标平面(空间)上客观存在的曲线是一条曲线,把一个手榴弹扔出去形成的一条和时间有关系的抛物线也是一条曲线。
---------------------------------
acad对曲线采用了参数方程的定义。就是一个parameter,我们可以通过下面这个lisp检查一条曲线的parameter分布。
在这里面,曲线是有起点0,也有终点endparam的,我们可以简单的认为这个param是一个时间,在0时刻的时候它停在起点,在param时刻它到达终点。

(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)
)
)



我们也可以看出,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的方法是什么,我只是看出了大概,但是应该有一个统一的定义的,大概是我数学不过关,请大家指点。

可能是这个问题我想的有点偏吧,好像对楼主的问题一直都回答的不好,也希望哪位大侠再发表一下讲解,谢谢。



snoopychen 附带了这个的图片 (这个图片经过缩小处理,鼠标滚轮缩放图片或点击图片可以查看清晰效果) :

向版主反映该贴 | IP: 已记录



结构分析、CAD Autolisp技术、软件使用技巧
http://qjchen.yo2.cn

由 snoopychen 于 2006年03月04日 01:19 最后编辑

2006年03月04日 01:14
snoopychen 离线引用回复 点这里给 snoopychen 发送一条悄悄话 查找 snoopychen 的更多帖子 编辑/删除
时区: GMT北京时间. 现在时间: 11:47. 发布新主题    回复主题 
  上一主题   下一主题
快速回复 [字数限制(为0不限制):0]
标题:
选项:
自动分析URL
Email 通知
显示签名

在新主题帖子中上传一个附件上传附件[最大: 1024000 字节:] 附件收爱心币!
有效文件扩展名: gif jpg dwf pdf txt zip jpeg lsp dcl doc c cpp swf rar 7z png
显示可打印版本 | 将本页发送给朋友 | 订阅该主题 | 添加到收藏夹

论坛跳转:
给这个主题评分:

论坛状态:
你不可以发布新主题
你不可以回复主题
你不可以上传附件
你不可以编辑自己的帖子
HTML代码 允许
vB代码 允许
表情符号 禁止
[IMG]代码 允许
 

< 管理员信箱 --辽ICP备05017898号 >
MSN:ad@xdcad.net 点击这里给我发消息 

本论坛属于个人性质的论坛,仅提供会员交流!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律有抵触的言论!否则后果自负