Graph 判定图是否凸
我试图确定连接多个点的线是否是凸的。这些点可以绘制在x、y坐标上。除了基本上将每个点连接到每个其他点,并查看所有这些线是否都位于曲线上方之外,是否可以通过其他方式完成此操作?谢谢 以下是示例点:Graph 判定图是否凸,graph,convex,Graph,Convex,我试图确定连接多个点的线是否是凸的。这些点可以绘制在x、y坐标上。除了基本上将每个点连接到每个其他点,并查看所有这些线是否都位于曲线上方之外,是否可以通过其他方式完成此操作?谢谢 以下是示例点: X Y 1191.06 0.9655265 1192.36 0.9644738 1193.75 0.9633508 1194.98 0.9623592 1196.49 0.9611447 1197.78 0.9601095 1
X Y
1191.06 0.9655265
1192.36 0.9644738
1193.75 0.9633508
1194.98 0.9623592
1196.49 0.9611447
1197.78 0.9601095
1199.02 0.9591166
1200.29 0.9581017
1201.56 0.9570891
1202.77 0.9561263
1204.01 0.9551415
1205.26 0.9541510
一个变量的可微函数在区间上是凸的当且仅当其导数在该区间上是单调非减的。如果一个函数是可微凸的,那么它也是连续可微的。对于从实数子集到实数的可微函数的基本情况,凸等价于以递增的速率递增
您可以迭代这些点,并检查序列中每对连续点之间的斜率是否严格为非递减。您不必将每个点连接到每个其他点
伪代码:
boolean isConvex(float[] x, float[] y, int length)
{
float previousSlope = 0;
for(int i = 1; i < length; i++)
{
if(x[i] == x[i-1])
{
// handle infinite gradients to avoid div by zero
// if you are not going to exclude this case from your data
}
float slope = (y[i] - y[i-1]) / (x[i] - x[i-1]);
// only compare the slope after the first iteration:
if((i > 1) && (slope < previousSlope))
return false;
previousSlope = slope;
}
return true;
}
这假设y是x的函数,数组中的值根据x按升序排序,x是单调递增的