1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法 含Matlab

求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法 含Matlab

时间:2024-05-16 18:07:49

相关推荐

求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法 含Matlab

一、问题提出

假如曲线外有一个点,如果这个曲线是直线,求这个点到直线的距离最近的点,则比较好求,直接作垂直线,再求交点即可。但是,如果这个曲线不是直线,而是一个任意弯曲的函数曲线甚至是一个参数方程形式的曲线,该如何求解呢?

二、解决方案

1、对于求一个点到任意函数曲线这种情况,我是通过搜索法实现的。设有函数曲线外有一个点,现在以为圆心,半径依次为(半径线性递增或指数递增等)画圆,直到画出的圆能够与函数曲线相交。判断圆与曲线是否相交的方法如下:如画一个半径为的圆,则对应的范围为,通过对进行0.01的细分,求出每个细分点的,当出现细分点到的距离小于所画的半径时,则认为圆内已经含有最近的点了,此时的必有个细分点到的距离为最小,我们可以认为此细分点即是所求。下图形象的表示出了实现原理。

2、对于一个点到任意曲线方程最近点的方法,也可以通过搜索法实现。但是曲线方程与函数不同,函数是y关于x的函数,只需要通过搜索x即可找到最近点。但是曲线方程或者说参数方程,它的x,y都是关于第三个参数的函数,假如给定一个点,求它到曲线最近距离的点。此时提出两种方法。

第一种方法,总体仍然仿照上述函数曲线的方法进行搜索,直到找到最近的点。首先求解当曲线上点为或为时,参数t对应的值,然后以为起始点进行上下搜索,现在假设第一次设定搜索半径为0.1,通过对进行上下搜索,确定对应的的范围,然后仿照函数曲线的方法依次进行搜索即可。需要注意的是,所求或对应的,它们代表的是横向搜索或纵向搜索,假如求出的是两个或两个以上的值,则需要同时分别对所求的所有值使用上述方法搜索,哪个先圈到圆内,则是哪个点,如果有两个以上的t同时圈到圆内,则距离最近的那个点就是所求的点。这种方法实际上是有局限性的,局限性一,如果的取值范围不确定,而曲线方程本身所取到的x,y值被限定在了一定的范围内,假如此时距离曲线方程本身的点较远,这种方法就可能失效。局限性二,需要求求或对应的值,有的时候不是很好求解。

第二种方法是,假如已经知道距离最近的点所对应值的范围,则可以直接按一定精度细分,然后通过搜索法求距离最短的即可,该方法比较简单,不再赘述。

三、Matlab代码实现

求函数曲线外一点(-1.0,-1.5)到函数曲线最短距离的点。按照第二节第一部分所述的方法,其Matlab实现代码如下:

clear;clcclose allK=0.15;plan_x=-10:0.001:10;plan_y=K*plan_x.*plan_x;figure(1)plot(plan_x,plan_y);real_loc_x=-1.0;real_loc_y=-1.5;cycles_count=1;subdivision_scope=0.1;subdivision_degree=0.01;subdivision_x_value=0.0;point_center_min_distance=99999.0;point_center_x_min_value=0.0; while point_center_min_distance>subdivision_scope*cycles_count for subdivision_x_value=(real_loc_x-cycles_count*subdivision_scope):subdivision_degree:(real_loc_x+cycles_count*subdivision_scope);point_center_distance=sqrt((subdivision_x_value-real_loc_x)^2+(K*subdivision_x_value^2-real_loc_y)^2);if point_center_distance<point_center_min_distancepoint_center_min_distance=point_center_distance;point_center_x_min_value=subdivision_x_value;endendcycles_count=cycles_count+1;enddis_min_xy_buf(1)=point_center_x_min_value;dis_min_xy_buf(2)=K*dis_min_xy_buf(1)^2;hold onplot(dis_min_xy_buf(1),dis_min_xy_buf(2),'b.','MarkerSize',10);plot(real_loc_x,real_loc_y,'r.','MarkerSize',10);

运行结果如下:

所得的结果为[-0.68,0.06936],在为0.01的精度范围内是可信的。

求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法 含Matlab实现代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。