idl 그래프 질문

게시판 IDL Q&A idl 그래프 질문

이 게시글은 3개 답변과 2명 참여가 있으며 마지막으로  Sangwoo에 의해 2 월, 1 주 전에 업데이트 됐습니다.

  • 글쓴이
  • #5316

    anomalocaris
    회원

    안녕하세요 어제 질문했던 글에 대한 답변 감사했습니다.

    제가 원하던 답을 얻을 수 있었습니다.

    그런데 다름이 아니라 다른 예제는 잘 되는데 제가 짠 소스코드에서 적용이 안됩니다

    oplot을 사용했을 경우에는 여러 그래프가 겹쳐져서 나타나는데 앞선 글에서 설명해주신 방법을

    사용하면 다른 그래프가 그려지지 않는데 어떤 문제점이 있어서 그런것인가요?

    ———————————————————————————–

    pro practice

    ;grid 생성
    grid = dblarr(201,3)
    x = 2*!pi/201*(dindgen(201)-100)

    ;초기 조건
    for i=0,200 do begin
    grid[i,0] = sin(x[i])
    endfor

    del_t = 30d
    del_x = 10000d
    c = 1d
    time_step = 0d

    win = window(dimension=[600,500])
    y1 = grid[*,0]
    pl = plot(x,y1,xtickinterval=90, color = ‘crimson’, thick = 2,/current)
    ;plot, x,grid[*,0]

    ;foward scheme
    for i=0,200 do begin
    if(i eq 0) then begin
    grid[i,1] = grid[i,0] – c*del_t/(2*del_x)*(grid[i-1,0]-grid[200,0])
    endif

    if (i eq 200) then begin
    grid[i,1] = grid[i,0] – c*del_t/(2*del_x)*(grid[0,0]-grid[i-1,0])
    endif

    if( (i ne 0) and (i ne 200)) then begin
    grid[i,1] = grid[i,0] – c*del_t/(2*del_x)*(grid[i+1,0]-grid[i-1,0])
    endif
    endfor

    ;leap frog schme

    j=1
    while (not(time_step EQ 2880*3+1)) do begin

    for i=0, 200 do begin
    if(j eq 0) then begin
    if(i eq 0) then begin
    grid[i,j+1] = grid[i,2] – (c*del_t/del_x*(grid[i+1,j] – grid[200,j]))
    endif

    if(i eq 200) then begin
    grid[i,j+1] = grid[i,2] – c*del_t/del_x*(grid[0,j] – grid[i-1,j])
    endif

    if((i ne 200) and (i ne 0)) then begin
    grid[i,j+1] = grid[i,2] – c*del_t/del_x*(grid[i+1,j] – grid[i-1,j])
    endif
    endif

    if (j eq 2) then begin
    if(i eq 0) then begin
    grid[i,0] = grid[i,j-1] – (c*del_t/del_x*(grid[i+1,j] – grid[200,j]))
    endif

    if(i eq 200) then begin
    grid[i,0] = grid[i,j-1] – c*del_t/del_x*(grid[0,j] – grid[i-1,j])
    endif

    if((i ne 200) and (i ne 0)) then begin
    grid[i,0] = grid[i,j-1] – c*del_t/del_x*(grid[i+1,j] – grid[i-1,j])
    endif

    endif

    if((j ne 2) and (j ne 0)) then begin
    if(i eq 0) then begin
    grid[i,j+1] = grid[i,j-1] – (c*del_t/del_x*(grid[i+1,j] – grid[200,j]))
    endif

    if(i eq 200) then begin
    grid[i,j+1] = grid[i,j-1] – c*del_t/del_x*(grid[0,j] – grid[i-1,j])
    endif

    if((i ne 200) and (i ne 0)) then begin
    grid[i,j+1] = grid[i,j-1] – c*del_t/del_x*(grid[i+1,j] – grid[i-1,j])
    endif
    endif

    endfor

    ;if(time_step eq 2880*1) then begin
    y2 = grid[*,j]
    pl.setdata, y2
    ;oplot, x,grid[*,j]
    ;endif

    j = (j+1) mod 3
    time_step = time_step + 1
    endwhile

    end

  • #5321

    Sangwoo
    회원

    “다른 그래프가 그려지지 않는다”의 의미를 명확히 알려주실 수 있을까요? 먼저 하셨던 질문에서는, 반복문에 의하여 순차적으로 플롯들이 그려지는 과정에서 이전 회차의 플롯들이 계속 남아서 겹쳐지는 문제를 피하고 싶다고 하셨기 때문에 저도 그런 문제를 피할 수 있는 답을 드렸던 것입니다. 이번 질문에서 그려지지 않는다고 말씀하시는 “다른 그래프”가 반복문에서 이전 회차의 그래프들을 뜻하시는 것이라면, 당연히 제가 드렸던 답에 의하여 작업을 하면 그렇게 됩니다.

    그리고 지금 올려주신 코드의 내용이 사실 좀 길고 복잡한 편입니다. 더구나 IF문, FOR문, WHILE문 등이 서로 복잡하게 얽혀있는 상태여서 이 코드의 내용을 답변자가 일일이 다 해독하여 적절한 해결책을 드리기는 굉장히 힘듭니다. 질문을 주실 때에는 핵심이 되는 부분만 추려서 올려주시면 감사하겠습니다.

  • #5323

    anomalocaris
    회원

    정말 죄송합니다.

    제가 표현하고자 한것이 이류방정식으로sine함수가 옆으로 이동하는 것을 나타내는것이엿는데

    일반 plot함수는 빨리빨리 그려져서 그게 눈에 확 들어왔는데

    알려주신 방법으로 하니까 제대로 동작을 하고있었는데 알고보니

    너무 늦게 움직여서 제가 눈치를 채지못한 것이였습니다….

    이류 속도를 빠르게 하고 확인하니 조금씩 옆으로가고 있었네요…

    번거롭게 해서 죄송하고 답변정말 감사합니다 ㅠㅠ

  • #5326

    Sangwoo
    회원

    NG 체계의 PLOT 함수가 DG 체계의 PLOT 프로시저에 비해서는 시스템 리소스를 약간 더 요구하는 측면이 있긴 합니다. 그렇다 하더라도 두 방법 사이의 속도 차이가 현저하게 보인다면, 반복문 내 코드의 실행 과정에 있어서 혹시 비효율적인 부분이 있는지 확인해보시는 것도 좋습니다. 사실 반복문 내에서 IF와 같은 조건문이 너무 자주 사용될 경우 속도가 다소 떨어질 수도 있습니다. 이러한 점을 감안하셔서 코드의 내용을 전반적으로 다시 한번 검토해보시는 것이 어떨까 합니다.

답변은 로그인 후 가능합니다.