728x90
1번 문제 소스코드
import math #삼각함수와 pi를 이용하기 위해 math 모듈 import
import matplotlib.pyplot as plt #pip install matplotlib을 통하여 미리 module install
N = int(input()) #예삿값을 구하기 위한 N을 입력
t = 0
graph = [] #빈 리스트 생성
def sigma(t): #x_hat_n(t)의 결과를 구하는 sigma 함수 정의
n = 1 #n -> 1~N
sum = 0.0
while n < N: #n이 N보다 작은 경우에
sum += (4.0 / math.pi) * (1 / n) * math.sin(n * math.pi * float(t)) #x(t)식 계산
n += 2 #n에 홀수값 대입
return sum
while t <= 2000: #t를 0.005로 설정하면 계산상 오류가 발생할 수 있어 t를 0~2000, 5씩증가로 잡아줌
graph.append(sigma(t * 0.001)) #미리 만들어둔 graph 리스트에 결과 값 입력 (1000배 해둔 t에 0.001배)
t += 5 #5씩 증가(실제로는 0.005)
#module을 이용하여 그래프 그리기
plt.title("x_hat_n(t)")
plt.plot(graph)
plt.show()
2번에서 이용할 INF값을 설정하기 위해 N에 값을 대입해 보았는데 N이 10000이상이 되면 주어진 그래프와 거의 유사하게 나타나는 것을 알 수 있다.
2번 문제 소스코드
import math #삼각함수와 pi를 이용하기 위해 math 모듈 import
import matplotlib.pyplot as plt #pip install matplotlib을 통하여 미리 module install
N = int(input()) #예삿값을 구하기 위한 N을 입력
INF = 10000 #1번에서 N값이 10000이상이면 N이 무한대인 x(t)와의 차이를 육안으로 구별하기 힘듬을 확인
t = 0
graph = [] #empty 리스트 생성
def x_hat_n(t): #x_hat_n(t)의 결과를 구하는 sigma 함수 define
n = 1 #n -> 1~N
sum = 0.0
while n < N: #n이 N보다 작은 경우에
sum += (4.0 / math.pi) * (1 / n) * math.sin(n * math.pi * float(t)) #x(t)식 계산
n += 2 #n에 홀수값 대입
return sum
def x(t): #x(t)의 결과를 구하는 sigma 함수 define
n = 1 #n -> 1~INF
sum = 0.0
while n < INF: #n -> INF
sum += (4.0 / math.pi) * (1 / n) * math.sin(n * math.pi * float(t)) #x(t)식 계산
n += 2 #n에 홀수값 대입
return sum
def e_n(t): #x(t)와 x_hat_n(t)의 차를 구하는 e_n(t)함수 define
result = x(t) - x_hat_n(t)
return result
while t < 2000: #t를 0.005로 설정하면 계산상 오류가 발생할 수 있어 t를 0~2000, 5씩증가로 잡아줌
graph.append(e_n(t * 0.001)) #미리 만들어둔 graph 리스트에 결과 값 입력 (1000배 해둔 t에 0.001배)
t += 5 #5씩 증가(실제로는 0.005)
#module을 이용하여 그래프 그리기
plt.title("e_n(t)")
plt.plot(graph)
plt.show()
3번 소스코드
import math #삼각함수와 pi를 이용하기 위해 math 모듈 import
import matplotlib.pyplot as plt #pip install matplotlib을 통하여 미리 module install
N = int(input()) #예삿값을 구하기 위한 N을 입력
INF = 10000 #1번에서 N값이 10000이상이면 N이 무한대인 x(t)와의 차이를 육안으로 구별하기 힘듬을 확인
t = 0
graph = [] #empty 리스트 생성
def x_hat_n(t): #x_hat_n(t)의 결과를 구하는 sigma 함수 define
n = 1 #n -> 1~N
sum = 0.0
while n < N: #n이 N보다 작은 경우에
sum += (4.0 / math.pi) * (1 / n) * math.sin(n * math.pi * float(t)) #x(t)식 계산
n += 2 #n에 홀수값 대입
return sum
def x(t): #x(t)의 결과를 구하는 sigma 함수 define
n = 1 #n -> 1~INF
sum = 0.0
while n < INF: #n -> INF
sum += (4.0 / math.pi) * (1 / n) * math.sin(n * math.pi * float(t)) #x(t)식 계산
n += 2 #n에 홀수값 대입
return sum
def e_n(t): #x(t)와 x_hat_n(t)의 차를 구하는 e_n(t)함수 define
result = x(t) - x_hat_n(t)
return result
while t <= 2000: #t를 0.005로 설정하면 계산상 오류가 발생할 수 있어 t를 0~2000, 5씩증가로 잡아줌
graph.append(e_n(t * 0.001)) #미리 만들어둔 graph 리스트에 결과 값 입력 (1000배 해둔 t에 0.001배)
t += 5 #5씩 증가(실제로는 0.005)
#|eN(t)| 최대값 조사
print(graph[198])
print(graph[199])
print(graph[200])
print(graph[201])
print(graph[202])
#module을 이용하여 그래프 그리기
plt.title("e_n(t)")
plt.plot(graph)
plt.show()
1,2번을 풀 때 값을 graph list에 넣어두고 자동으로 그림을 그려주도록 모듈을 이용했기에 최대값을 조사하기 위해 표의 중심부와 그 주변을 조사하여 출력하는 코드를 2번 소스코드에 추가하였다. 0~400 index까지 list가 채워져 있기 때문에 index를 기준으로 200 주변을 조사하였다.
Gibbs phenomenon
깁스현상은 푸리에 급수에서 불연속인 지점에서 overshoot 현상이 일어나는 것이다. 그리고 이 현상은 N을 증가시켜주어 더 많은 사인파들을 더해주어도 일정 수준이상으로 해결되지 않는다. 그리고 그정도는 약 9%인데 이는 다음과 같이 계산된다.
728x90