Sqrt(Sqr(0.144-0.912)+Sqr(-8.1487+9.3127)) = 1.39453217962154,怎么会是1.1468?
再看28点(0.112,-6.7517)和122点(0.488,-12.223)间的距离:
Sqrt(Sqr(0.112-0.488)+Sqr(-6.7517+12.223)) = 5.48420456310667
不知哪个对?是否自己理解有误? 感谢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=;
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=;
end
xOrigin=x();
fOrigin=fOriginVal();
fDerLine=;
P=nchoosek(1:length(xOrigin),2);
FirstPoint=;
SecondPoint=;
Distance=sqrt((FirstPoint(:,1)-SecondPoint(:,1)).^2+...
(FirstPoint(:,2)-SecondPoint(:,2)).^2);
=max(Distance);
disp(['两点之间最大距离为Dist=',num2str(MaxDist)])
[ 本帖最后由 bainhome 于 2006-10-15 05:02 编辑 ] 的确如同bainhome所说, 16F中dingd所指出之差异, 乃因采用原始数据或拟合多项式公式所造成! 见附图
若采用原始数据, 15F程序得到如下结果: 两点之间最大距离为Dist=5.4842, 这两个点分别是第28个点和第122个点
还有个人较喜欢15F的思维, 简易明了, 17F的对个人而言还真有点复杂!:loveliness:
[ 本帖最后由 ChaChing 于 2010-8-16 00:59 编辑 ]
页:
1
[2]