|
感谢dingd兄的细心和提醒,提出另外一个思路,计算量应当小得多:
1.求得曲线上所有极值点,加上区间两个端点,得到新数据点集N,维数:(length(DerData),2)
如果有拟合公式直接由polyder得到导数,如果由于浮点运算误差没有零值点则取一个接近0的数
如果本身是数据集则通过polyfit或者csapi得到拟合公式,再由fnder或者polyder求导
2.用nchoosek(1:length(N),2)命令得到新数据集所有索引的标号组合
3.按标号组合算所有点之间的距离,取最大值。
================================================
花时间算了一下,dingd兄的验算如果我没有猜错的话是基于原始数据的,而我用的是其拟合的多项式公式,因为楼主没有提供mat文件,我懒得再替其编辑那些乱七八糟的数据,所以我的36点应为(0.144,-8.9473),228点为(0.912,-9.7989),从我的图像上看,也不可能达到dingd所说的5以上。所以原来的计算结果应当是正确的。,如下是楼主所提供的拟合公式曲线图象,明显是峰值点附近和波谷点附近的某两个点距离最大,我验算了这两个峰值点之间的距离,是disttt =1.1351。
按新思路编写了一个程序,计算结果完全相同:
- function DistanceForTwoPoint
- clc
- x=[.004:.004:1]';
- f=[121.0907 -289.6766 211.7924 -17.0045 -36.1942 10.4089 -9.7191];
- f1=polyder(f);
- RsolDer=roots(f1);
- RsolDer=RsolDer(RsolDer>=0&RsolDer<=1);
- RealRoots=RsolDer(RsolDer-abs(real(RsolDer))<1e-3);
- indOrigin=[];
- for i=1:length(RealRoots)
- fOriginVal=polyval(f,x);
- indOrigin=[indOrigin;find(abs(polyval(f1,x)-RealRoots(i))<0.1)];
- end
- xOrigin=x([1;indOrigin;end]);
- fOrigin=fOriginVal([1;indOrigin;end]);
- fDerLine=[xOrigin,fOrigin];
- P=nchoosek(1:length(xOrigin),2);
- FirstPoint=[xOrigin(P(:,1)),fOrigin(P(:,1))];
- SecondPoint=[xOrigin(P(:,2)),fOrigin(P(:,2))];
- Distance=sqrt((FirstPoint(:,1)-SecondPoint(:,1)).^2+...
- (FirstPoint(:,2)-SecondPoint(:,2)).^2);
- [MaxDist,Ind]=max(Distance);
- disp(['两点之间最大距离为Dist=',num2str(MaxDist)])
复制代码
[ 本帖最后由 bainhome 于 2006-10-15 05:02 编辑 ] |
评分
-
1
查看全部评分
-
|