3 분 소요

계측공학에서 배운걸로 5장 문제를 풀어보자!


저번에 5장 숙제인 9,14,19번 문제를 풀었고, 오늘은 나머지 문제들을 해결해보려고 한다.

5장 9번

brave_5Oq7Cz2Wfx

5.9. 초기 부피 𝑉0를 가진 물이 담긴 탱크가 탱크 바닥의 구멍을 통해 물을 배출한다. 배출 속도가 탱크 안의 물의 부피에 비례한다면, 이 시스템의 시간 상수를 구하라.

1>배수율에 대한 관계 설정

brave_TNlMdkv1KR

2>미분방정식 풀이

brave_tWguunqwwH

3>시정수 구하기

brave_paOXD2366N

시정수는 기존값의 36.8%가 되는 지점의 x값을 말하는 것이다. 보통 그림을 그려보면 다음과 같이 상승하거나 하강하는 양상의 그림이 그려진다.

brave_0OKO7N83zw

이를 참고하여 다음과 같이 실제코드로 작성해보았다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# 주어지 초기 조건 및 상수
V0 = 1000 #초기 물의 양 (예를 들어, 1000리터)
k = 0.1   #비례 상수 (임의의 값, 단위: 1/초)

# 시정수 계산
tau = 1/k
print(f"시정수 (tau): {tau}초")

# 시간 범위 설정 (0부터 5*tau까지)
t_span = (0, 5 * tau)
t_eval = np.linspace(*t_span, 1000)

# 미분방정식 정의
def dVdt(t,V):
    return -k * V

# 미분 방정식 풀이
sol = solve_ivp(dVdt, t_span, [V0],  t_eval=t_eval)

# 결과 플로팅
plt.plot(sol.t, sol.y[0], label=f"V(t) = {V0} * exp(-{k}t)")
plt.axhline(0, color='grey', lw=0.5) # x축과 평핸한 점근선
plt.axvline(tau, color='red')
plt.xlabel('Time (s)')
plt.ylabel('Volume (L)')
plt.title('Volume of Water in Tank Over Time')
plt.legend()
plt.grid()
plt.show()

results>

brave_xArZ5tahRM

5장 14번

brave_FS5lz6jHrR

5.14. 압력 변환기는 2차 시스템으로 작동한다. 감쇠되지 않은 고유 주파수가 4000 Hz이고 감쇠가 임계의 75%일 때, 측정 오차가 5%를 넘지 않는 주파수 범위를 구하라.

단순히 수식으로만 접근하면 다음과 같이 구현해볼 수 있다.

import sympy as sp

# 주어진 값들
omega_n = 4000
zeta = 0.75

# 주파수 변수를 정의
omega = sp.symbols('omega', real=True, positive=True)


# 정의
lhs = omega_n**4/0.9025 # lhs: left half side
rhs = (omega_n**2-omega**2)**2 + (2 * zeta * omega_n * omega)**2

# 해결
solution = sp.solve(lhs - rhs, omega)
solution

result>

[1904.31399610052]
근데 이 문제를 풀면서 한가지 의문이 들었던 부분이 있었는데, 바로 0.95 <= H(jw) <= 1.00에서 실질적으로 접근을 할때, 0.95 = H(jw) 으로 두고 방정식을 푸는 것에 초점을 맞춘다는 것이다. 왜 1 = H(jw) 에 대해서는 다루지 않을까 하는 의문이 들었다. 그리고 이 의문은 다음 그래프를 구현하여 해석해봄으로써 이해할 수 있었다.

실제 w와 H(jw)크기에 대한 관계 그래프를 나타내보면 다음과 같다.

import numpy as np
import matplotlib.pyplot as plt

# 주어진 값
omega_n = 4000 # 자연 진동수 (Hz)
zeta = 0.75    # 감쇠 비율

# 주파수 범위 설정
omega = np.linspace(0, 2 * omega_n, 10000)

# 주파수 응답 함수 정의
def H(omega, omega_n, zeta):
    numerator = omega_n**2
    denominator = np.sqrt((omega_n**2 - omega**2)**2 + (2 * zeta * omega_n * omega)**2)
    return numerator / denominator

# 주파수 응답 계산
H_omega = H(omega, omega_n, zeta)

# 5% 오차 범위
lower_bound = 0.95
upper_bound = 1.05

# 오차 범위 내의 주파수 찾기
valid_indices = np.where((H_omega >= lower_bound) & (H_omega <= upper_bound))
valid_frequencies = omega[valid_indices]

# 결과 출력
print(f"Measurement error not greater than 5% for frequencies in the range {valid_frequencies[0]:.2f} Hz to {valid_frequencies[-1]:.2f} Hz")

# 결과 플로팅
plt.plot(omega, H_omega, label='|H(jw)|')
plt.axhline(1, color='red', linestyle='--', label='|H(jw)| = 1')
plt.axhline(upper_bound, color='green', linestyle='--', label='Upper bound (1.05)')
plt.axhline(lower_bound, color='blue', linestyle='--', label='Lower bound (0.95)')
plt.fill_between(omega, lower_bound, upper_bound, where=((H_omega >= lower_bound) & (H_omega <= upper_bound)), color='grey', alpha=0.3)
plt.xlabel('Frequency (Hz)')
plt.ylabel('|H(jw)|')
plt.title('Frequency Response of the Second-Order System')
plt.legend()
plt.grid()
plt.show()

results>

brave_DzrTjhDpGL

5장 19번

brave_MqffMCp6wC

a)시정수 구하기:

brave_Znfu3UuApL

b)스위치가 닫힌 후 0.5초 뒤의 저항 양단 전압:

brave_KxyqGCifDU

이를 코드를 풀어보면 다음과 같아지고,

import numpy as np

# 주어진 값
R = 10 * 10**3     # R: 저항(옴)
C = 200 * 10**(-6) # C: 커패시턴스(패럿)
E = 5              # E: 전원전압(테스트용 값으로 5V로 설정)

# 시정수 계산
tau = R * C
print(f"시정수 (tau): {tau:.2}\n")

# 특정 시간 (0.5초) 후의 전압 계산
#1. 저항
voltage_across_resistor = E * (np.exp(-t/tau))
print(f"0.5초 후 저항 양단의 전압: {voltage_across_resistor:.2f} V")
ratio = (voltage_across_resistor/E)*100
print(f"5초 뒤의 저항 양단의 전압은 전원 전압E(5V)의 약{ratio:.2f}% 입니다.")

#2. 커패시터
t = 0.5
voltage_across_capacitor = E * (1 - np.exp(-t/tau))
print(f"0.5초 후 커패시터 양단의 전압: {voltage_across_capacitor:.2f} V")

ratio = (voltage_across_capacitor/E)*100
print(f"5초 뒤의 커패시터 양단의 전압은 전원 전압E(5V)의 약{ratio:.2f}% 입니다.\n")

result>

시정수 (tau): 2.0

0.5  저항 양단의 전압: 3.89 V
5 뒤의 저항 양단의 전압은 전원 전압E(5V) 약77.88% 입니다.
0.5  커패시터 양단의 전압: 1.11 V
5 뒤의 커패시터 양단의 전압은 전원 전압E(5V) 약22.12% 입니다.

이를 그래프로 시각화해보면 다음과 같더라?(신기신기)

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 10, 10000)
voltage_across_resistor = E * (np.exp(-t/tau))
plt.plot(t, voltage_across_resistor, label='V(t)')
plt.axvline(0.5, color='red',linestyle='--', lw=1.5, label='0.5s after the switch is closed')
plt.axhline(3.89, color='orange', linestyle='--', lw=1.5, label='voltage across the resistor 0.5s after') # x축과 평핸한 점근선
plt.xlabel('time(sec)')
plt.ylabel('V(t)')
plt.title('Time Response of the One-Order System(in Resistor)')
plt.legend()
plt.grid()
plt.show()

result>

brave_shJYVnnD6E

추가적으로 커패시터에 걸리는 전압은 이거에 반비례하게 되니 이것도 확인해보았다.

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 10, 10000)
voltage_across_resistor = E * (1 - np.exp(-t/tau))
plt.plot(t, voltage_across_resistor, label='V(t)')
plt.axvline(0.5, color='red',linestyle='--', lw=1.5, label='0.5s after the switch is closed')
plt.axhline(1.11, color='orange', linestyle='--', lw=1.5, label='voltage across the resistor 0.5s after') # x축과 평핸한 점근선
plt.xlabel('time(sec)')
plt.ylabel('V(t)')
plt.title('Time Response of the One-Order System(in Capacitor)')
plt.legend()
plt.grid()
plt.show()

result>

brave_0hLWFhaiEH

손풀이



다음에 나머지 문제들도 풀어보자!

댓글남기기