Как найти точки пересечения в матлабе

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:
result

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

какие-то заморочки с переборами…
а так нельзя решать?

Matlab M
1
2
3
4
5
6
7
8
9
10
clc; clear; clf
syms x
f1=x;
f2=x^0.5;
X=solve(f1-f2)
% графики
x=X(1):0.01:X(2)+0.1;
f1=@(x)x;
f2=@(x)x.^0.5;
plot(x,f1(x),x,f2(x),X,f1(X),'or')



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 минут
а можно поинтересоваться в лексике @ и inline.
вот пример работающей программы:

Matlab M
1
2
3
4
5
6
7
8
9
syms x
y1 = eval(get(handles.edit1,'String'));
y2 = eval(get(handles.edit2,'String'));
X=solve(y1-y2);
% графики
x=X(1):0.01:X(length(X));
y1 = inline(get(handles.edit1,'String'));
y2 = inline(get(handles.edit2,'String'));
plot(x,y1(x),x,y2(x),X,y1(X),'ok','linew',2)

А например: y1 =@(x)(get(handles.edit1,’String’)); не работает

 Комментарий модератора 
Правила форума, пункт 4.9. Используйте тэги форматирования текста и редактор формул для удобства восприятия ваших сообщений другими пользователями.



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 секунд
для самостоятельного анализа достаточно черкнуть маленький скриптик

Matlab M
1
2
3
4
x=-10:0.1:10;
f1=@(x)x-5;
f2=@(x)x.^2;
plot(x,f1(x),x,f2(x))



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

от них не избавишься, коли решение такое..
делайте обход по условию,

Matlab M
1
2
  если решение действительное, то рисуем график, 
  иначе график не рисуем



0



0 / 0 / 0

Регистрация: 08.02.2016

Сообщений: 32

18.05.2019, 18:29

 [ТС]

11

Цитата
Сообщение от Krasme
Посмотреть сообщение

какие-то заморочки с переборами…
а так нельзя решать?

к сожалению не находит две точки пересечения функций 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 нахожу точки пересечения, но есть вероятность, что как раз на этом промежутке функции два раза пересекутся и программы ничего не выведет, сам в матлабе начал работать недавно, так что не судите строго.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
X=[];
x=-1000:0.01:1000;
y1 = eval(get(handles.edit1,'String'));
y2 = eval(get(handles.edit2,'String'));
k=1;
for i=1:length(x)-1
    if or(and(y1(i)>y2(i),y1(i+1)<y2(i+1)), and (y1(i)<y2(i),y1(i+1)>y2(i+1)))
        x=x(i):0.000001:x(i+1);
y1 = eval(get(handles.edit1,'String'));
y2 = eval(get(handles.edit2,'String'));
        for i=1:length(x)-1
            if or(and(y1(i)>y2(i),y1(i+1)<y2(i+1)),and(y1(i)<y2(i),y1(i+1)>y2(i+1)))
            X(k)=x(i);
            k=k+1;
            else if y1(i)==y2(i)
                    X(k)=x(i);
                    k=k+1;
                end
            end
        end
x=-1000:0.01:1000;
y1 = eval(get(handles.edit1,'String'));
y2 = eval(get(handles.edit2,'String'));
    else if y1(i)==y2(i)
            X(k)=x(i);
            k=k+1;
        end
    end
end
if k==1
    msgbox('точек пересечения нет или площадь очень мала')
    return
else if k==2
        msgbox('точка пересечения одна или площадь очень мала') 
        return
     end
end



0



nuHrBuH

483 / 427 / 205

Регистрация: 04.03.2011

Сообщений: 1,259

31.05.2019, 15:57

13

Функция eval() более энергозатратна

Matlab M
1
2
3
4
5
6
7
8
9
10
% y1 = eval(get(handles.edit1,'String'));
% y2 = eval(get(handles.edit2,'String'));
s1 = get(handles.edit1,'String');
s2 = get(handles.edit2,'String');
s1 = vectorize(s1);                     % если нету точек перед ^,*,/
s2 = vectorize(s2);
f1 = str2func(['@(x)',s1]);
f2 = str2func(['@(x)',s2]);
y1 = f1(x);
y2 = f2(x);

Подобная тема: тема



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, y1x2 и y2. Выходные аргументы, xi и yi, содержите x-и y-координаты каждой точки, в которой сегмент первой ломаной линии пересекает сегмент второго. В случае наложения, коллинеарных сегментов, пересечение является на самом деле линейным сегментом, а не точкой, и обе конечных точки включены в xi, yi.

[xi,yi,ii] = polyxpoly(___) возвращает массив 2D столбца индексов линейного сегмента, соответствующих точкам пересечения. K-ая строка 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')

Figure contains an axes object. The axes object contains 3 objects of type patch, line.

Отобразите точки пересечения; обратите внимание, что точка (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, y1x2 , y2Координаты ломаных линий
числовой вектор

x – или y – координаты точек в первой или второй ломаной линии в виде числового вектора. Для данной ломаной линии x – и y – координатные векторы должны быть той же длиной.

Выходные аргументы

свернуть все

xi, yi — Координаты точек пересечения
числовой вектор-столбец

x – или y – координаты точек пересечения в виде числового вектор-столбца.

ii — индексы линейного сегмента
числовой вектор

Индексы линейного сегмента точек пересечения в виде числового вектора.

Советы

  • Если интервал между точками является большим, пересечения, вычисленные polyxpoly функционируйте и пересечения, показанные на отображении карты, могут отличаться. Это – результат различий между прямыми линиями в неспроектированных и спроектированных координатах. Точно так же могут быть различия между polyxpoly результат и пересечения, которые принимают большие круги или локсодромы между точками.

Представлено до R2006a

Добавить комментарий