PDA

View Full Version : Mathematica Programming เรื่อง Graph2D ตอนที่ 1


คุณชายน้อย
09 กรกฎาคม 2008, 02:08
Mathematica Programming เรื่อง Graph2D ตอนที่ 1

อารัมพบท
ในการคำนวณต่าง ๆ ในโปรแกรม Mathematica ผู้ใช้ต้องคำนึงถึงเซตของ Domain และ Range ของผลลัพธ์ที่ต้องการหาค่าเป็นสำคัญ ค่า Config การคำนวณในโปรแกรม Mathematica มีการคำนวณจาก $\mathbb{C} \rightarrow \mathbb{C} $ เมื่อ $\mathbb{C} $ เป็นจำนวนเชิงซ้อน ทำให้การคำนวณต่าง ๆ ที่อยู่ในเซตของจำนวนจริง $\mathbb{R} $ เกิด Error โดยที่ผู้ใช้ส่วนใหญ่มักจะคิดว่าเป็น Bug ของโปรแกรมหรือเกิดจากความไม่รู้จริงในการใช้โปรแกรม

Mathematica Programming เรื่อง Graph2D ตอนที่ 1
การวาด Graph2D ใน Mathematica เราจำเป็นต้องกำหนด Domain และ Range ใน Source Code เพื่อให้คำนวณจาก $\mathbb{R} \rightarrow \mathbb{R} $ ในคำสั่ง Plot หรือ ImplicitPlot โดยมีคำสั่งในการกำหนด Domain และ Range ที่เป็นจำนวนจริง ดังนี้

RealOnly /: On[RealOnly] := Get[ "Miscellaneous`RealOnly`"];
RealOnly /: Off[RealOnly] := (Unprotect[Power, Solve, Roots]; Clear[Power, Solve, Roots]; Protect[Power, Solve, Roots];Remove["Miscellaneous`RealOnly`Nonreal"]; $Post =. )

เมื่อต้องการเรียกใช้การคำนวณใน R ให้ใช้คำสั่ง On[RealOnly] และเมื่อคำนวณผลลัพธ์ที่ต้องการเสร็จแล้ว ให้คืน Config เดิม ด้วยคำสั่ง Off[RealOnly] ดังตัวอย่างต่อไปนี้
http://www.facsenate.mju.ac.th/Data/1215543368.JPG

Onasdi
14 กันยายน 2008, 01:17
ขอบคุณครับที่ให้ความรู้ เป็นประโยชน์มากครับ พอดีวันนี้พยายามจะวาดกราฟที่มี x1/3 อยู่ด้วย แล้วมันก็ Error ตอนนี้เข้าใจแล้วครับว่าทำไม

แล้วผมก็พบอีกวิธีนึงที่วาดได้เหมือนกัน(สำหรับ y=x1/3) ก็คือใช้ Plot[Abs[x^(1/3)]*x/(Abs[x]), {x, -3, 3}]; ครับ

แล้ววันหลังจะมาอ่านตอนต่อไปต่อนะครับ

คุณชายน้อย
15 กันยายน 2008, 23:02
ขอบคุณครับที่ให้ความรู้ เป็นประโยชน์มากครับ พอดีวันนี้พยายามจะวาดกราฟที่มี x1/3 อยู่ด้วย แล้วมันก็ Error ตอนนี้เข้าใจแล้วครับว่าทำไม

แล้วผมก็พบอีกวิธีนึงที่วาดได้เหมือนกัน(สำหรับ y=x1/3) ก็คือใช้ Plot[Abs[x^(1/3)]*x/(Abs[x]), {x, -3, 3}]; ครับ

แล้ววันหลังจะมาอ่านตอนต่อไปต่อนะครับ

เป็นวิธีการแก้ปัญหาโจทย์ที่ดีครับ แต่ขาดการแก้ที่กระบวนการคิด ... ไม่ว่ากันนะครับ ยกตัวอย่างเช่น ถ้าเปลี่ยนโจทย์ใหม่คือ จงวาดกราฟของ
f(x) = $\sqrt[5]{x}$ $\sqrt[3]{2x-1} $ ในกระบวนการแก้ปัญหาโจทย์จะใช้แบบเดิมได้หรือเปล่าหน่า... ลองคิดดูนะครับ

Onasdi
16 กันยายน 2008, 18:16
เป็นวิธีการแก้ปัญหาโจทย์ที่ดีครับ แต่ขาดการแก้ที่กระบวนการคิด ... ไม่ว่ากันนะครับ ยกตัวอย่างเช่น ถ้าเปลี่ยนโจทย์ใหม่คือ จงวาดกราฟของ
f(x) = $\sqrt[5]{x}$ $\sqrt[3]{2x-1} $ ในกระบวนการแก้ปัญหาโจทย์จะใช้แบบเดิมได้หรือเปล่าหน่า... ลองคิดดูนะครับ

ทำอย่างนี้ครับ Plot[Abs[x^(1/5)]*x/(Abs[x]) * Abs[(2x-1)^(1/3)]*(2x-1)/(Abs[2x-1]), {x, -3, 3}]

คุณชายน้อย
17 กันยายน 2008, 01:34
อืม... ต้องดูว่าประเด็นคืออะไร ประเด็นไม่ได้อยู่ที่ฟังก์ชันคี่ แต่อยู่ที่กระบวนการ Mapping การทำแบบนี้เป็นการ Map จาก C -> R ซึ่งก็ไม่เป็นไรเพราะถึง Domain เปลี่ยนไป แต่ค่าของ Range ใกล้เคียงกัน เพราะเป็น norm a+bi ไม่เป็นไร ผมยอมแพ้ดีกว่า แต่ถ้าไม่ใช่เป็นการ plot graph อาจจะ Error ตัวอย่าง Solve[x^(2/3)==1,x] คำตอบขาดไป 1 ตัวเพราะอะไร?

ปล. เพื่อความสมบูรณ์ผมให้ Source เพิ่มเติม เผื่อเกิด Idea ใหม่ๆ และผมต้อง oversea aboard อาจจะกลับมาตอบไม่ทันใจ .... ต้องขออภัยไว้ก่อน
http://www.facsenate.mju.ac.th/Data/1221589330.jpg

Onasdi
18 กันยายน 2008, 18:54
สำหรับ Solve[x^(2/3)==1,x] ก็ต้องเปลี่ยนที่ x1/3 ครับ ก็คือ x^(2/3) -> (x^(1/3))^2 ->(Abs[x^(1/3)]*x/Abs[x])^2

Source code ที่ให้มาไม่ค่อยเข้าใจครับ คำสั่งตรงบรรทัดที่มี g อะครับ

คุณชายน้อย
22 กันยายน 2008, 22:31
กลับมาแล้วครับ....
ผมพยายามให้คุณเข้าใจปัญหา ไม่ใช่เปล่ยนแปลงโจทย์ ปัญหาอยู่ที่การ Mapping ในกรณี Plot และส่วน Solve ปัญหาอยู่ที่ Assumption (มันคืออะไร หาได้ที่ help) การแก้โจทย์อาจทำให้ Domain เปลี่ยนแปลงไปและอาจมีปัญหาถ้ามีการคำนวณขั้นสูงขึ้น ตัวอย่างเช่น ในกรณีที่ต้องการ Plot เราอาจเปลี่ยนแปลงโจทย์ได้อย่างที่คุณทำ แต่ก็ต้องมาเขียนคำสั่งเพื่อเปลี่ยนแปลงโจทย์ที่เป็นฟังก์ชันคี่ เช่น x^(1/3) = Abs[x^(1/3)] (x/Abs[x]) โดเมนเปลี่ยนไป สำหรับ Plot ไม่มีปัญหาสำหรับ Piecewise Continuous ส่วนคำสั่งบรรทัด g เป็นการเปลี่ยนพจน์ที่ยกกำลังรากคี่ของฟังก์ชัน f ให้เป็นสิ่งที่คุณต้องการคือ a^b = Abs[a^b] (a/Abs[a])

โดยปกติ เราไม่ค่อยทำการเปลี่ยนแปลงโจทย์ แต่เราจะดู Scope ของปัญหา แล้วแก้ที่ปัญหา การแก้แบบนี้เป็นการแก้ที่ function ถ้าเราต้องการให้เป็นแบบ General เราควรสร้างเป็น Module ดังนี้ Download Source (http://www.facsenate.mju.ac.th/Data/1222096108.nb) เป็นการสร้าง Module MyPlot เพื่อจะสามารถใช้ Function MyPlot วาดกราฟได้ทุกฟังก์ชันที่ต้องการ แต่ก็ได้เฉพาะ MyPlot เพราะยังมีคำสั่งอีกมากมายเช่น Solve ที่มีปัญหา และอื่น ๆ ... ถ้าไม่แก้ที่ต้นเหตุ เราก็จะต้องเขียน Module ไปเลย ๆ เช่น MySove , My... ซึ่งไม่ใช่หนทางที่ดีเลย ...
http://www.facsenate.mju.ac.th/Data/1222096039.JPG

Onasdi
23 กันยายน 2008, 01:56
เข้าใจแล้วครับ