Python 예제 - 두 곡선의 교차점 찾기Python/Python 예제 코드2021. 11. 30. 22:11
Table of Contents
반응형
두 곡선의 교차점에 대응하는 x, y좌표를 구할 수 있는 Python 예제 코드입니다.
2021. 11. 30 - 최초작성
실행 결과입니다. 두 곡선의 교점을 초록색 점으로 표시해주고 있습니다.
터미널에서 교차점의 x,y 좌표를 확인할 수 있습니다.
[(1.2831976623728205, -0.283620905396323), (4.425039547130342, 0.2818828030413486), (7.566358178278255, -0.281334885867327)]
전체 소스 코드입니다.
# -*- coding: utf-8 -*-
# 원본 코드 - https://stackoverflow.com/a/59120343
import numpy as np
from matplotlib import pyplot as plt
# x 좌표 범위를 지정합니다.0 ~ 10 사이에 40개를 생성합니다.
x = np.linspace(0, 10, 40)
# 두 곡선을 위한 y좌표를 생성합니다. 위에서 생성한 x좌표 범위내에서 생성됩니다.
curve1 = -np.cos(x+10)
curve2 = -np.cos(x)
fig, ax = plt.subplots()
# 두 곡선을 각각 파란색, 빨간색으로 그립니다.
ax.plot(x, curve1,'b')
ax.plot(x, curve2,'r')
intersections = []
prev_dif = 0
x0, prev_c1, prev_c2 = None, None, None
for x1, c1, c2 in zip(x, curve1, curve2): # 현재 x좌표에 해당되는 두 곡선의 y 좌표가 각각 c1, c2입니다.
new_dif = c2 - c1 # 현재 x 좌표에서 두 곡선의 y좌표의 차이입니다.
if np.abs(new_dif) < 1e-12: # 현재 x 좌표에서 두 곡선의 y좌표 차이가 0인 경우입니다. 즉 두 곡선이 교차하는 지점입니다. 차이가 0인 경우로 체크하지 않고 이렇게 하는군요.
intersections.append((x1, c1))
elif new_dif * prev_dif < 0: # 현재 x 좌표(x1)에서 두 곡선의 y좌표 차이가 이전 x좌표(x0)에서 계산한 두 곡선의 y좌표 차이의 부호와 다른 순간입니다. 즉 부호가 바뀌는 순간입니다.
# 즉 현재 x 좌표(x0)과 이전 x 좌표(x1)사이에 두 곡선의 교점이 있는 것을 알 수 있습니다.
# 현재 x 좌표(x0)과 이전 x 좌표(x1)사이에 두 곡선의 y값이 같아지는 x 좌표를 찾기 위해 선형 보간(linear interpolation)을 수행합니다.
# 직선 [(t0, prev_c1), (t1, c1)]과 직선 [(t0, prev_c2), (t1, c2)]의 교차점입니다.
denom = prev_dif - new_dif
intersections.append(((-new_dif*x0 + prev_dif*x1) / denom, (c1*prev_c2 - c2*prev_c1) / denom))
x0, prev_c1, prev_c2, prev_dif = x1, c1, c2, new_dif
print(intersections) # 두 곡선의 교점 리스트를 출력합니다.
ax.plot(*zip(*intersections), 'go', alpha=0.7, ms=10) # 두 곡선의 교점을 그래프에 녹색점으로 출력합니다.
plt.show()
반응형
'Python > Python 예제 코드' 카테고리의 다른 글
Python 예제 - range를 list로 변환 (0) | 2021.12.06 |
---|---|
파이썬 예제 - 1차원 곡선에서 local maximum, local minimum 위치 찾기 (0) | 2021.12.01 |
generator를 사용하여 넘파이 배열을 일정한 크기씩 나누어 가져오기 (0) | 2021.11.28 |
Python에서 JSON 포맷 파일 로드하는 방법 (0) | 2021.11.14 |
MATLAB의 mat 파일을 Python에서 불러오기 (0) | 2021.11.14 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!