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 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

[번역] A journey on the Android Main Thread - Part 1

본 문서는 square engineering blog 에 기재된 A journey on the Android Main Thread - Part 1 기사를 번역한 것 입니다. coding horrer 에 왜 우리는 소스 읽는 법 을 배워야 하는가 에 대한 기사 가 있습니다. 안드로이드의 가장 큰 특징 중 하나는 오픈소스 생태계 라는 점 입니다. PSVM (public static void main) public class BigBang {   public static void main ( String ... args ) {     // The Java universe starts here.   } } 모든 자바 프로그램은 public static void main() 메소드를 호출하면서 시작합니다. 이는 자바 데스크탑 프로그램, JEE 서블릿 컨테이너, 안드로이드 애플리케이션 이 모두 동일 합니다. 안드로이드 시스템은 부팅 단계에서 ZygoyteInit 이라 불리는 리눅스 프로세스를 실행합니다. 이 프로세스는 달빅VM 으로, 쓰레드에 안드로이드 SDK 의 대부분의 클래스 를 로드 하고 대기합니다. 새로운 안드로이드 애플리케이션을 시작할 때, 안드로이드 시스템은 ZygoteInit 프로세스를 포크 하게 됩니다. 포크된 자식 프로세스의 쓰레드는 대기를 해제하고, ActivityThread.main() 메소드를 호출합니다. 위키피디아 에 정의된 zygote 란 수정란을 의미합니다. Loopers 계속 진행하기 앞서, 우리는 Looper (이하 루퍼) 클래스를 살펴 볼 필요가 있습니다. 루퍼를 사용하는 것은 하나의 쓰레드가 메시지들을 연속해서 실행하도록 하는 좋은 방법 입니다. 각각의 루퍼는 메시지 객체의 큐를 지니고 있습니다. (이를 메시지 큐 MessageQueue 라고 합니다.) 루퍼는...

[Cobertura] cobertura 2.0.2 script fix

cobertura 2.0.2 버전을 다운받고 실행 시키려고 하면 엄청난 에러가 뿜어져 나온다. ㅠ 달리 설정을 틀리게 한 것도 없는데.. 하면서 script 를 열어보니 아래와 같이 작성되어 있다. - cobertura-instrument.sh java -cp `dirname $0`/cobertura.jar:`dirname $0`/lib/asm-3.3.1.jar:`dirname $0`/lib/asm-tree-3.3.1.jar:`dirname $0`/lib/asm-commons-3.3.1.jar:`dirname $0`/lib/log4j-1.2.9.jar:`dirname $0`/lib/jakarta-oro-2.0.8.jar net.sourceforge.cobertura.instrument.Main $* - cobertura-instrument.bat java -cp "%COBERTURA_HOME%cobertura.jar;%COBERTURA_HOME%lib\asm-3.3.1.jar;%COBERTURA_HOME%lib\asm-tree-3.3.1.jar;%COBERTURA_HOME%lib\asm-commons-3.3.1.jar;%COBERTURA_HOME%lib\log4j-1.2.9.jar;%COBERTURA_HOME%lib\jakarta-oro-2.0.8.jar" net.sourceforge.cobertura.instrument.Main %CMD_LINE_ARGS% 그런데 막상 다운받은 folder 구조를 보면.. cobertura-2.0.2.jar /lib     - asm-4.1.jar     - asm-commons-4.1.jar     - sam-tree-4.1.jar     - oro-2.0.8.jar .... script 왜 이렇게 되있지... 결국 cobertura 를 실행 시키기 위해서는 script 에서 버전 및 파일명을 다운받은 폴더...