iT邦幫忙

2024 iThome 鐵人賽

DAY 15
1
自我挑戰組

AI救我系列 第 15

Day 15 - 用python製作光干涉動畫

  • 分享至 

  • xImage
  •  

動畫就從最簡單的兩光干涉吧開始畫吧!

兩個光干涉就只要相加就可以了,干涉方式會以波長的公倍數,形成像波包一樣的beat。

程式碼如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


#定義正弦波 
def wave(w, t):
    return np.sin(w*t)

N = 5001 #定義製圖細緻度
T= 20 #時間範圍
t_list = [T*i/N + 0 for i in range(N)]#時間點的集合

#製圖
fig, ax = plt.subplots() #定義製圖範圍

#定義動畫方程
def update(dw):
    ax.clear()#每次先將上一個圖清除
    #定義波的頻率:
    w1 = 10*2*np.pi
    w2 = w1+dw*2*np.pi
    #將波的數值帶入運算式
    wave1 =  [wave(w1, t_list[i]) for i in range(N)]
    wave2 =  [wave(w2, t_list[i]) for i in range(N)]
    #兩波干涉公式 兩波相加
    beat = [wave1[i]+ wave2[i] for i in range(N)]
    #將兩個波畫成圖
    ax.plot(t_list, beat)
#定義每個frame要給的參數
dw_list= [0.1*i for i in range(20)]
#製作動畫
ani = animation.FuncAnimation(fig, update, dw_list) 
ani.save('2waves_inteference.gif', writer='pillow')

plt.show()

interference

T-Da~可以清楚地看到兩波干涉的情形,這次的程式碼是助教帶著寫出來的,在這裡和各位分享。

這段程式和昨天chatGPT給的展示程式碼差異最大的地方,我認為是在ax.clear()這一行。

如果助教給的這個程式沒清除,跑出來會像這樣,舊的點和新的都疊再一起:

errordemo

但如果把ax.clear()加到昨天的迴圈中,則是完全跑不出動畫。

丟了chatGPT問為何,得出的解釋為——數據更新方式的不同:

  • 第一個程式碼:在update()函數中,只更新了已存在的線條line的y軸數據(line.set_ydata(...))。這意味著它直接修改了現有的圖像元素,沒有添加或移除元素。這使得動畫更高效,並且避免了圖像重疊的問題。因此,不需要清除繪圖區域。
  • 第二個程式碼:每次呼叫update()時,程式會繪製新的波形圖像。在這種情況下,如果不清除先前的圖像,新的圖像會疊加在前一個圖像上,導致圖像重疊。因此,需要使用ax.clear()來清除繪圖區域,確保每一幀都能正確地顯示新的圖像。

看完我就瞭解了,能有AI和助教一起教我,我真幸福呀!


上一篇
Day 14 - Matplotlib animation 用python製作動畫!基礎介紹
系列文
AI救我15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言