2013-04-29 6 views
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 кривая.

intersection

+0

Так вы говорите, ваши cruves найдены принимая кусок из каждой поверхности (g1, g2) в направлении (V1, V2)? – Dan

+1

@ Dan g1 и g2 - простые кривые на плоскости. Я исправил свой пост. Прошу прощения за путаницу. – Pranasas

+0

Вы уже пробовали с помощью 'symbolic' toolbox? или вы предпочитаете «числовое» решение? – fpe

ответ

1

Чтобы найти пересечение двух кривых:

Declare g1 и g2 как явные анонимные функции

g1 = @(x)(sqrt(2*x - 1)); 
g2 = @(x)(-0.4*x.^2 + 4.5); 

Выберите диапазон для х, чтобы проверить через:

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 

EDIT:

Итак, я предполагаю, что ваш (V1, V2) - это всего лишь единичное направление vec тор от начала координат? Если это так, мы можем создать прямую 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, вероятно, будет ошибкой, если нет точки пересечения, поэтому добавьте некоторую проверку ошибок там.А потом просто выбрать наименьшее xval, если V1 был положительным или больше, если V1 отрицательный

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); 
+0

. Я не уверен, что вы просто хотели дать мне подсказку, так как g1 и g2 всегда одинаковы. Это начальная точка и начальное направление, которое является произвольным. Это эффективно вводит третью кривую (линию), о которой нужно позаботиться. Хорошо, я попытаюсь понять это. – Pranasas

+1

Я не понимаю, что вы подразумеваете под началом, вы предоставили две явные кривые. Начальная точка я понимаю (просто измените «xmin» в коде выше), но что вы подразумеваете под руководством? Вы можете либо увеличить 'x', либо уменьшить' x'? oh, если я не уменьшил половину кривой, взяв sqrt ... – Dan

+0

Итак, мой метод дает 'x' = 2.5 для + ve root и' x' = 4.2 для корня -ve. Поэтому я предполагаю, что это ваше направление. – Dan

0

Я хотел бы сделать это так, но я не могу себе проверить:

EDIT 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))); 
+0

Я добавил картинку к своему оригинальному сообщению, чтобы представить (надеюсь, более ясным образом) пересечение, на котором я действительно заинтересован. – Pranasas

+0

@Pranasas: Я только что обновил ответ; проверьте, соответствует ли оно вашим потребностям. – fpe

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 
Смежные вопросы