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

[Android] Android Studio static / member variable prefix 설정 방법

Java 에서 static 변수는 는 s~로,  맴버 변수는 m~ 으로 시작하는 경우가 대부분이다. Android Studio 에서 변수를 선언 후 getter/setter 를 자동 생성하면 [(cmd + n) -> (Getter and Setter) 선택] 아래와 같이 s 와 m 이 붙어 나오게 된다. public class SampleClass { private static int sStaticVariable = 1; private int mMemberVariable = 1; public static int getsStaticVariable() { return sStaticVariable; } public static void setsStaticVariable(int sStaticVariable) { SampleClass.sStaticVariable = sStaticVariable; } public int getmMemberVariable() { return mMemberVariable; } public void setmMemberVariable(int mMemberVariable) { this.mMemberVariable = mMemberVariable; } } 하나하나 m, s 를 지우는 것 보다 setting 에서 변수 prefix 를 미리 설정해 두면  이러한 불편을 해결할 수 있다. Mac 기준으로 Android Studio -> Preferences -> Code Style -> Java 에서 Code Generation 을 선택 하면 아래와 같은 화면을 볼 수 있다. 위와같이  Field : Name Prefix 란에 "m", Static Field : Name Prefix 란에 "s" 를 입력하고 OK 버튼을 누르면 설...

[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 이정도가 아닐까 싶다. 특히, 의욕이 너무 지나쳐서 너무 많은 것을 커밋...

[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