วันพฤหัสบดีที่ 14 พฤษภาคม พ.ศ. 2563

บทที่ 8 การแก้สมการอนุพันธ์


บทที่  8
การแก้สมการอนุพันธ์

8.1 ส่วนนำทาง
            เอกสารนี้ออกแบบเพื่อให้ผู้ใช้ได้คุ้นเคยกับการแก้สมการอนุพันธ์สามัญ(ordinary differential equations:ode) โดยใช้ขั้นตอนวีธี  ode ไซแลบ

8.2 สมการอนุพันธ์
            8.2.1 สเกลล่า ODE’s
            สมมุติว่าต้องการหาคำตอบ u(t) ของสมการอนุพันธ์สามัญดังนี้
                                                                                (8.1)
            สมการนี้เป็นรูปแบบอย่างง่ายสำหรับการแพร่กระจายเชื้อโรค  พิจารณาฝูงสัตว์ P และกำหนดให้ u(t) เป็นสัดส่วนของสัตว์ที่ติดเชื้อโรคหลังจากเวลาผ่านไป t วัน ดังนั้น 1 u(t) คือสัดส่วนของสัตว์ที่ไม่ติดเชื้อ  การติดเชื้อใหม่จะเกิดขึ้นเมื่อสัตว์ที่ติดเชื้อกับสัตว์ที่ไม่ติดเชื้อมาพบปะกัน จำนวนครั้งของการพบปะกันเป็นสัดส่วนตรงกับ  u(t) (1 u(t)).  ดังนั้นแบบรูป(model) สำหรับการแพร่ขยายเชื้อโรค คือจำนวนที่ติดเชื้อใหม่ต่อวัน  du/dt, เป็นสัดส่วนกับ u(t) (1 u(t)). ตามที่ได้ในสมการที่ 8.1  ซึ่งตัวคงที่ k ขึ้นอยู่กับความหนาแน่นของสัตว์ และการติดเชื้อ  สำหรับความแน่ชัด สมมุติว่า P เป็นสัตว์ 10000 ตัวเขียนได้ว่า P= 10000  และ k = .2. เงื่อนไขขั้นต้นที่เวลา t = 0 มีสัตว์ที่ติดเชื้อเพียงตัวเดียว เพิ่มเงื่อนไขเริ่มแรกได้ดังนี้
            u(0) = 1/10000.                                                                                      (8.2)
            เมื่อต้องการหาว่าสัตว์แต่ละตัวจะติดเชื้อเท่าใดในอีก 100 วันข้างหน้า ทำได้โดยการพล็อต u(t)  จาก t = 0 ถึง t = 100. เพื่อแก้ปัญหานี้จำต้องกำหนดฟังก์ชันเพื่อใช้ในการคำนวณทางด้านซ้ายของสมการ 8.1  จากนั้นจึงใช้โปรแกรม ode ของไซแลบ
การสร้างฟังก์ชันไซแลบซึ่งระบุทางด้านขวาของสมการอนุพันธ์  ให้แน่ใจว่าได้เรียกลำดับอาร์กิวเมนต์ที่ถูกต้เอง  ดังเช่น
function udot=f(t,u)
    udot = k * u * ( 1 - u );
endfunction
(แม้ว่าไม่ได้ใช้ในการคำนวณ udot, ฟังก์ชัน odeไซแลบ  ฟังก์ชัน ode ต้องการฟังก์ชัน f เพื่อส่งผ่านมายัง ode จะต้องมี 2 อินพุตอาร์กิวเมนต์  (ในลำดับที่ถูกต้อง)  ให้ขอความช่วยโดยใช้ help ode สำหรับข้อสนเทศเพิ่มเติม
            กำหนดปัญหาขึ้นสมการอนุพันธ์สามารถแก้ได้เพียงบรรทัดเดียวในไซแลบโดยใช้
ode
t=0:100;
k = 0.2;
u = ode( 1/10000, 0.0, t, f );
(xbasc()); plot2d( t,u) // ถ้าใส่วงเล็บข้างหน้าแล้ว error
หมายเหตุ ค่าของ k หาได้สำหรับ ode และ f  ฟังก์ชัน ode มีพารามีเตอร์ที่สามารถปรับเพื่อควบคุมความละเอียดในการคำนวณ  ส่วนมากแล้วไม่จำเป็นสำหรับเพียงการพล็อตกราฟคำตอบของปัญหาธรรมดาสามัญ   เป็นแนวคิดที่ดีเสมอที่จะตรวจสอบคำตอบเดิมโดยแก้ปัญหาจากความต้องการที่ให้ค่าความละเอียดถูกต้องมากขึ้น  ตัวอย่างเช่น สามารถที่จะใช้ ode   ดังนั้นข้อผิดพลาดที่ประมาณอย่างสัมบูรณ์ ที่สัมพันธ์ที่จะจำกัดให้น้อยกว่า 1 × 109.  ทำเช่นนี้ได้ด้วยคำสั่ง
uu = ode( 1/10000, 0.0, t, rtol=1e-9, atol=1e-9, f );
plot2d(t,uu,style=-1)
จะเห็นได้ทันที่ว่าผลเฉลยที่คำนวณได้ในการเรียกใช้ครั้งแรกกับ ode วางอยู่บนสุดได้เคิร์ฟที่ละเอียดแม่นยำกว่า  นี่เป็น 2 ผลเฉลยที่ให้ความละเอียดเชิงกราฟิกส์เหมือนกัน  สำหรับตัวอย่างนี้รูปแบบหรือโมเดลเป็นไปได้ที่จะหาสูตรวิเคราะห์สำหรับu(t).  จริงแล้ว
u(t) = 1/(1 + c exp(kt))   ที่ซึ่ง
           
c = P 1.                                                                                              (8.3)
            โดยเพิ่มสูตรนี้เข้าไปในกราฟข้างบนเป็นการตรวจสอบสุดท้าย

t = 0:100 ;
c = 10000-1 ; k = .2 ;
function u=exactu(t)
     u = 1 ./ ( 1 + c*exp(-k*t));
endfunction
xbasc(); plot2d(t,u); fplot2d(t,exactu,style=-1 )

            สูตรที่ชัดเจนให้เส้นเคิร์ฟเช่นเดียวกับผลเฉลยเชิงตัวเลข จริงแล้วข้อแตกต่างระหว่างผลเฉลยทั้งสองมากที่สุดที่ 2.5×107. ดังนั้นจึงมั่นใจได้ว่าการใช้ ode ในการแก้ปัญหาข้างล่างต่อไป

แบบฝึกหัดที่13.
            1. จงตรวจสอบว่า (8.3) คือผลเฉลยของ (8.1).  นั่นคือ เมื่อทำให้เล็กย่อยลง(differentiate) สูตรนี้สำหรับ u(t) จะได้ทางขวาของ (8.1).  และสูตรนี้สอดคล้องกับ (8.2)
2. จากกราฟ u(t), ประมาณการได้ว่าเป็นจำนวนกี่วันที่ต้องการที่จำทำให้ผลเมืองติดเชื้อได้ครึ่งหนึ่ง
แนะ:สามารถตรวจสอบการพล็อตเพื่อให้ได้ผลเฉลยจำนวนวันที่ใกล้เคียงมากที่สุด  คำสั่ง xgrid จะทำให้ง่ายในการตอบคำถาม  จึงควรที่จะสร้างฟังก์ชันหนึ่งโดยใช้ผลจากขั้นตอนกระบวนการ ซึ่งคืนผลเฉลย ode เป็นลบ0.5 ที่เวลาเฉพาะ t ใดๆ  แล้วใช้ fsolve เพื่อแก้ปัญหา
            3. สมมุติว่าตอนนี้หลังจากการติดเชื้อบันทึกไว้ที่วันที่  t = 0,  โปรแกรมการฉีดวัคซีนเริ่มจากวันที่ 5 และ 200  ของสัตว์ที่ยังไม่ติดเชื้อ ได้รับการฉีดวัคซีนต่อวัน  หลังจาก t วัน ประชากรของสัตว์ที่ฉีดวัคซีนต่อวันคือ  200(t5)+/10000.  จากนี้ (t5)+ means max(t5, 0). สัตว์ที่ได้รับวัคซีนเหล่านี้ไม่ติดเชื้อ ส่วนที่ติดเชื้อใหม่เกิดขึ้นเมื่อสัตว์ที่ไม่ติดเชื้อ สัตว์ที่ไม่ได้รับวัคซีนได้พบร่วมกับสัตว์ที่ติดเชื้อ  ดังนั้นอัตราการเพิ่มของ u ตอนนี้สร้างแบบรูปโดยสมการอนุพันธ์ดังนี้
du
dt      = k u(t) (1 u(t) .02 (t 5)+)+ ;
            จากนี้ให้หาว่ามีสัตว์เท่าใดที่ไม่ติดเชื้อหลังจาก 100 วันไปแล้วที่ได้รับโปรแกรมวัคซีน
            4. มีสัตว์จำนวนเท่าใดที่ไม่ติดเชื้อ ถ้าเฉพาะสัตว์ 100 ตัวฉีดวัคซีนในแต่ละวันจากวันที่ 5  ,มีสัตว์เท่าใดที่จะปลอดภัยถ้า สัตว์ 100 ตัวต่อวันที่ได้รับการฉีวัคซีนากวันที่ 0?  ปัญหาแบบรูปอย่างง่ายนี้ มีสูตรที่ใช้หาผลเฉลยที่แน่ชัด  อย่างไรก็ตามในไซแลบนั้นจะง่ายมากที่จะให้ได้ผลเฉลยเป็นจำนวนตัวเลข และทำให้เสร็จสิ้นลงไม้ว่าจะเป็นปัญหาที่ซับซ้อนก็ตาม  เมื่อไม่มีสูตรที่ง่ายอื่นใดสำหรับหาผลเฉลย  การใช้ไซแลบสามารถสำรวจแบบรูปได้อย่างง่ายดายโดยการเปลี่ยนค่าพารามีเตอร์ และการพล็อตของผลเฉลย

8.2.2 ODE ลำดับสอง
            ตามตัวอย่างที่สองนี้ พิจารณาสมการอนุพันธ์ธรรมดาทั่วไป
                                                                            (8.4)
            u(0) = π/4                                                                          (8.5)
นี่เป็นตัวอย่างที่ซับซ้อนมากขึ้น เพราะว่าปรากฏของอนุพันธ์ของ u ลำดับ2  ไม่เป็นเพียงอนุพันธ์บำดับ 1 . (เรียกว่าว่าเป็น ODE ลำดับ2)  ส่วนแก้สมการ ODE ไซแลบไม่สามารถที่จะใช้อนุพันธ์ลำดับสองได้โดยตรง เหมือนกับที่ทำงานได้กับอนุพันธ์ลำดับ1  อย่างไรก็ตามก็ยังมีกลวิธีที่สามารถนำมาใช้  ถ้าหากติดติดตามทั้ง  u(t) และ du/dt, สำหรับอนุพันธ์ลำดับ2  ของ u(t) ก็คิดให้เป็นอนุพันธ์ลำดับแรกของ du/dt.  ที่เป็นแบบฉบับมากขึ้น กำหนด  v(t) เป็นค่าของ du/dt.  แล้วสมการที่ (8.2) เทียบเท่ากับ 2 สมการดังนี้
และ
แม้แต่ให้รูปสะสวยขึ้น โดยกำหนด  x(t) เป็นเว็คเตอร์ ที่มี 2 องค์ประกอบ
        
และดังนั้น
           
ตอนนี้อยู่ในรูป
ดังนั้นการแก้สมการ (8.2) และ  plot u(t)  กับ t   โดยเริ่มโดยนิยามฟังก์ชัน F

function xdot = pendulum(t,x)
xdot = [ x(2) ; -sin(x(1))];
endfunction
Then we use the commands
t = 0:.25:20;
x=ode([%pi/4;0], 0.0, t, pendulum );
xbasc(); plot2d(t, x(1,:))

            เพื่อที่จะพล็อตองค์ประกอบแรกของผลเฉลย  สังเกตได้ว่า ode เก็บองค์ประกอบที่1 และ 2 ของผลเฉลยในแถวที่1 และ 2 ของเอ้าพุต  แน่นอนว่าสามารถพล็อตองค์ประกอบที่ 2 ของผลเฉลยและ ผิวหน้า(phase)ของระนาบเส้นทางการเคลื่อนที่ด้วยคำสั่งดังนี้

xbasc(); plot2d(t, x(2,:))
xinit(); xbasc(); plot2d(x(1,:), x(2,:))

            คำสั่ง xinit() ทำอะไร?
            ความเร็วสนามในด้านของระนาบสามารถที่จะวาดโดยใช้คำสั่ง fchamp ดังนี้
fchamp(pendulum,0.0,-1:0.1:1,-1:0.1:1)

Exercise 14
.  ในสมการ(8.2) , u(t)  คือมุมที่แก่วงของลูกตุ้มนาฬิกาที่ทำกับแกนในแนวตั้งที่เวลา t ถ้าลูกตุ้มนาฬิกามีความยาว l น้ำหนักของลูกตุ้มนาฬิกาที่ตำแหน่ง  (x, y) = (sin(u(t)),cos(u(t)). (ลูกตุ้มนาฬิกาแกว่งจากจุดกำเนิด (origin) ที่ตำแหน่ง(0,1) เมื่ออยู่ในสภาพนิ่ง)
1. จากกราฟ ให้หาคาบของลูกตุ้มนาฬิกา
2. บ่อยครั้งเมื่อลูกตุ้มแกว่งเป็นมุมเล็กๆ ตามสมการ (8.2) ประมาณการโดย
           
u(0) = π/4 ,
            ผลเฉลยกับการประมาณเชิงเส้น และผลเฉลยที่แน่ชัด แตกต่างกันอย่างไร  คาบเวลาเท่ากันหรือไม่3. ลูกตุ้มนาฬิกาแบบบังคับสามารถจัดแบบรูปโดยสมการ
                                                                           (8.6)
ก่อให้ได้คำตอบของสมการนี้สำหรับr ω = 1/2 และ A = 0.2  และ A = 1.5 ด้วยเงื่อนไขเริ่มแรก
u(0) = 100, u(0) = 0  และ u(0) = 101, u(0) = 0.
ความคิดเห็นเกี่ยวกับความไวของคำตอบของ ode สำหรับค่าที่แตกต่างของ A .

ไม่มีความคิดเห็น:

แสดงความคิดเห็น