我有一个起点(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);
现在只需按照上面的过程找到和的交点line
和。如果 V1 为负值,则设置其他设置,以便您在正确的方向上寻找交点。如果没有交点,这条线可能会出错,所以在那里添加一些错误检查。如果 V1 为正,则选择最小的 xval,如果 V1 为负,则选择更大的 xvalg1
line
g2
xmax = X
xmin = X
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);
% 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
我会这样做,但我目前无法测试它:
编辑 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)));