Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 一条线在哪里穿过我的曲线?_Matlab_Geometry - Fatal编程技术网

Matlab 一条线在哪里穿过我的曲线?

Matlab 一条线在哪里穿过我的曲线?,matlab,geometry,Matlab,Geometry,我有一个起点(X,Y)和一个起点方向(V1,V2)。我还有两条特定的曲线 g1: 2*x - (y)^2 - 1 = 0; g2: 9 - 0.8*(x)^2 - 2*y = 0; 我需要知道在给定任何(X,Y)和(V1,V2)(或者在某个固定R距离内,第一个十字路口将出现在何处) 最简单的方法是什么?我应该考虑什么样的Matlab方法? 例如(X,Y)=(0,0)和(V1,V2)=(1,1)。第一个交点出现在(1,1)处,它是g1曲线的一个点 要找到两条曲线的交点,请执行以下操作: 将g1

我有一个起点(X,Y)和一个起点方向(V1,V2)。我还有两条特定的曲线

g1: 2*x - (y)^2 - 1 = 0;
g2: 9 - 0.8*(x)^2 - 2*y = 0;
我需要知道在给定任何(X,Y)(V1,V2)(或者在某个固定R距离内,第一个十字路口将出现在何处)

最简单的方法是什么?我应该考虑什么样的Matlab方法?
例如(X,Y)=(0,0)(V1,V2)=(1,1)。第一个交点出现在(1,1)处,它是g1曲线的一个点


要找到两条曲线的交点,请执行以下操作:

将g1和g2声明为显式匿名函数

g1 = @(x)(sqrt(2*x - 1));
g2 = @(x)(-0.4*x.^2 + 4.5);
选择x的测试范围:

xmin = 0;
xmax = 100;
xres = 0.1;
x = xmin:xres:xmax;
在曲线中找到

G1 = g1(x);
G2 = g2(x);
现在找到图相互交叉的索引:

ind = find(diff(G1 > G2));
现在很容易将该索引转换为
x
值:

xval = xmin + (ind(1)-1)*xres
编辑:

所以我现在假设你的(V1,V2)只是一个从原点开始的单位方向向量?如果是这样的话,我们可以创建一条直线y=mx+c,并找到它与g1和g2相交的地方

m = V2/V1;
c = Y - m*X;
line = @(x)(m*x + c);
现在,只需按照上述步骤找到
直线
g1
的交点,以及
直线
g2
的交点。如果V1为负值,则设置
xmax=X
,否则设置
xmin=X
,以便在正确的方向上查找交点。如果没有交点,
xval
线可能会出错,因此在此处添加一些错误检查。如果V1为正,则选取最小的xval;如果V1为负,则选取较大的xval

if V1 >= 0
    xmin = X;
    xmax = X + 100;
else
    xmin = X - 100;
    xmax = X; 
end;

xres = 0.1;
x = xmin:xres:xmax;

G1 = g1(x);
G2 = g2(x);
L = line(x);
ind1 = find(diff(G1 > L));
xval1 = xmin + (ind1(1)-1)*xres
ind2 = find(diff(G2 > L));
xval2 = xmin + (ind2(1)-1)*xres

xval = (V1 > 0)*max(xval1, xval2) + (V2 < 0)*max(xval1, xval2);
yval = line(xval);
如果V1>=0
xmin=X;
xmax=X+100;
其他的
xmin=X-100;
xmax=X;
结束;
xres=0.1;
x=xmin:xres:xmax;
G1=G1(x);
G2=G2(x);
L=直线(x);
ind1=发现(差异(G1>L));
xval1=xmin+(ind1(1)-1)*xres
ind2=find(diff(G2>L));
xval2=xmin+(ind2(1)-1)*xres
xval=(V1>0)*max(xval1,xval2)+(V2<0)*max(xval1,xval2);
yval=直线(xval);

查找两条曲线的交点:

将g1和g2声明为显式匿名函数

g1 = @(x)(sqrt(2*x - 1));
g2 = @(x)(-0.4*x.^2 + 4.5);
选择x的测试范围:

xmin = 0;
xmax = 100;
xres = 0.1;
x = xmin:xres:xmax;
在曲线中找到

G1 = g1(x);
G2 = g2(x);
现在找到图相互交叉的索引:

ind = find(diff(G1 > G2));
现在很容易将该索引转换为
x
值:

xval = xmin + (ind(1)-1)*xres
编辑:

所以我现在假设你的(V1,V2)只是一个从原点开始的单位方向向量?如果是这样的话,我们可以创建一条直线y=mx+c,并找到它与g1和g2相交的地方

m = V2/V1;
c = Y - m*X;
line = @(x)(m*x + c);
现在,只需按照上述步骤找到
直线
g1
的交点,以及
直线
g2
的交点。如果V1为负值,则设置
xmax=X
,否则设置
xmin=X
,以便在正确的方向上查找交点。如果没有交点,
xval
线可能会出错,因此在此处添加一些错误检查。如果V1为正,则选取最小的xval;如果V1为负,则选取较大的xval

if V1 >= 0
    xmin = X;
    xmax = X + 100;
else
    xmin = X - 100;
    xmax = X; 
end;

xres = 0.1;
x = xmin:xres:xmax;

G1 = g1(x);
G2 = g2(x);
L = line(x);
ind1 = find(diff(G1 > L));
xval1 = xmin + (ind1(1)-1)*xres
ind2 = find(diff(G2 > L));
xval2 = xmin + (ind2(1)-1)*xres

xval = (V1 > 0)*max(xval1, xval2) + (V2 < 0)*max(xval1, xval2);
yval = line(xval);
如果V1>=0
xmin=X;
xmax=X+100;
其他的
xmin=X-100;
xmax=X;
结束;
xres=0.1;
x=xmin:xres:xmax;
G1=G1(x);
G2=G2(x);
L=直线(x);
ind1=发现(差异(G1>L));
xval1=xmin+(ind1(1)-1)*xres
ind2=find(diff(G2>L));
xval2=xmin+(ind2(1)-1)*xres
xval=(V1>0)*max(xval1,xval2)+(V2<0)*max(xval1,xval2);
yval=直线(xval);

我会这样做,但目前无法测试:

编辑3

现在,我应该用正确的方式来解释这个问题:因此,我将继续这样做:

f1 = @(x) x - (sqrt( 2.*x - 1 ));
f2 = @(x) x - (4.5 - 0.4.*(x).^2);
x1 = fsolve(f1,x01)
x2 = fsolve(f2,x02)
这将引导您获得预期的结果:

x1 = 1;
x2 = 2.3295;
或者,您也可以采用符号方法:

syms x;
x1 = double(solve(x - sqrt(2*x - 1)));
x2 = double(solve(x - (4.5 - 0.4*x^2)));

我会这样做,但目前无法测试:

编辑3

现在,我应该用正确的方式来解释这个问题:因此,我将继续这样做:

f1 = @(x) x - (sqrt( 2.*x - 1 ));
f2 = @(x) x - (4.5 - 0.4.*(x).^2);
x1 = fsolve(f1,x01)
x2 = fsolve(f2,x02)
这将引导您获得预期的结果:

x1 = 1;
x2 = 2.3295;
或者,您也可以采用符号方法:

syms x;
x1 = double(solve(x - sqrt(2*x - 1)));
x2 = double(solve(x - (4.5 - 0.4*x^2)));
%查找两条曲线的交点
%x->自变量
%y1,y2->相交的曲线
%xc,yc->相交坐标系
函数[xc,yc,crossIdx]=findIntersectPoint(x,y1,y2)
crossIdx=inf;
xRes=(x(末端)-x(1))/(长度(x)-1);
对于xVal=x(1):xRes:x(结束)
idx=fix((xVal-x(1))/xRes+2);
if((y1(idx-1)=y2(idx)))
crossIdx=idx;
打破
结束
结束
if(crossIdx~=inf)
xc=x(交叉点x);
yc=y1(交叉IDx);
其他的
xc=nan;
yc=nan;
结束
结束
%查找两条曲线的交点
%x->自变量
%y1,y2->相交的曲线
%xc,yc->相交坐标系
函数[xc,yc,crossIdx]=findIntersectPoint(x,y1,y2)
crossIdx=inf;
xRes=(x(末端)-x(1))/(长度(x)-1);
对于xVal=x(1):xRes:x(结束)
idx=fix((xVal-x(1))/xRes+2);
if((y1(idx-1)=y2(idx)))
crossIdx=idx;
打破
结束
结束
if(crossIdx~=inf)
xc=x(交叉点x);
yc=y1(交叉IDx);
其他的
xc=nan;
yc=nan;
结束
结束

那么你是说你的拐杖在(V1,V2)方向上从每个曲面(g1,g2)上取一个切片吗?@Dan g1和g2是平面上的简单曲线。我更正了我的帖子。抱歉造成混淆。您是否已尝试使用
符号工具箱?或者你更喜欢数值解吗?@fpe我几乎没有使用MatLab进行符号运算的经验。我需要最后给出交点坐标数值近似值的东西。@Pranasas:所以,你对曲线根一点也不感兴趣!那么你是说你的曲线是从每个曲面(g1,g2)的(V1,V2)方向上取一个切片的吗?@Dan g1和g2是平面上的简单曲线。我纠正了我的位置