Чтобы найти пересечение двух кривых:
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);
Так вы говорите, ваши cruves найдены принимая кусок из каждой поверхности (g1, g2) в направлении (V1, V2)? – Dan
@ Dan g1 и g2 - простые кривые на плоскости. Я исправил свой пост. Прошу прощения за путаницу. – Pranasas
Вы уже пробовали с помощью 'symbolic' toolbox? или вы предпочитаете «числовое» решение? – fpe