TroubleShooting

RuntimeWarning: divide by zero encountered in scalar divide M[n, m] = num / den 해결방법

JackSmith 2023. 10. 20.

 

아래 코드를 실행했을때, 정상적으로 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

 

전달함수의 3D plot (S-평면과 주파수응답 곡선)

아래와 같은 전달함수의 pole은 ±10j 이고, zero는 20입니다. S 평면 위에 pole과 zero를 나타내면 그림 ...

blog.naver.com

https://m.blog.naver.com/lagrange0115/221335132486

 

전달함수의 3D plot (S-평면과 주파수응답 곡선)

아래와 같은 전달함수의 pole은 ±10j 이고, zero는 20입니다. S 평면 위에 pole과 zero를 나타내면 그림 ...

blog.naver.com

 

댓글