ผลต่างระหว่างรุ่นของ "คณิตศาสตร์แบบเวคเตอร์ใน VPython"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
(ทำหน้าว่าง)
 
(ไม่แสดง 2 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 1: แถว 1:
: ''วิกินี้เป็นส่วนหนึ่งของรายวิชา [[01204223]]''
 
: ''เนื้อหาในวิกินี้ดัดแปลงมาจากกิจกรรมประกอบหนังสือเรียนรายวิชาเพิ่มเติม เทคโนโลยีสารสนเทศและการสื่อสาร ภาษาไพทอน โดยสถาบันส่งเสริมการสอนวิทยาศาสตร์และเทคโนโลยี''
 
  
โมดูล visual ในไลบรารี VPython รองรับการประมวลผลทางคณิตศาสตร์เชิงเวคเตอร์โดยเตรียมคลาสชื่อ vector เพื่อใช้สร้างปริมาณเวกเตอร์ตั้งแต่หนึ่งถึงสามมิติ ตัวอย่างต่อไปนี้เป็นการนิยามเวกเตอร์
 
<math>\begin{bmatrix} 2 \\ 3 \end{bmatrix}</math>
 
และเวกเตอร์
 
<math>\begin{bmatrix} 3 \\ -4 \end{bmatrix}</math>
 
ไว้ในตัวแปร u และ v ตามลำดับ
 
 
>>> from visual import vector
 
>>> u = vector(2,3)
 
>>> v = vector(3,-4)
 
>>> print(u,v)
 
<2, 3, 0> <3, -4, 0>
 
 
จะเห็นว่าเวกเตอร์ที่สร้างขึ้นมีขนาด 3 มิติ อย่างไรก็ตามกิจกรรมนี้จะสนใจเพียงสองมิติแรก ซึ่งหากไม่สนใจมิติที่สามแล้วค่าของ u และ v ข้างต้นจะสอดคล้องกับแผนภาพดังนี้
 
 
[[Image:vpython-vec1.png|center|400px]]
 
 
ปริมาณในแต่ละมิติของเวกเตอร์สามารถอ้างถึงผ่านคุณลักษณะชื่อ x และ y ของเวกเตอร์นั้น ๆ และยังอ้างอิงตามรูปแบบลิสต์ได้เช่นกัน ตัวอย่างเช่น
 
 
>>> v = vector(2,3)
 
>>> print(v.x,v.y)
 
2.0 3.0
 
>>> print(v[0],v[1])
 
2.0 3.0
 
>>> v.x = -8.5
 
>>> print(v)
 
<-8.5, 3, 0>
 
 
== การบวกและลบเวกเตอร์ ==
 
 
เนื่องจากภาษาไพทอนรองรับการทำ [https://en.wikipedia.org/wiki/Operator_overloading Operator Overloading] ข้อมูลชนิดเวกเตอร์ที่สร้างขึ้นจากคลาส vector ของ VPython สามารถนำมาประมวลผลด้วยตัวดำเนินการทางคณิตศาสตร์ + และ – ได้ทันที ดังตัวอย่าง
 
 
>>> from visual import vector
 
>>> u = vector(2,3)
 
>>> v = vector(3,-4)
 
>>> w1 = u+v
 
>>> w2 = u-v
 
>>> print(w1,w2)
 
<5, -1, 0> <-1, 7, 0>
 
 
ซึ่งสอดคล้องกับแผนภาพ
 
 
[[Image:vpython-vec-add-sub.png|center|600px]]
 
 
== การคูณและหารเวกเตอร์ด้วยสเกลาร์ ==
 
 
ปริมาณเวกเตอร์ที่สร้างขึ้นสามารถนำมาคูณหรือหารด้วยปริมาณสเกลาร์ผ่านตัวดำเนินการ * และ /
 
 
>>> w3 = u*2
 
>>> w4 = v/2
 
>>> print(w3)
 
<4, 6, 0>
 
>>> print(w4)
 
<1.5, -2, 0>
 
 
ซึ่งให้ผลลัพธ์เป็นเวกเตอร์ใหม่ที่ขนาดเปลี่ยนไปแต่ยังคงทิศทางเดิม ดังแผนภาพ
 
 
[[Image:vpython-vec-mul-div.png|center|600px]]
 
 
== ขนาดของเวกเตอร์ ==
 
เวกเตอร์ 2 มิติ <math>\mathbf{v} = \begin{bmatrix}x\\y\end{bmatrix}</math> มีขนาด (หรือความยาว) ตามทฤษฎีของปีทาโกรัสดังนี้
 
 
:<math>||\mathbf{v}|| = \sqrt{x^2+y^2}</math>
 
 
ขนาดของเวกเตอร์คำนวณได้จากฟังก์ชัน <tt>mag()</tt> ในโมดูล visual ดังตัวอย่าง
 
 
>>> from visual import vector,mag
 
>>> v = vector(3,4)
 
>>> print(mag(v))
 
5.0
 
 
ดังนั้นสำหรับเวกเตอร์ใด ๆ ที่ขนาดไม่เป็นศูนย์ เราสามารถสร้างเวกเตอร์หนึ่งหน่วยที่ชี้ไปทางเดียวกับเวกเตอร์นั้น โดยการหารเวกเตอร์นั้นด้วยขนาดของตัวเอง ดังตัวอย่าง
 
 
>>> u = v/mag(v)
 
>>> print(u)
 
<0.6, 0.8, 0>
 
>>> print(mag(u))
 
1.0
 
 
== การประยุกต์ใช้กฎการเคลื่อนที่เพื่อจำลองการเคลื่อนไหวของวัตถุ ==
 
กฎการเคลื่อนที่พื้นฐานกล่าวไว้ว่าสำหรับวัตถุใด ๆ แล้ว ความเร็วของวัตถุ <math>\mathbf{v}(t)</math>  และตำแหน่งของวัตถุ <math>\mathbf{s}(t)</math> มีความสัมพันธ์ตามสมการ
 
 
:<math>\mathbf{v}(t) = \frac{\Delta \mathbf{s}(t)}{\Delta t} = \frac{\mathbf{s}(t+\Delta t)-\mathbf{s}(t)}{\Delta t}</math>
 
 
ในกรณีที่ <math>\Delta t</math> มีค่าน้อย หรือ <math>\mathbf{v}(t)</math> มีค่าคงที่ ซึ่งจะได้ว่า
 
 
:<math>\mathbf{s}(t+\Delta t) = \mathbf{s}(t) + \mathbf{v}(t)\Delta t</math>
 
 
ในทำนองเดียวกัน ความสัมพันธ์ระหว่างความเร่ง <math>\mathbf{a}(t)</math> และความเร็ว <math>\mathbf{v}(t)</math> สามารถเขียนในรูป
 
 
:<math>\mathbf{v}(t+\Delta t) = \mathbf{v}(t) + \mathbf{a}(t)\Delta t</math>
 
 
ตัวอย่างสคริปต์ด้านล่างแสดงการคำนวณความเร็วและตำแหน่งของวัตถุโดยใช้สมการการเคลื่อนที่ข้างต้นมาประมวลผลด้วยคณิตศาสตร์แบบเวกเตอร์ จากนั้นนำมาสร้างเป็นภาพเคลื่อนไหวด้วย VPython ได้ดังนี้
 
<syntaxhighlight lang="python">
 
# set encoding=utf8
 
import visual as vis
 
 
DELTA_T = 0.05
 
 
scene = vis.display(width=500,height=500)
 
scene.range = 100
 
 
# สร้างลูกบอลสีเหลืองรัศมี 5 หน่วยไว้ที่พิกัด (20,30)
 
ball = vis.sphere(pos=(-50,-50),radius=5,color=vis.color.yellow,make_trail=True)
 
 
ball.vel = vis.vector(20,30)  # กำหนดความเร็วต้นของลูกบอล
 
ball.acc = vis.vector(0,-9.8)  # กำหนดความเร่งของลูกบอลตามแรงโน้มถ่วงของโลก
 
 
# เตรียมลูกศรเพื่อแสดงทิศทางและขนาดของความเร็วปัจจุบันของลูกบอล
 
arrow = vis.arrow(shaftwidth=1)
 
 
# เตรียมป้ายข้อความเพื่อใช้แสดงผลเวลาปัจจุบัน
 
txt = vis.label(pos=(5,90))
 
txt.time = 0.0
 
 
while True:
 
    vis.rate(30)  # หน่วงเวลาให้แอนิเมชันอัพเดตไม่เกิน 30 ครั้งต่อวินาที
 
    ball.vel += ball.acc*DELTA_T  # คำนวณความเร็วใหม่จากความเร่งปัจจุบัน
 
    ball.pos += ball.vel*DELTA_T  # คำนวณตำแหน่งใหม่จากความเร็วปัจจุบัน
 
    arrow.pos = ball.pos
 
    arrow.axis = ball.vel    # ลากลูกศรแสดงทิศทางและขนาดของความเร็ว
 
    txt.time += DELTA_T
 
    txt.text = 'Time: %.2f s' % txt.time
 
</syntaxhighlight>
 
 
ทดลองรันสคริปต์ข้างต้นควรเห็นผลลัพธ์ดังภาพ
 
[[Image:vpython-projectile.png|center]]
 

รุ่นแก้ไขปัจจุบันเมื่อ 15:20, 10 ตุลาคม 2558