라벨이 Math인 게시물 표시

(-1) x (-1) = 1, Why?

이미지
개요 최근 웹에 LaTeX 수식을 적용하다 갑자기 궁금한 점이 생겼습니다. "왜 음수에 음수를 곱하면 양수가 될까?" 라는 생각이 문득 들었습니다.  예전에 고민하고 찾아봤었던 부분인데 기억나지는 않습니다. 😥

순열에 대한 통찰

이미지
개요 안녕하세요. 오늘은 알고리즘문제에 자주 등장하는 순열 문제를 재귀호출 로 풀어보려 합니다. 순열은 조합과 비슷한 점이 많아 문제를 풀다 서로 혼동해 틀리는경우가 많습니다. 백준 ➡️ 단계별로 풀기 ➡️ 백트래킹 단계에 나온 2가지 순열 패턴 개념을 정리하고, 문제를 풀며 살펴보겠습니다. 

좌표들의 Fitting 근사함수 생성앱 만들기

이미지
개요 이번 예제는 마우스로 드래그한 좌표를 기반으로 근사함수를 Fitting 하는 예제 입니다.  차트 위 마우스로 선을 그리면 해당 좌표에 적합한 근사함수를 차수에 따라 만들어주는 기능을 가지고 있습니다.  (함수 항의 0.00 은 소수점 표시가 2자리로 고정 되어 그 이하값이 생략되지만 연산에는 반영)  [DragFit 실행화면] 동영상을 통해 차수가 올라갈 수록 보다 적합 해지는 과정을 확인 할 수 있습니다. 참고로 위 예제는 Numpy의 polyfit () 함수 에 의해 데이터 셋을 근사화 하고 있습니다. 좀 더 들여다 보면 polyfit 함수는 3개의 전달인자 x data, y data, deg(차수) 를 전달하면 최소제곱법 을 사용하여 직선의 기울기 와 절편 을 찾을 수 있습니다. 직선의 기울기와 절편은 데이터 셋과 직선 사이의 오차의 제곱합을 최소화 하는 값입니다. 예를 들면 아래의 데이터 셋을 최소제곱법으로 근사하면 아래와 같습니다. import numpy as np # 주어진 데이터 포인트들 x = np.array([1, 2, 3, 4, 5]) y = np.array([3, 6, 5, 8, 10]) z = np.polyfit(x, y, 1) print(z) # z = [1.6 1.6] # 기울기, 절편 # f(x) = 1.6 * x + 1.6 [최소제곱법 예] Machine Learning 을 공부하다 보면 데이터 셋을 구성하고 위처럼 다항식을 써서 예쁜 모델을 만들면 현재 데이터셋에는 완벽하게 적합하지만 일반화된 다른 모델에는 과적합...

컴퓨터의 수치연산원리, Infix to Postfix에 대한 이해

이미지
개요 안녕하세요. 중위 표기법(infix) 으로 표현된 수식을 후위 표기법(postfix) 로 바꾸는 C++ 계산기입니다.   1. 문자열로 중위표기법 입력 ( A-Z, a-z, 0~9,+,-,*,/,^,(,) )   2. 피연산자 (A-Z, a-z, 0~9) 는 후위식 문자열에 저장   3. 열리는 괄호 '(' 는 Stack에 저장   4. 닫기는 괄호 ')' 만나면 다음 '(' 만나기 전까지 Stack Pop 수행, 후위식 문자열에 저장   5. 연산자는 Stack에 추가 우선순위가 높은 연산자는 Stack Pop 수행, 후위식 문자열에 저장 개발 환경 C++17, Qt Creator 9.0.1, MinGW 11.2.0 64bit Windows 11 Pro   calc.h #ifndef CALC_H #define CALC_H #include <string> class Calc { public: Calc(const std::string& exp); ~Calc(); private: const unsigned int MAX; std::string infix; int priority(char c); public: std::string infixToPostfix(); int calcPostfix(const std::string& exp); }; #endif // CALC_H   calc.cpp #include "calc.h" #include <iostream> #include <cstring> #include <stack> #include <cmath> using namespace std; Calc::Ca...

2D 게임의 기본 벡터 이동, 회전 변환 행렬이해하기

이미지
개요 이번에는 Python + PyQt5를 이용해 마우스를 따라 다니며 회전 하는 물체 를 구현해 보았습니다. 벡터, 회전행렬 연산 을 이용해 구현되어 있으며, 자세한 수식유도과정은 소스코드 설명부에서 진행하고 결과만 먼저 살펴보겠습니다. 전반적인 동작방식은 아래와 같습니다. 1. 마우스 포인터 위치와 사각형의 위치 비교 후 (벡터 차연산) 가속도벡터 를 만들고 이를 속도벡터 에 더해 속도 구하기. (가속도는 속도에 영향) 2. 속도는 사각형의 위치에 영향을 미치므로 속도벡터와 사각형위치벡터를 합연산 . 3. 사각형은 가속하며 마우스위치로 이동. 4. 사각형 이동시 속도 벡터의 각도 를 구해 사각형 4개 꼭지점을 원점을 중심으로 회전. (회전변환 행렬) 5. 회전된 사각형의 4개 꼭지점을 이어서 선을 그리면 사각형 이동시 방향이 전환됨.

PyQt와 피타고라스정리를 이용한 양궁 게임

이미지
개요 이번에 만든 파이썬 예제는 양궁게임(Archery Game) 입니다. 마우스를 클릭하면 움직이는 QProgressBar (수평, 수직) 를 이용해 x, y  좌표를 설정하고 과녁에 맞춘 위치 표시합니다. 심화반 초등학생이 C++, MFC로 만든 양궁게임에서 영감을 얻어 Python과 PyQt5를 이용해 만들해 보았습니다. [양궁게임 실행화면] 설계 과정 1. 윈도우 창의 하단, 우측에 수평, 수직 QProgressBar를 배치 (X, Y 좌표 얻기 용도) 2. QFrame을 이용해 양궁 과녁판 제작 (정사각형) [과녁판] 3. 양궁 과녁 점수판 사각형 영역 얻기 (과녁 사각형을 줄여가며) [과녁 점수판 영역 설정] 4. 사각형에 내접하는 원으로 그리기 [과녁 점수판 원으로 표현] 5. 과녁 색상 입히기 [과녁 완성 모습] 6. 피타고라스의 정리를 이용해 점수 구하기 [화살 좌표로 점수 구하기] 좀 더 세부적인 내용은 소스코드를 보며 알아보겠습니다. 소스코드 2개의 파이썬 파일로 구성 (main.py, archery.py) main.py import sys fro...

PyQt로 구현한 아날로그 시계 2편

이미지
NTP에 대해 설명한 아날로그 시계 1편 에 이어, 실제 Analog Clock을 그리는 2편입니다. Python에서 NTP(Network Time Protocol)을 이용한 시간 얻기 는 1편을 참조하기 바랍니다. 2편에서는 얻어진 시간정보로 아날로그 시계를 그리는 방법 에 대해 살펴보겠습니다. 완성된 모습은 아래와 같습니다. pyinstaller 실행파일 링크 : Analog Clock.exe [Python Analog Clock] 자세한 개요는 1편에 있으므로, 바로 소스코드를 분석해 보겠습니다. 소스 코드 분석 전체 코드는 2개의 파이썬 파일로 구성되어 있으며(main.py, NTP.py), 이번 시간에는 시계를 그려내는 main.py 파일을 살펴보겠습니다. 프로그램을 실행하기 위해서는 1편의 NTP.py 파일과 2편의 main.py 파일 2개가 필요합니다. NTP.py ( 1편 참조 ) main.py 윈도우 창을 구성하고, 시계외형 원, 시간표시, 시, 분, 초침, 날짜 등을 그리는 역할입니다. 세부내용은 아래 main.py 전체 코드 를 살펴보고 설명하겠습니다. import sys import math from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from NTP import NTP from threading import Thread import time QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class CWidget(QWidget): displayUpdate = pyqtSignal() def __init__(self): super().__init__() ...

PyQt로 구현한 아날로그 시계 1편

이미지
이번에 만들어본 예제는 아날로그 시계 (Analog Clock) 입니다.   먼저 완성된 모습을 살펴보겠습니다. [아날로그 시계 화면]     Python, PyQt5를 이용해 구현되어 있습니다. Pyinstaller 로 제작된 실행 파일(exe) : Analog Clock 개요 전 세계 시간을 모두 표시 할 수 있는 아날로그 시계를 파이썬으로 만들어 보았습니다. Network Time Protocol 을 이용, 온라인으로 타임서버에 접속 해 시간을 읽어와 표시하는 프로그램 입니다. [인터넷 연결시, On-line 표시] 타임서버에 접속 불가 시(오프라인)는 운영체제에서 시간을 읽어와 표시합니다. [인터넷 연결불가시, Off-line 표시] 윈도우 시간이 맞지 않을때 time.windows.com 이라는 타임서버에 접속해 시간을 설정(동기화)하는 원리와 같습니다. 시침, 분침, 초침의 변화하는 각도와 원(시계)의 반지름 정보를 기반으로 삼각함수로 좌표를 찾고 선을 그려주는 방식으로 구현되어 있습니다. UTC (협정 세계시)를 적용 해 각 나라별 세계 시간이 모두 구현되어 있습니다. 아래는 주요 국가별 UTC 지도 입니다. [협정 세계시 지도, 출처 : 위키백과] 주요 기능 1. NTP ( N etwork T ime P rotocol) 를 이용한 온라인 시간 표시 2. 인터넷 비 연결시 Off-line 시간 표시 (시스템 시간 이용) 3. On-line or Off-line 자동 감지 4. UTC 기반 세계 시계 표시 (UTC-12~UTC+14) 5. 시계 주요 부분 개별 그리기 (위 동영상 참조)   소스 코드 분석 총 2개의 파일로 구성. (main.py , NTP.py) NTP.py 먼저 타입서버에 접속해 시간정보를 읽어오는 부분입니다. 설명은 소스코드 뒤에서 이어 가도록 하고, 전체 코드를 살펴보겠습니다. f...

저항력, 중력 벡터 GUI구현

이미지
Drag force and Gravity 이번에는 Python, PyQt5를 이용해 구현한 저항력(Drag force), 중력(Gravity) 예제를 소개하려 합니다. 자세한 소스코드는 맨 뒤에 살펴보고, 일단 수식 유도과정과 결과만 살펴보겠습니다. 앞 게시물인 벡터(1편) , 힘과 가속도(2편) 에 이어지는 내용입니다. 1. 유체 저항 어떤 물체가 공기나 물속에서 받는 저항을 어떻게 프로그래밍으로 구현할 수 있을까요? 아래는 유체 저항(벡터, 힘)을 구하는 수식입니다. 각각, F 는 저항력, C는 저항 계수, A는 유체와 닿는 앞면적, p는 액체밀도, V는 속도의 방향을 뜻하는 단위벡터입니다. 저항력 F 벡터를 구해 속도의 방향과 반대로 적용 해 주면 힘이 감소 됩니다. [유체저항 공식] 앞 게시물에서 가속도는 속도 에 영향을 미치고, 속도는 위치 에 영향을 미친다는 사실을 살펴보았습니다. 또한 가속도, 속도, 위치는 벡터라는 것도 살펴보았습니다. 실제 우리가 사는 세계나 정확한 계산이 필요한 시뮬레이션 소프트웨어라면 위의 수식에 들어가는 계수(Coefficient)들을 정확하게 측정해서 적용 해야 하겠지만 우리가 만드는 코드는 꼭 정확해야 할 필요는 없습니다. 왜냐하면, 프로그래머인 내가 창조하는 소프트웨어 속 세상에서 유체저항을 내가 원하는 대로 만든다고 해도 누가 뭐라 할 사람은 없습니다. 이해를 돕기 위해 위의 유체저항 공식을 재 구성해 보겠습니다. 위 수식에서 저항계수(C), 물체 앞면적(A), 액체 밀도(p)는 프로그래머가 편리하게 상수를 정해 쓰면 됩니다. 예) 저항계수(C) : 0.1, 물체 앞면적(A) : 무시, 액체 밀도(p) : 1 ... 이렇게 생각하면 위 유체저항 수식은 아래와 같이 간략히 만들어 볼 수 있습니다. 저항력(힘, 벡터) =  속도(벡터) * ...

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기