•  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

연구실(bwlee42)/251111

최근 수정 시각 : 2025-11-11 20:48:54 | 조회수 : 54


목차

1. 합성함수 그래프 구현 코드 보완
2. LLM(Large Language Model) 제작 프로젝트
3. 튜링 프로젝트
4. 물리 R&E 주제 선정
4.1. 직류 송전과 교류 송전 효율 비교하고 모델 설계하기
4.2. 설계 속도에 따른 커브길 구조 설계하기
4.3. 공간 활용 효율을 높인 로봇 제작하기
4.4. 대기 중 전력 전송 장치 제작하기
4.5. 소음 완화 장치 제작하기
4.6. 효율적인 배수 장치 구조 설계하기
4.7. 테트라포드 구조 분석과 효율적인 방파제 설계하기
5. 과학 관련 쟁점(수업시간)

1. 합성함수 그래프 구현 코드 보완

연구실(bwlee42)/251109에서 제작한 합성함수 그래프 구현 코드를 보완한 것이다.
fc_9.py(누르면 펼쳐짐)
import tkinter as tk
from tkinter import messagebox
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

def start_animation():
    f_expr = f_entry.get()
    g_expr = g_entry.get()

    if not f_expr or not g_expr:
        messagebox.showerror("Error", "f(x)와 g(x)를 모두 입력하세요!")
        return

    try:
        f = lambda x: eval(f_expr, {"x": x, "np": np, "__builtins__": {}})
        g = lambda x: eval(g_expr, {"x": x, "np": np, "__builtins__": {}})
    except Exception as e:
        messagebox.showerror("Error", f"함수 입력 오류: {e}")
        return

    x_vals = np.linspace(-3, 3, 200)

    # f, g(f(x)) 전체 계산
    f_all, gf_all = [], []
    for x in x_vals:
        y_f = f(x)
        if not isinstance(y_f, (list, tuple, np.ndarray)):
            y_f = [y_f]
        f_all.extend(y_f)
        gf_all.extend([g(y) for y in y_f])
    f_all = np.array(f_all)
    gf_all = np.array(gf_all)

    # ---------------------------
    # 애니메이션 패널
    # ---------------------------
    fig, axes = plt.subplots(2,2,figsize=(12,8))
    ax_f, ax_g, ax_h, ax_combo = axes.flatten()

    # f 패널
    ax_f.plot(x_vals, [np.mean(f(x)) if isinstance(f(x),(list,tuple,np.ndarray)) else f(x) for x in x_vals], color='lightblue')
    ax_f.set_title('f(x)')
    ax_f.set_xlabel('x')
    ax_f.set_ylabel('f(x)=t')
    dot_f, = ax_f.plot([],[], 'ro')
    trail_f, = ax_f.plot([],[], 'b', lw=2)
    ax_f.set_xlim(min(x_vals), max(x_vals))
    ax_f.set_ylim(min(f_all)-0.5, max(f_all)+0.5)

    # g 패널
    g_all_sorted = np.sort(f_all)
    g_vals = [g(y) for y in g_all_sorted]
    ax_g.plot(g_all_sorted, g_vals, color='lightgreen')
    ax_g.set_title('g(t)')
    ax_g.set_xlabel('t')
    ax_g.set_ylabel('g(t)')
    dot_g, = ax_g.plot([],[], 'ro')
    trail_g_scatter = ax_g.scatter([],[], c=[], cmap='Greens', s=50)
    ax_g.set_xlim(min(f_all)-0.5, max(f_all)+0.5)
    ax_g.set_ylim(min(gf_all)-0.5, max(gf_all)+0.5)

    # h 패널
    ax_h.set_title('h(x) = g(f(x))')
    ax_h.set_xlabel('x')
    ax_h.set_ylabel('h(x)')
    dot_h, = ax_h.plot([],[], 'ro')
    trail_h, = ax_h.plot([],[], 'r', lw=2)
    ax_h.set_xlim(min(x_vals), max(x_vals))
    ax_h.set_ylim(min(gf_all)-0.5, max(gf_all)+0.5)

    # 추가 패널 (combo)
    ax_combo.set_title('Combined View')
    ax_combo.set_xlabel('x')
    ax_combo.set_ylabel('y')
    combo_dot_f, = ax_combo.plot([],[], 'ro', label='f(x)')
    combo_trail_f, = ax_combo.plot([],[], 'b', lw=2)
    combo_dot_g, = ax_combo.plot([],[], 'go', label='g(f(x))')
    combo_trail_g, = ax_combo.plot([],[], 'g', lw=2)
    combo_dot_h, = ax_combo.plot([],[], 'mo', label='h(x)')
    combo_trail_h, = ax_combo.plot([],[], 'm', lw=2)
    ax_combo.legend()
    ax_combo.set_xlim(min(x_vals), max(x_vals))
    ax_combo.set_ylim(min(min(f_all), min(gf_all))-0.5, max(max(f_all), max(gf_all))+0.5)

    # ---------------------------
    # 히스토리
    # ---------------------------
    x_hist_f, y_hist_f = [], []
    x_hist_h, y_hist_h = [], []
    trail_g_count = {}

    combo_xf, combo_yf = [], []
    combo_xh, combo_yh = [], []
    combo_xg, combo_yg = [], []

    # ---------------------------
    # 애니메이션 업데이트
    # ---------------------------
    def update(frame):
        x = x_vals[frame]
        y_f_raw = f(x)
        if not isinstance(y_f_raw,(list,tuple,np.ndarray)):
            y_f_vals = [y_f_raw]
        else:
            y_f_vals = y_f_raw
        y_h_vals = [g(y) for y in y_f_vals]

        # f
        dot_f.set_data([x]*len(y_f_vals), y_f_vals)
        x_hist_f.extend([x]*len(y_f_vals))
        y_hist_f.extend(y_f_vals)
        trail_f.set_data(x_hist_f, y_hist_f)

        # g
        dot_g.set_data(y_f_vals, y_h_vals)
        for xf,yf in zip(y_f_vals,y_h_vals):
            key = (xf,yf)
            trail_g_count[key] = trail_g_count.get(key,0)+1

        xs,ys,cs=[],[],[]
        for (xf,yf),count in trail_g_count.items():
            xs.append(xf)
            ys.append(yf)
            cs.append(min(count,10))
        if xs:
            trail_g_scatter.set_offsets(np.c_[xs,ys])
            trail_g_scatter.set_array(np.array(cs))

        # h
        dot_h.set_data([x]*len(y_h_vals), y_h_vals)
        x_hist_h.extend([x]*len(y_h_vals))
        y_hist_h.extend(y_h_vals)
        trail_h.set_data(x_hist_h, y_hist_h)

        # combo panel
        combo_xf.extend([x]*len(y_f_vals))
        combo_yf.extend(y_f_vals)
        combo_trail_f.set_data(combo_xf, combo_yf)
        combo_dot_f.set_data([x]*len(y_f_vals), y_f_vals)

        combo_xh.extend([x]*len(y_h_vals))
        combo_yh.extend(y_h_vals)
        combo_trail_h.set_data(combo_xh, combo_yh)
        combo_dot_h.set_data([x]*len(y_h_vals), y_h_vals)

        combo_xg.extend(y_f_vals)
        combo_yg.extend(y_h_vals)
        combo_trail_g.set_data(combo_xg, combo_yg)
        combo_dot_g.set_data(y_f_vals, y_h_vals)

        return (dot_f, trail_f, dot_g, trail_g_scatter, dot_h, trail_h,
                combo_dot_f, combo_trail_f, combo_dot_g, combo_trail_g,
                combo_dot_h, combo_trail_h)

    ani = FuncAnimation(fig, update, frames=len(x_vals), interval=50, blit=False, repeat=False)
    plt.show()


# ---------------------------
# Tkinter GUI
# ---------------------------
root = tk.Tk()
root.title("g(f(x))")

tk.Label(root, text="f(x) =").grid(row=0,column=0)
f_entry = tk.Entry(root, width=30)
f_entry.grid(row=0,column=1)
f_entry.insert(0,"np.sin(x)")

tk.Label(root, text="g(x) =").grid(row=1,column=0)
g_entry = tk.Entry(root, width=30)
g_entry.grid(row=1,column=1)
g_entry.insert(0,"np.exp(x)")

start_btn = tk.Button(root, text="Start Animation", command=start_animation)
start_btn.grid(row=2,column=0,columnspan=2,pady=10)

root.mainloop()

최종적으로 모든 함수들이 구현되는 창을 하나 더 만들었다.
f(x)=sin(x), g(x)=exp(x)인 경우 실행(누르면 펼쳐짐)
파일:fc-2.gif

2. LLM(Large Language Model) 제작 프로젝트

언젠가 진행할 프로젝트이다. 파이썬의 강화학습을 통해 만들고, 그 원리를 파헤쳐 볼 생각이다.

LLM은 인공지능의 대중화에 크게 기여한 인공지능의 한 형태이다.
2022년 11월 세상에 공개 된 오픈AI의 Chat-GPT가 그것의 대표적인 예시인데, 요즘 가장 각광 받는 인공지능의 한 형태이자
접근성도 좋아서 굉장히 큰 시장 규모를 형성하고 있고 그 전망도 감히 에측할 수 없을 정도로 무궁무진하다.

그래서 LLM의 구조에 대해 호기심이 생겼는데, 직접 만들고 그 원리를 기록해보면 좋지 않을까 싶다.

이론적인 부분부터 조금씩 공부하고, 파이썬을 이용해 직접 간단하게 제작해보겠다.

3. 튜링 프로젝트

언젠가 진행할 튜링 머신 제작 프로젝트이다. 장기적인 프로젝트가 될 것 같다.

사실 튜링 머신을 그냥 구현하는 것만으로도 의미가 있긴 하지만, 너무 싱겁게 끝날 듯 해서 튜링 머신을 가지고 다양한 알고리즘들을 구현해 볼 생각이다. 이론 컴퓨터 과학 분야의 도서도 많이 읽어보고 조금씩 공부해야할 것 같다.

아주 기초적인 튜링 머신부터 보편 튜링 머신까지 확장해보겠다.
대충 계획은 이렇다.
  • 튜링 머신의 이론적인 부분 공부하고 기록하기
  • 지피티와 함께 코드 작성해서 실행시키기
  • 코드 분석 하고 내용 기록하기
  • 이것 저것 알고리즘 제작하고 구현해보기
  • 확장...

4. 물리 R&E 주제 선정

4.1. 직류 송전과 교류 송전 효율 비교하고 모델 설계하기

4.2. 설계 속도에 따른 커브길 구조 설계하기

4.3. 공간 활용 효율을 높인 로봇 제작하기

4.4. 대기 중 전력 전송 장치 제작하기

4.5. 소음 완화 장치 제작하기

4.6. 효율적인 배수 장치 구조 설계하기

4.7. 테트라포드 구조 분석과 효율적인 방파제 설계하기

5. 과학 관련 쟁점(수업시간)

주제: AI 교과서 도입 논란에 대해 찬성과 반대

AI 교과서 도입에 반대한다.
왜냐하면 첫째, 현재 학교에서 진행하는 아날로그 수업은 여전히 가치가 있기 때문이다.
이러한 전통적인 방식은 디지털 매체와 달리 비교적 안정적인 형태로 진행되기 때문에 변하지 않는 가치와 학습의 본질을 상기시켜 주는 동시에 디지털화 된 세상 속에서 균형을 잡아주는 중요한 요소로 자리 잡고 있다.

둘째, 이미 온라인을 이용한 수업의 능률이 떨어진다는 것이 증명되었다. 코로나 시기를 겪으며 많은 학생들이 온라인을 통한 교육을 경험했지만, 기초학습결손과 교육격차 문제가 심각하게 대두되었던 적이 있다.

셋째, AI 교과서 도입을 통해 얻고자 하는 것이 명확하지 않다. 인공지능 교과서를 도입함으로써 일부 정책가들은 공교육이 사교육을 앞지를 수 있다고 말하지만, 이는 공교육의 본질을 잘 못 이해한 것으로 보인다. 공교육과 사교육의 차이를 명확히 이해한다면 이러한 주장은 펼칠 수 없을 것이다.

이러한 문제는 계속해서 되풀이 되고 있다. AI 교과서가 없어서 제대로 된 교육을 못한 게 아니라 학습자 중심의 교육이라는 본질을 잘 못 이해하고 있기 때문에 이러한 상황이 발생하는 게 아닐까란 생각이 든다.
그래서 인공지능 교과서 도입에 반대한다.

출처:https://21erick.org/column/14519/