You’ll have to find the point of intersection (px, py) manually:
idx = find(y1 - y2 < eps, 1); %// Index of coordinate in array
px = x(idx);
py = y1(idx);
Remember that we’re comparing two numbers in floating point representation, so instead of y1 == y2
we must set a tolerance. I’ve chosen it as eps
, but it’s up to you to decide.
To draw a circle around this point, you can compute its points and then plot them, but a better approach would be to plot one point with a blown-up circle marker (credit to Jonas for this suggestion):
plot(px, py, 'ro', 'MarkerSize', 18)
This way the dimensions of the circle are not affected by the axes and the aspect ratio of the plot.
Example
x = 0:0.01:30;
y1 = x .^ 2 + 2;
y2 = x .^ 3;
%// Find point of intersection
idx = find(y1 - y2 < eps, 1);
px = x(idx);
py = y1(idx);
figure
plot(x, y1, x, y2, px, py, 'ro', 'MarkerSize', 18)
axis([0 10 0 10])
This should produce the following plot:
0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
|
1 |
|
Найти точки пересечения произвольных графиков16.05.2019, 10:21. Показов 18070. Ответов 12
Задача такая, найти точки пересечения двух произвольно заданных графиков(планируется задавать в guide, выполнить их построение, а потом посчитать площадь между ними) . Ход х 0.01, есть мысли прогнать циклом если yi>yj а потом yi+1<yj+1 то взять приближенную точку пересечения, ещё где-то прочитал, что можно указателем тыкнуть на точку пересечения и матлаб автоматически определит ее координаты. Если есть какие-то мысли пишите, подумаем вместе.
0 |
1255 / 893 / 437 Регистрация: 21.10.2012 Сообщений: 2,547 |
|
16.05.2019, 13:35 |
2 |
2 |
0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
|
16.05.2019, 22:36 [ТС] |
3 |
Огромное спасибо, помогло. Но всё же не совсем, программа в первой ссылке не подходит ко всем графикам, например, если я сделаю перебор х-ов от -100 до 100 выдаёт ошибки при вводе функции, не существующей на отрицательных х. А во второй честно не понял, как взять остальные корни, ну и вывести отрицательные корни. Миниатюры
0 |
1255 / 893 / 437 Регистрация: 21.10.2012 Сообщений: 2,547 |
|
17.05.2019, 12:02 |
4 |
шишка23, без кода сложно что-то вам подсказать
0 |
Krasme 6630 / 4733 / 1975 Регистрация: 02.02.2014 Сообщений: 12,683 |
||||
17.05.2019, 12:14 |
5 |
|||
какие-то заморочки с переборами…
1 |
шишка23 0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
|||||||||
17.05.2019, 22:02 [ТС] |
6 |
||||||||
спасибо! Сделал разбиением на кусочки и сравнением последующих У, а оказывается есть такая функция solve… Кстати, немного доработал, сделав цикл до x=X(1):0.01:X(length(X)), теперь точно универсальная! Добавлено через 38 минут
А например: y1 =@(x)(get(handles.edit1,’String’)); не работает
0 |
0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
|
18.05.2019, 14:19 [ТС] |
7 |
при вводе функций f1=x-5; f2=x.^2; выводит решение с мнимой единицей… не подскажете как бороться с этим? может есть что-то на подобии x=double(vpa(x,5))?
0 |
Krasme 6630 / 4733 / 1975 Регистрация: 02.02.2014 Сообщений: 12,683 |
||||
18.05.2019, 14:26 |
8 |
|||
если решение – мнимые числа, значит, графики не пересекаются… Добавлено через 58 секунд
0 |
0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
|
18.05.2019, 14:59 [ТС] |
9 |
А избавиться от них никак? Лучше бы матлаб ошибку выдавал и не рисовал эти точки Миниатюры
0 |
Krasme 6630 / 4733 / 1975 Регистрация: 02.02.2014 Сообщений: 12,683 |
||||
18.05.2019, 15:22 |
10 |
|||
от них не избавишься, коли решение такое..
0 |
0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
|
18.05.2019, 18:29 [ТС] |
11 |
какие-то заморочки с переборами… к сожалению не находит две точки пересечения функций y1=x.^2; y2=cos(x); , хотя они есть Миниатюры
0 |
шишка23 0 / 0 / 0 Регистрация: 08.02.2016 Сообщений: 32 |
||||
31.05.2019, 00:27 [ТС] |
12 |
|||
Если кому интересно, в итоге сделал так, работает с sqrt(x), sin(x), корни с мнимой единицей не выводит, взял диапазон от -1000 до 1000, грубой выборкой с шагом 0.01 нахожу точки пересечения, но есть вероятность, что как раз на этом промежутке функции два раза пересекутся и программы ничего не выведет, сам в матлабе начал работать недавно, так что не судите строго.
0 |
nuHrBuH 483 / 427 / 205 Регистрация: 04.03.2011 Сообщений: 1,259 |
||||
31.05.2019, 15:57 |
13 |
|||
Функция eval() более энергозатратна
Подобная тема: тема
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
31.05.2019, 15:57 |
13 |
Подскажите, как найти точку пересечения двух кривых в Матлабе ?
Ученик
(89),
на голосовании
7 лет назад
Голосование за лучший ответ
Денис Евдоченко
Мыслитель
(8379)
7 лет назад
пусть кривые заданы функциями y = f(x), y = g(x).
Тогда для точки X можно найти y1 = f(X), y2 = g(X). Пусть y1>y2, тогда r = y1-y2. Если r равен нулю тогда в X имеется точка пересечения. Тоже самое для y2>y1. Введём функцию u(x) = f(x)-g(x). Тогда через fzero можно можно найти ноль функции u(x). Это подходит только для одной точки пересечения. Можно дробить на отрезки и найти несколько точек пересечения, учтя, что при пересечении оси ox на отрезке [a,b] u(a)*u(b)<0. Ну как-то так
1. Используйте plot () для рисования базовой графики.
x1 = linspace (1,1,10);% X1-X2 (от 1 до 1) дает 10 точек
y1 = linspace (1,2,10);% от Y1 до Y2 (от 1 до 2) дает 10 точек
plot(x1,y1);
hold on
x2 = linspace (1,2,10);% генерируют 10 точек от 1 до 2, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2
y2 = linspace (2,1,10);% генерирует 10 точек от 2 до 1, 1.9, 1.8, 1.7, 1.6, 1.5, 1.4, 1.3, 1.2, 1.2, 1.1.
plot (x2, y2);% соединить координаты каждой точки в линию
hold on
x3=linspace(2,2,10);
y3=linspace(1,2,10);
plot(x3,y3);
grid on;
xlim([0.5,2.5]); ylim([0.5,2.5])
plot([1 1 2 2],[1 2 1 2],'o');
2. Пересечение прямой и прямой:
% Сначала нарисуйте две картинки в одном окне
x=[1,113,334,361,440,964,964,1];
y = [1,107,324,323,400,400,471,471];% подготовки данных
plot (x, y, '.-')% Используйте пунктирные линии для соединения точек (x, y) в линию
% Рисунок с графиком - это линейный график, который соединяет две соседние точки прямой линией.
удерживать% Сохранить свойства текущего графика и оси, чтобы последующие команды рисования можно было добавлять к существующему графику
x1 = [0 1000];% подготовки данных
y1=x1-25;
plot (x1, y1, 'r')% Нарисуйте график функции y1 красной линией
% Определите точку пересечения ниже и отметьте точку пересечения
y2=471;
x2 = y2 + 25;% определяет точку пересечения (x2, y2)
[x3,y3]=solve('y=324+(323-324)/(361-334)','y=x-25');
x3 = double (x3); y3 = double (y3);% подтвердить точку пересечения (x3, y3)
plot ([x2, x3], [y2, y3], 'mo')% Отметьте пересечение красным и фиолетовым кружком
легенда ('данные графика', 'y = x-25', 'точка пересечения', 2)% добавить легенду
3. Нарисуйте следующие две кривые на одном рисунке и отметьте их точки пересечения:
x1^2 – 2x1x2 – x1 + x2^2 – 2=0
x1^2 – 2x1x2 + x2^2 + 5*x2 – 2=0
clear all;clc;
syms x1 x2
[s1, s2] = решить ('x1 ^ 2-2 * x1 * x2-x1 + x2 ^ 2-2 = 0', 'x1 ^ 2-2 * x1 * x2 + x2 ^ 2 + 5 * x2-2 = 0 ');% Искать решение уравнений
s1=double(s1);
s2=double(s2);
f1=x1^2-2*x1*x2-x1+x2^2-2;
f2=x1^2-2*x1*x2+x2^2+5*x2-2;
h1 = ezplot (f1);% нарисовать кривую f1
set (h1, 'Color', 'r')% устанавливает красный цвет кривой f1, где h1 - маркер кривой
удерживать;% Сохранить текущие свойства графика и оси, чтобы последующие команды рисования можно было добавить к существующему графику
h2 = ezplot (f2);% нарисовать кривую f2
set (h2, 'Color', 'k')% устанавливает черный цвет кривой f2, где h2 - маркер кривой
grid on
plot (s1, s2, 'r.', 'MarkerSize', 20)% отметьте пересечение красной точкой, размер отмеченной точки равен 20
4. Найдите гиперболическое уравнение x на рисунке ниже.2/42-y2/3Пересечение 2 = 1 и уравнения прямой y = 1/2 * x + 1:
close all; clear all; clc
syms x y% определяют переменные x, y
s = решить (x ^ 2/4 ^ 2-y ^ 2/3 ^ 2 == 1, y == 1/2 * x + 1, x, y);% найти пересечение гиперболической и прямой линий
X=double(s.x);
Y=double(s.y);
h1=ezplot(x^2/4^2-y^2/3^2==1,[-10,10]);
set (h1, 'color', 'r', 'LineWidth', 2)% установить цвет линии на красный
axis equal;
hold on;
h2=ezplot(y==1/2*x+1,[-10,10]);
set(h2,'color','k','LineWidth',2)
легенда ('x ^ 2/4 ^ 2-y ^ 2/3 ^ 2 = 1', 'y = 1/2 * x + 1', 2)% Добавьте легенду в верхнем левом углу
plot (X, Y, 'r.', 'MarkerSize', 20)% отметьте пересечение красной сплошной точкой
text (X (1), Y (1), '(7.4788, 4.7394)', 'FontSize', 12)% отметить пересечение на пересечении
text(X(2),Y(2),'(-4.2788, -1.1394)','fontsize',12)
plot (0, [- 15: 0.01: 15], 'k');% проведите ось y
plot ([- 15: 0.01: 15], 0, 'k');% проведите ось x
5. Параболическое уравнение y ^ 2 = 4x и уравнение прямой y = 2Пересечение x-1.
close all; clear all; clc
syms x y
s=solve(y^2==4*x,y==2*x-1,x,y);
X=double(s.x);
Y=double(s.y);
h1=ezplot(y^2==4*x);
set(h1,'color',[0,0,0],'LineWidth',2)
axis equal;
hold on;
h2=ezplot(y==2*x-1);
set(h2,'color',[0,0,1],'LineWidth',2)
legend('y^2=4*x','y=2*x-1',2)
plot(X,Y,'r.','MarkerSize',20)
text(X(1),Y(1),'(1.8660,2.7321)','FontSize',12)
text(X(2),Y(2),'(0.1340,-0.7321)','fontsize',12)
plot(0,[-10:0.01:10],'k');
plot([-10:0.01:10],0,'k')
6. Эллиптическое уравнение x2/52+y2/42 = 1 и гиперболическое уравнение x2/42-y2/3Пересечение 2 = 1.
close all; clear all; clc
syms x y
s=solve(x^2/5^2+y^2/4^2==1,x^2/4^2-y^2/3^2==1,x,y);
X=double(s.x);
Y=double(s.y);
h1=ezplot(x^2/5^2+y^2/4^2==1);
set(h1,'color',[0,0,0],'LineWidth',2)
axis equal; hold on;
h2=ezplot(x^2/4^2-y^2/3^2==1);
set(h2,'color',[0,0,0],'LineWidth',2)
plot(X,Y,'r.','MarkerSize',20)
text(X(1),Y(1),'(4.5596, 1.6415)','FontSize',11)
text(X(2),Y(2),'(-4.5596, 1.6415)','fontsize',11)
text(X(3),Y(3),'(4.5596, -1.6415)','FontSize',11)
text(X(4),Y(4),'(-4.5596, -1.6415)','fontsize',11)
plot(0,[-10:0.01:10],'k');plot([-10:0.01:10],0,'k')
7. Найдите пересечение двух гипербол.
close all; clear all; clc
syms x y
s=solve(x^2-y^2/15==1,(x-8)^2/4-y^2/12==1);
X=double(s.x);
Y=double(s.y);
h1=ezplot(x^2-y^2/15==1,[-100,100,-100,100]);
set(h1,'color','b','LineWidth',2)
axis equal; hold on;
h2=ezplot((x-8)^2/4-y^2/12==1,[-100,100,-100,100]);
set(h2,'color','k','LineWidth',2)
plot(X,Y,'g.','MarkerSize',20)
text(X(1),Y(1),'(2.5,(3*35^(1/2))/2)','FontSize',11)
text(X(2),Y(2),'(2.5, -(3*35^(1/2))/2)','fontsize',11)
text(X(3),Y(3),'(6.5, (15*11^(1/2))/2)','FontSize',11)
text(X(4),Y(4),'(-6.5, (15*11^(1/2))/2)','fontsize',11)
9. Проблема гиперболического позиционирования:
close all; clear all; clc
syms x y
f1 = sqrt(x^2+(y-0.35/1.414)^2)-sqrt((x-0.15/1.414)^2+(y-0.20/1.414)^2)-(2.5000e-04)*340;
f2 = sqrt((x-0.05/1.414)^2+(y-0.15/1.414)^2)-sqrt((x-0.30/1.414)^2+(y-0.05/1.414)^2)-(1.25000e-04)*340;
s = solve(f1,f2);
X = double(s.x);
Y = double(s.y);
h1=ezplot('abs(sqrt(x^2+(y-0.35/1.414)^2)-sqrt((x-0.15/1.414)^2+(y-0.20/1.414)^2))-(2.5000e-04)*340',[-0.8,0.8,-0.8,4])
set(h1,'color','b','LineWidth',2)
hold on;
h2=ezplot('abs(sqrt((x-0.05/1.414)^2+(y-0.15/1.414)^2)-sqrt((x-0.30/1.414)^2+(y-0.05/1.414)^2))-(1.25000e-04)*340',[-0.8,0.8,-0.8,4])
set(h2,'color','r','LineWidth',2)
legend('f1','f2',2)
plot(X,Y,'g.','MarkerSize',20)
text(X(1),Y(1),'A','FontSize',11)
text(X(2),Y(2),'B','fontsize',11)
text(X(3),Y(3),'C','FontSize',11)
text(X(4),Y(4),'D','fontsize',11)
Точки пересечения для линий или ребер многоугольника
Синтаксис
Описание
пример
[
возвращает точки пересечения двух ломаных линий в плоской, Декартовой системе, с вершинами, заданными xi
,yi
] = polyxpoly(x1
,y1
,x2
,y2
)x1
, y1
x2
и y2
. Выходные аргументы, xi
и yi
, содержите x-и y-координаты каждой точки, в которой сегмент первой ломаной линии пересекает сегмент второго. В случае наложения, коллинеарных сегментов, пересечение является на самом деле линейным сегментом, а не точкой, и обе конечных точки включены в xi
, yi
.
[
возвращает массив 2D столбца индексов линейного сегмента, соответствующих точкам пересечения. K-ая строка xi
,yi
,ii
] = polyxpoly(___)ii
указывает, какие полилинейные сегменты дают начало точке пересечения xi(k)
, yi(k)
.
Чтобы помнить, как эти индексы работают, только думайте о сегментах и вершинах как разделы забора и сообщения. i-th раздел забора соединяется, i-th отправляют на (i +1)-th сообщение. В общем случае разрешение i и j обозначает скалярные значения, состоявшие k-th строка ii
, пересечение, обозначенное той строкой, происходит, где i-th сегмент первой ломаной линии пересекает j-th сегмент второй ломаной линии. Но когда пересечение падает точно на вершину первой ломаной линии, затем i является индексом той вершины. Аналогично со второй ломаной линией и индексом j. В случае пересечения в i-th вершина первой линии, например, xi(k)
равняется x1(i)
и yi(k)
равняется y1(i)
. В случае пересечений между вершинами, i и j может быть интерпретирован можно следующим образом: сегмент, соединяющий x1(i)
, y1(i)
к x1(i+1)
, y1(i+1)
пересекает сегмент, соединяющий x2(j)
, y2(j)
к x2(j+1)
, y2(j+1)
в точке xi(k)
, yi(k)
.
пример
[
отфильтровывает дублирующиеся пересечения, которые могут закончиться, если входные ломаные линии самопересекаются.xi
,yi
] = polyxpoly(___,'unique')
Примеры
свернуть все
Найдите точки пересечения между прямоугольником и ломаной линией
Задайте и заполните прямоугольную область в плоскости.
xlimit = [3 13]; ylimit = [2 8]; xbox = xlimit([1 1 2 2 1]); ybox = ylimit([1 2 2 1 1]); mapshow(xbox,ybox,'DisplayType','polygon','LineStyle','none')
Задайте и отобразите ломаную линию 2D части.
x = [0 6 4 8 8 10 14 10 14 NaN 4 4 6 9 15]; y = [4 6 10 11 7 6 10 10 6 NaN 0 3 4 3 6]; mapshow(x,y,'Marker','+')
Пересеките ломаную линию с прямоугольником.
[xi,yi] = polyxpoly(x,y,xbox,ybox); mapshow(xi,yi,'DisplayType','point','Marker','o')
Отобразите точки пересечения; обратите внимание, что точка (12, 8) появляется дважды из-за самопересечения около конца первой части ломаной линии.
ans = 8×2
3.0000 5.0000
5.0000 8.0000
8.0000 8.0000
12.0000 8.0000
12.0000 8.0000
13.0000 7.0000
13.0000 5.0000
4.0000 2.0000
Можно подавить эту дублирующуюся точку при помощи 'unique'
опция.
[xi,yi] = polyxpoly(x,y,xbox,ybox,'unique');
[xi yi]
ans = 7×2
3.0000 5.0000
5.0000 8.0000
8.0000 8.0000
12.0000 8.0000
13.0000 7.0000
13.0000 5.0000
4.0000 2.0000
Найдите точки пересечения между государственной границей и маленьким кругом
Многоугольники состояния чтения в геопространственную таблицу. Создайте подтаблицу, которая содержит Калифорнийский многоугольник. Отобразите многоугольник на карте.
states = readgeotable("usastatehi.shp"); row = states.Name == "California"; california = states(row,:); figure usamap("california") geoshow(california,"FaceColor","none")
Задайте маленький круг, сосредоточенный недалеко от берегов Калифорнии.
lat0 = 37; lon0 = -122; rad = 500; [latc,lonc] = scircle1(lat0,lon0,km2deg(rad)); plotm(lat0,lon0,"r*") plotm(latc,lonc,"r")
Извлеките координаты широты и долготы Калифорнийского многоугольника из геопространственной таблицы.
T = geotable2table(california,["Latitude","Longitude"]); [lat,lon] = polyjoin(T.Latitude',T.Longitude');
Найдите точки пересечения между Калифорнией и маленьким кругом.
[loni,lati] = polyxpoly(lon,lat,lonc,latc);
plotm(lati,loni,"bo")
Входные параметры
свернуть все
x1
, y1
x2
, y2
— Координаты ломаных линий
числовой вектор
x – или y – координаты точек в первой или второй ломаной линии в виде числового вектора. Для данной ломаной линии x – и y – координатные векторы должны быть той же длиной.
Выходные аргументы
свернуть все
xi
, yi
— Координаты точек пересечения
числовой вектор-столбец
x – или y – координаты точек пересечения в виде числового вектор-столбца.
ii
— индексы линейного сегмента
числовой вектор
Индексы линейного сегмента точек пересечения в виде числового вектора.
Советы
-
Если интервал между точками является большим, пересечения, вычисленные
polyxpoly
функционируйте и пересечения, показанные на отображении карты, могут отличаться. Это – результат различий между прямыми линиями в неспроектированных и спроектированных координатах. Точно так же могут быть различия междуpolyxpoly
результат и пересечения, которые принимают большие круги или локсодромы между точками.
Представлено до R2006a