본문 바로가기
Quality control (Univ. Study)/Signal and System

Signal and System approximate computing

by 생각하는 이상훈 2022. 11. 6.
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()

N=10

 

N=50

 

N=100

 

N=500

 

2번에서 이용할 INF값을 설정하기 위해 N에 값을 대입해 보았는데 N이 10000이상이 되면 주어진 그래프와 거의 유사하게 나타나는 것을 알 수 있다.

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()

 

N=10

 

N=50

 

N=100

 

N=500


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 주변을 조사하였다.

{"originWidth":288,"originHeight":186,"style":"alignCenter","caption":"N=10             
{"originWidth":261,"originHeight":186,"style":"alignCenter","width":293,"height":209,"caption":"N=50             
{"originWidth":266,"originHeight":194,"style":"alignCenter","width":289,"height":211,"caption":"N=100           
{"originWidth":336,"originHeight":192,"style":"alignCenter","width":303,"height":173,"caption":"N=500         


Gibbs phenomenon

깁스현상은 푸리에 급수에서 불연속인 지점에서 overshoot 현상이 일어나는 것이다. 그리고 이 현상은 N을 증가시켜주어 더 많은 사인파들을 더해주어도 일정 수준이상으로 해결되지 않는다. 그리고 그정도는 약 9%인데 이는 다음과 같이 계산된다.


 

728x90