Skip to main content

[physics] Computational Science & Python

학부생때 처음 전산물리 과목을 수강하면서 "이건 도대채 어떻게 공부해야 하는가" 에 대해서 고민했던 기억이 난다.
Java 가 먼지, 프로그래밍이 먼지도 모르는 학생들에게 1학기동안 swing 까지 나가는 살인적인 진도는 도저히 따라가기 힘들었다.
programming 이란 무엇인가. 물리공부를 하는데 이게 왜 필요한가 에 대한 끝없는 반문.
학기가 끝날쯤에야 Java 를 한번 공부해보자 라는 생각이 들 정도였으니 성적은 말할것도 없다.

지금와서 생각해보면 전산물리 라는 과목에 Java 라는 언어는 상당히 부담스럽다는 생각이 든다.

과목의 목적이 원래 컴퓨터를 통한 물리실험으로 물리의 이해를 돕고자 하는 목적이 컸는데,
물리 실험을 하기 위해서는 Java  라는 프로그래밍 언어를 사용해야만 하는 (그것도 잘..)
어떻게보면 배보다 배꼽이 더 큰 상황이랄까.
특히 GUI 화면을 구현하고 EventHandling 을 사용하기 위해 Swing 을 사용하는 것은 지금와서 하라고해도 쉽게 하지 못할것 같다.(요즘  Swing 을 잘 안쓰기도하니까..)

그래도 우리과는 다행이라고 생각했던 것이..시중에 나와있는 책들을 보면 전산물리 관련 도서는 대부분  VB, C 를 기반으로 한다. 아마 VB 로 시작했다면 난 IT 분야는 생각도 안했을지 모른다.

최근 Python 을 공부하면서 전산물리를 Python 으로 배웠다면 과연 어땠을까? 라는 생각을 하게되었다.

개인적으로 물론 Java 도 멋진 언어이지만, 프로그래밍을 모르는 상태에서 전산물리를 가르쳐야 한다면, 그 언어는 Python 이 더 알맞은 언어라고 생각한다.

먼저 아래 두 코드를 한번 살펴보자. 아래 코드는 반지름이 0.2,0.5,1.5m 일때의 ElectricField 를 계산하고 있다.

1. Python (calc_electric_field.py)
# -*- coding:utf-8 -*-
import math

r = [0.20, 0.50, 1.50] # define radius to list
k = 8.988*math.pow(10,9)
q = 5*math.pow(10,-6)
R = 0.50

for radius in r:

    if radius>R:
        E = k*q/math.pow(radius,2)
    elif radius==R:
        E = k*q/math.pow(R,2)
    else:
        E = k*q*radius/math.pow(R,3)

    print"r=%0.2fm, E=%8.3f N/C"%(radius,E)

2.Java (CalcElectricField.java)
public class CalcElectricField {
    public static void main(String[] args) {

        double r[] = {0.02, 0.05, 1.50};
        double k = 8.988 * Math.pow(10,9);
        double q = 5*Math.pow(10,-6);
        double R = 0.05;
        double E = 0.0;

        for(int index=0; index < r.length; index++) {
            double radius = r[index];
            if (radius > R) {
                E = k*q/Math.pow(radius,2);
            }else if (radius == R) {
                E = k*q/Math.pow(R,2);
            }else if (radius < R) {
                E = k*q*radius/Math.pow(R,3);
            }
            System.out.printf("r=%.2f m, E=%8.3f N/C",radius, E);
            System.out.println();
        }
    }
}
단순히 라인수만 비교한다면 큰 차이가 없어보일 수 있다.
중요한건 프로그래밍을 모르는 사람이 이 코드를 봤을때 얼마만큼 이해를 할 수 있느냐 이다.
Java 를 처음 공부할때 어려웠던 부분 중 하나가 main method 의 구조 이해다.
나는 식을 계산해서 결과값을 출력하는 일을 하고 싶은데 그러기 위해서는
public static void main 메소드를 반드시 구현 해야하고, Class 선언도 반드시 해야만 한다.
"이건 처음에 무조건 써 줘야하는거야" 라고 한다면, 그리고 그냥 그렇게 이해하고 만다면야 문제 없을 수 있겠지만, 경험상 타이핑을 하면서 "이건 왜 쓰는걸까?" 라는 생각이 들었고 그때부터 많은 의문들이 나를 안드로메다로 인도했다.

또한, Java 는 변수를 선언하기 위해서는 여러 타입에 대한 이해가 필수적이다. float, double, String... 물리 식 하나도 벅찬데 프로그래밍 까지 동시해 이해하면서 수업을 한다는것은 쉬운일이 아니였다.

물론 Pyhton 도 변수의 이해가 필요하긴 하다. 하지만 Python 은 Java 또는 다른 언어들(VB,C,C++) 과 비교했을 때 식 본연의 문제에 더 집중할 수 있도록 도와준다.
기본적으로 for, if 문에 대해서만 이해 한다면 위와 같은 코드를 읽는데 어려움이 없을 것 이라 생각한다.

앞으로 전산물리를 공부할 많은 물리학과 학생들이 Python  을 통해 배운다면.. 그마나 포기하는 학생이 한명이라도 줄어들지 않을까? 하는 생각이 든다.

Comments

Popular posts from this blog

[GDG Seoul] OSS/Github 입문 CodeLab 후기

작년 이맘때 쯤, GDG Android Korea 에서 CodeLab 을 진행 했었는데, 올해는 GDG Seoul 에서 진행한 "OSS/Gitub 입문 CodeLab" 이란 타이틀로 CodeLab 을 진행하여 참가하게 되었다. git 이나 Github 를 처음 사용하는건 아니였지만, 거의 SVN 처럼 사용 해 온지라, "이참에 재대로 한번 배워보자!" 하는 맘이 컸고, 다른 분들은 어떻게 Github 를 사용하시는지도 궁금했다. CodeLab 은 크게 - OSS 에 대한 설명 및 Newbi 를 위한 Tutorial - Github 및 git 에 대한 Tutorial - CodeLab 순으로 진행 되었다. (딱히 순서에 이름이 없는것 같아서 임의로 붙였다.) 1. OSS 에 대한 설명 및 Newbi 를 위한 Tutorial (뉴비X 님) ( 슬라이드 링크 ) OSS (Open Source Software) 에 대한 간략한 소개와 Linux Kernel 를 예로 Contribute 하는 방법에 대한 이야기를 들을 수 있었다. Android 의 경우만 해도 여러 open source library 의 도움으로 좀더 편하고 쉽게 App 개발을 진행 할 수 가 있는데, 사용하면서 개선한 사항에 대해서 내가 코드에 기여할 수 있겠다. 라는 생각이 많이 들었다. 특히 Newbi 를 위한 주의해야 할 사항이 인상깊었는데, 간단하게 요약 하자면, - coding Style - You are just a newbi here - start from jab  ( 작은 것 부터 시작하자.. 조그마한 작업부터, 혹은 리뷰…) - commit log style - summarized title on First Line - just \n on Second Line - Detailed log after 3rd Line 이정도가 아닐까 싶다. 특히, 의욕이 너무 지나쳐서 너무 많은 것을 커밋...

[Book] 다양한 예제로 학습하는 데이터구조와 알고리즘 for Java

인사이트 에서 Java 를 이용한 자료구조 & 알고리즘 도서가 나온다는 소식을 듣고 기다리고 있었는데, 때마침 JCO 때 인사이트 부스에서 판매하고 있었다. 원래 사려고도 했고, 책도 몇권안남아서 보자마자 바로 구입! fig1. 책 이미지 기다렸던 책이기도 했고, 이참에 자료구조를 재대로 공부해보자 라는 다짐으로 읽기 시작했다. 찾아보니 원서는 Amazon 에서도 별점이 꽤 높아보였다. 아직 초반이지만, 읽으면서 아쉬운 부분을 먼저 좀 써 보려고 한다. 아무래도 많이 기대했던지라, 좋은점 보다는 아쉬운 점이 많이 눈에 보이게 된다. 1. Java 스럽지 않은 코드 인사이트에서 출판한 이 책은 C 버전도 있다. C 버전을 좀 봐야 알겠지만, 아마도 이 책은 C 기반으로 작성 된 후, Java 로 포팅 된 느낌을 강하게 받는다. 역자 서문에서도 저자가 C 기반의 코드로 작성해서 Java 스럽지 못한 부분이 있다고 말하고 있다. 그래도 네이밍 이라던지, 기본적인 코드 스타일이 전혀 Java 스럽지 못하다 보니 보는내내 좀 불편한 기분이 든다. (난 각 언어별로 스타일을 좀 중요시 보는 편이라 아무래도 눈에 많이 거슬리는 편이다.) 또한, 자료구조를 설명하는 과정에서 포인터 라는 단어가 많이 나타난다. 아무래도 C 로 설명한 부분을 Java 로 옮기다 보니 단어 선택이나, 표현방법에서 Java 로 표현하기 애매한 부분이 있는것으로 보인다. C 랑 Java 를 모두 공부했다면 그러려니 할 수 있는 부분이지만, Java 만 조금 알고 있는 상태에서 자료구조를 공부하기 위해 이 책을 구입했다면 아마 설명 부분에서 난해하게 느껴질 수 도 있다. 2. 예제 코드의 오류. 예제코드를 타이핑 하다보면, 스펠링이 틀리거나, 앞에서 소개한 메소드를 사용하는데 메소드명이 서로 다르다거나 하는 문제로 코드가 정상적으로 동작하지 않는 문제가 보인다. 이런 문제는 번역과정에서 조금 아쉬운 문제로 보인다. Amazo...

[Tip] Homebrew 로 설치한 Python 환경에서 GAE Flask 설치하기

2014.07.10 -- Issue -- ~/.pydistutils.cfg 파일을 생성하고 나서 pip install 을 할 경우, permission denied 오류가 발생하는 경우가 있다. 이때는 prefix= 를 삭제하면 정상적으로 설치할 수 있다. 또는, 설치시 아래와 같은 명령어로 설치한다. pip install --user --install-option="--prefix=" <package-name> -------------------------------------------------- Mac 에서 Homebrew 를 사용하면 각종 package 를 편리하게 관리 할수 있다. 그런데 Homebrew 를 통해 Python 을 설치한 환경에서, Google App Engine 의 Flask package 를 설치하기 위해 명령어 ( pip install -r requirements.txt -t lib/ )를 실행하면 아래와 같은 오류가 발생한다. 말 그대로 prefix 를 설정해 달라는 이야기 인데, 해결 방법은 다음과 같다. HOME(~/) 에 .pydistutils.cfg 파일을 생성하고 아래 코드를 추가한다. [install] prefix= 그리고 다시 실행하면 정상적으로 Flask package 가 설치되는것을 확인할 수 있다. Reference 1. stackoverflow http://stackoverflow.com/questions/24257803/distutilsoptionerror-must-supply-either-home-or-prefix-exec-prefix-not-both 2. Github Issue https://github.com/Homebrew/homebrew/wiki/Homebrew-and-Python