1

我有一个起点(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曲线的一个点。

路口

4

3 回答 3

1

要找到两条曲线的交点:

将 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);

现在只需按照上面的过程找到和的交点line和。如果 V1 为负值,则设置其他设置,以便您在正确的方向上寻找交点。如果没有交点,这条线可能会出错,所以在那里添加一些错误检查。如果 V1 为正,则选择最小的 xval,如果 V1 为负,则选择更大的 xvalg1lineg2xmax = Xxmin = Xxval

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);
于 2013-04-29T15:12:14.327 回答
0
% find intersect point of two curves
% x -> independent variable
% y1, y2 -> curves that intersects
% xc, yc -> intersect cordinate

function [xc, yc, crossIdx] = findIntersectPoint(x, y1, y2)
    crossIdx = inf;
    xRes = (x(end) - x(1))/(length(x) - 1);
    for xVal = x(1):xRes:x(end)
        idx = fix((xVal - x(1)) / xRes + 2);
        if ( (y1(idx-1) <= y2(idx-1)) && (y1(idx) >= y2(idx)) )  
            crossIdx = idx;
            break;
        end
    end
    if(crossIdx ~= inf)
        xc = x(crossIdx);
        yc = y1(crossIdx);
    else
        xc = nan;
        yc = nan;
    end
end
于 2014-05-15T05:43:31.463 回答
0

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

编辑 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)));
于 2013-04-29T15:55:12.247 回答