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

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

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

[Android Application Testing Guide] Chapter3 jar file

Android Application Testing Guide(에이콘) 3장 Sample 을 실행시키기 위해서는 libdummy-0.0.1.jar 가 필요한데, sample file 에는 프로젝트만 존재한다. 결국 jar 를 만들어야 되는데.. ant 빌드다. 어허허... jar 파일이 없으면 예제 진행이 어려우므로. ant build 한 jar 를 첨부. libdummy-0.0.1.jar download

[Python] Core Python Application Programming 예제 3-1 수정

코어 파이썬 애플리케이션 프로그래밍 146~7p 의 예제 3-1 코드가 정상적으로 동작하지 않는 이유는 아래와 같습니다. 문제가 되는 구간은 40~41 라인, 44 라인인데 라인 비교를 위해 38 라인부터 보면, 책의 경우, except ftplib.error_perm: print 'ERROR: cannot read file "%s"' %FILE if os.path.exists(FILE): os.unlink(FILE) else: print '*** Download "%s" to CWD'%FILE f.quit() 그러나 실제로는 아래와 같이 되어야 정상적으로 동작 합니다. except ftplib.error_perm: print 'ERROR: cannot read file "%s"' %FILE if os.path.exists(FILE): os.unlink(FILE) else: print '*** Download "%s" to CWD'%FILE f.quit() 이유인즉, 40~41 라인 코드가 다운로드 완료 if 문으로 동작해서 다운로드 완료 된 파일을 다시 삭제하기 때문입니다. 따라서 전체 동작하는 코드는 아래와 같습니다. #!/usr/bin/env python import ftplib import os import socket HOST = 'ftp.mozilla.org' DIRN = 'pub/mozilla.org/webtools' FILE = 'bugzilla-LATEST.tar.gz' def main(): try: f = ftplib.FTP(HOST) except (socket.er...