如何用MATLAB验证函数不满足度量空间三角不等式及代码正确性校验
代码校验结果
你的代码存在多处逻辑错误,无法正确完成三角不等式的校验,具体问题如下:
- 函数定义实现错误
你要计算的d(x,z)对应代码里的g(i),按照题目给出的d函数定义,分母应该是1 + abs(x(i)+z(i)),但你的代码中错误写为1 + abs(y(i)+z(i)),这属于核心计算逻辑错误,得到的g(i)完全不是要求的距离值。 - 采样范围覆盖不全
你用rand()生成的x、y、z都是(0,1)区间内的正实数,但该函数不满足三角不等式的反例需要包含正负混合的取值,仅采样正实数几乎不可能找到反例。举个简单的反例:x=1,y=-1,z=0,此时d(x,y)=2,d(x,z)+d(z,y)=0.5+0.5=1,明显不符合三角不等式,这个反例在你当前的采样范围内根本不会出现。 - 调试输出逻辑错误
你检测到不满足条件的情况时,输出的数组v=[h(i), g(i), h(i)]重复输出了h(i),没有输出左侧的f(i),无法直观验证是否真的违反不等式。
修正后的参考代码
function check_triangle_inequality % 采样范围改成(-10,10),覆盖正负实数 x = 20*rand(1,10000) - 10; y = 20*rand(1,10000) - 10; z = 20*rand(1,10000) - 10; violate_count = 0; for i = 1:length(x) d_xy = abs(x(i)-y(i))/(1 + abs(x(i)+y(i))); d_xz = abs(x(i)-z(i))/(1 + abs(x(i)+z(i))); d_zy = abs(z(i)-y(i))/(1 + abs(z(i)+y(i))); if d_xy > d_xz + d_zy violate_count = violate_count + 1; fprintf('找到反例:x=%.4f, y=%.4f, z=%.4f\n',x(i),y(i),z(i)); fprintf('d(x,y)=%.4f, d(x,z)+d(z,y)=%.4f\n',d_xy, d_xz+d_zy); % 找到第一个反例就可以停止 break; end end fprintf('共测试%d组数据,找到%d组违反三角不等式的情况\n',length(x),violate_count); end
运行上述代码可以快速找到反例,验证该函数确实不满足度量空间的三角不等式。
内容的提问来源于stack exchange,提问作者Christian Prince
相关产品推荐
相关产品推荐

