我有一个起点(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 曲线的一个点。
答案 0 :(得分: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
和g1
以及line
和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);
答案 1 :(得分: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)));
答案 2 :(得分: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