아래 코드를 실행했을때, 정상적으로 3d_plot이 나오기는 했지만, '런타임워닝'이 떴다.
import numpy as np
import matplotlib.pyplot as plt
B = [1, -20]
A = [1, 0, 100]
S = np.zeros((50, 50), dtype=complex)
for n in range(50):
for m in range(50):
S[n, m] = (n - 25) + 1j * (m - 25)
M = np.zeros((50, 50), dtype=complex)
for n in range(50):
for m in range(50):
s = S[n, m]
num = B[0] * s + B[1]
den = A[0] * s**2 + A[1] * s**1 + A[2]
M[n, m] = num / den
if abs(M[n, m]) > 1:
M[n, m] = 1
X = np.arange(-24, 26)
Y = np.arange(-24, 26)
X, Y = np.meshgrid(X, Y)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, 20 * np.log10(np.abs(M)), cmap='viridis')
ax.view_init(elev=20, azim=20) # Adjust the view angle
ax.set_xlabel('real')
ax.set_ylabel('imag')
ax.set_zlabel('Mag')
plt.show(
결과>
RuntimeWarning: divide by zero encountered in scalar divide M[n, m] = num / den
이는 단순히 수학적으로 0으로 나누는 행위를 했을때, 발생할 수 있는 흔한 에러이다.
이 경우 'den'이 0이 되어 0으로 나누는 작업이 발생한 것 같다.
이에 대한 해결책으로, 아래 그림과 같이,
분모에 0이 들어가는 경우에 대해서 예외처리를 해주는 방식으로 해결할 수 있을 것 같다.
전체코드는 다음과 같다.
import numpy as np
import matplotlib.pyplot as plt
B = [1, -20]
A = [1, 0, 100]
S = np.zeros((50, 50), dtype=complex)
for n in range(50):
for m in range(50):
S[n, m] = (n - 25) + 1j * (m - 25)
M = np.zeros((50, 50), dtype=complex)
for n in range(50):
for m in range(50):
s = S[n, m]
num = B[0] * s + B[1]
den = A[0] * s**2 + A[1] * s**1 + A[2]
if den != 0: # Check if den is not zero
M[n, m] = num / den
else:
M[n, m] = 0 # Or any other suitable value when den is zero
X = np.arange(-24, 26)
Y = np.arange(-24, 26)
X, Y = np.meshgrid(X, Y)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, 20 * np.log10(np.abs(M)), cmap='viridis')
ax.view_init(elev=20, azim=20) # Adjust the view angle
ax.set_xlabel('real')
ax.set_ylabel('imag')
ax.set_zlabel('Mag')
plt.show()
이로써 'RuntimeWarning'이 뜨는 것을 없앴다.
※참고
위 3d_plot은 아래 블로그에서 어떤 분이 매틀랩으로 구현한 도식을 기반으로 파이썬으로 변환해서 구현해 본 것입니다.
https://blog.naver.com/lagrange0115/221335132486
https://m.blog.naver.com/lagrange0115/221335132486
댓글