Python程序設(shè)計期末作業(yè)_第1頁
Python程序設(shè)計期末作業(yè)_第2頁
Python程序設(shè)計期末作業(yè)_第3頁
Python程序設(shè)計期末作業(yè)_第4頁
Python程序設(shè)計期末作業(yè)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)球-彈簧物理模型模擬程序編寫目的1.模擬一個非線性動力系統(tǒng),體會系統(tǒng)參數(shù)的混沌現(xiàn)象。2.熟悉VPython的使用。物理模型描述模型空間的四周及頂面為剛性壁,底為一有質(zhì)量的剛性平板,平板由一根輕彈簧支撐。模型空間內(nèi)有數(shù)個剛性球作自由運動。球的初始位置在空間內(nèi)均勻分布,初始速度滿足正態(tài)分布。所有碰撞均為完全彈性碰撞。并假設(shè)平板只能作Z方向一維運動。設(shè)計思想由物理學(xué)中的能量守恒和動量守恒推導(dǎo)碰撞前后物體的速度變化。每次迭代先使物體狀態(tài)按時間小量dt發(fā)展,再判斷是否有碰撞發(fā)生,

2、若有則由前面推導(dǎo)的公式改變相關(guān)物體的速度。以適當(dāng)?shù)乃俾手貜?fù)上述步驟,再用visual庫繪制出對應(yīng)圖形,則得到這個物理模型的模擬演示動畫。使用方法直接運行程序,則開始模擬并實時繪制。也可修改程序開始處的幾個全局變量,改變模型的參數(shù)。參考資料VPython官方文檔說明在Python2.7下調(diào)試通過。本程序中沒有一行代碼直接來自網(wǎng)絡(luò)、書籍等處,參考資料僅為VPython官方文檔。附截圖及源代碼。程序運行效果截圖from visual import *from random import randomfrom math import sin,cos,sqrt,log,pi#物理模型的參數(shù)以全局變量形式

3、定義g=9.81#重力加速度k=10#彈簧胡克系數(shù)m1=1#球質(zhì)量m2=10#平板質(zhì)量N=10#球數(shù)R=1#球半徑#物體基類,提供設(shè)置、返回位置、速度信息,及迭代一個時間小量dt的方法class object: def setVel(self,v): self.v=v def setPos(self,p): self.p=p def getPos(self): return self.p def getVel(self): return self.v def go(self,dt): self.v+=self.a*dt self.p+=self.v*dt#球,繼承于物體類class C_Bal

4、l(object): def _init_(self,p,v): self.p=p self.v=v self.a=vector(0,0,-g)#平板,繼承于物體類,有自己的迭代方法,即加速度與位置有關(guān)class C_Board(object): def _init_(self): self.p=vector(0,0,0) self.v=vector(0,0,0) self.a=vector(0,0,0) def go(self,dt): self.a=self.p*-k self.v+=self.a*dt self.p+=self.v*dt#生成隨機(jī)位置向量(模型空間內(nèi)均勻分布)def ra

5、ndPos(): x=(random()-0.5)*2*(15-R-0.5) y=(random()-0.5)*2*(15-R-0.5) z=random()*(30-R*2-0.5)+(R+0.5) return vector(x,y,z)#生成三維標(biāo)準(zhǔn)正態(tài)分布向量,使用Box-Muller公式def randVel(): u1,u2=random(),random() x=sqrt(-2*log(u1)*cos(2*pi*u2) y=sqrt(-2*log(u1)*sin(2*pi*u2) u1,u2=random(),random() z=sqrt(-2*log(u1)*cos(2*pi

6、*u2) return vector(x,y,z)#物理模型,含有一個平板和N個球class C_System: #放置球,并檢查沖突 def _init_(self): self.ball= for i in range(N): self.ball.append(C_Ball(randPos(),randVel()*3) j=0 while ji:#若有兩個球干涉則重新放置 n=self.balli.getPos()-self.ballj.getPos() if mag(n)=2*R: self.ball-1=C_Ball(randPos(),randVel()*3) j=-1 j+=1 s

7、elf.board=C_Board() #迭代一個時間小量dt def go(self,dt): for i in range(N): self.balli.go(dt) self.board.go(dt) for i in range(N): #檢查與平板的碰撞 if self.balli.getPos().z-R=30-0.5: self.balli.go(-dt) v=self.balli.getVel() n=vector(0,0,1) l=dot(n,v)*2*n self.balli.setVel(v-l) #檢查與前后壁的碰撞 if abs(self.balli.getPos()

8、.x)+R=15: self.balli.go(-dt) v=self.balli.getVel() n=vector(1,0,0) l=dot(n,v)*2*n self.balli.setVel(v-l) #檢查與左右壁的碰撞 if abs(self.balli.getPos().y)+R=15: self.balli.go(-dt) v=self.balli.getVel() n=vector(0,1,0) l=dot(n,v)*2*n self.balli.setVel(v-l) #檢查兩球之間的碰撞 for j in range(i): n=self.balli.getPos()-s

9、elf.ballj.getPos() if mag(n)=2*R: self.balli.go(-dt) self.ballj.go(-dt) n=norm(n) v1=self.balli.getVel() v2=self.ballj.getVel() l1=dot(n,v1)*2*n l2=dot(n,v2)*2*n self.balli.setVel(v1-l1) self.ballj.setVel(v2-l2) #返回第i個球的位置向量 def getBallPos(self,i): return self.balli.getPos() #返回平板位置向量 def getBoardPo

10、s(self): return self.board.getPos()mySys=C_System()scene=display(title=Animation, x=300,y=100, width=480,height=640, center=(0,0,0), autocenter=False, range=(40,40,60), up=(0,0,1), forward=(-8,-1,-2)B=#球數(shù)組for i in range(N): B.append(sphere(pos=mySys.getBallPos(i),radius=R,material=materials.plastic)

11、P=box(pos=mySys.getBoardPos(),length=28.5,height=28.5,width=1,material=materials.wood)#平板H=helix(pos=(0,0,-30),axis=(0,0,1),coils=10,radius=7.5,length=30,material=materials.chrome)#彈簧#生成三面壁和上壁WallL=box(pos=(0,-15,0),length=30,height=1,width=59,material=materials.rough)WallR=box(pos=(0,15,0),length=30,height=1,width=59,material=materials.rough)WallF=box(pos=(-15,0,0),length=1,height=30,width=59,material=materials.rough)WallU=box(pos=(0,0,30),length=31,height=31,width=1,material=materials.rough)while

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論