อัลกอริทึมสำหรับการปรับฟังก์ชั่นการปรับตัว


21

ฉันกำลังมองหาอัลกอริทึมเพื่อวาดกราฟ 2d แบบมาตรฐานสำหรับฟังก์ชั่นที่อาจจะใช่หรือไม่มีเอกพจน์ จุดประสงค์คือการเขียน "Mini-CAS" ดังนั้นฉันไม่มีความรู้เบื้องต้นเกี่ยวกับประเภทของฟังก์ชั่นที่ผู้ใช้ต้องการสร้างกราฟ

ปัญหานี้เก่ามากดังนั้นฉันจินตนาการว่าต้องมีอัลกอริธึมมาตรฐานบางอย่างในวรรณกรรม สำหรับเมื่อฉันไม่ได้ประสบความสำเร็จมากในการหาการอ้างอิงผ่าน Google

ฉันพบหนึ่งอัลกอริทึมที่น่าสนใจคืออันนี้จาก "YACAS - หนังสือของอัลกอริทึม"ชื่อ "การปรับฟังก์ชั่น Adaptive"

ดังนั้นในระยะสั้น:

  • มีอัลกอริธึมมาตรฐานหรือไม่?
  • มีชุดทดสอบสำหรับฟังก์ชั่นที่ยากต่อการพล็อตหรือไม่?
  • เอกสารที่น่าสนใจที่ควรอ่านมีอะไรบ้าง

2
อาจจะเข้าใจคำถามได้ดีกว่าด้วย "การวางแผนฟังก์ชั่น" แทนที่จะเป็น "การวาดกราฟ" ฉันตีความชื่อตอนแรกผิด (ทฤษฎีกราฟ)
astrojuanlu

@ Juanlu001 ขอบคุณสำหรับคำแนะนำ ฉันเปลี่ยนชื่อ
soegaard

เมื่อคุณพูดถึง 2D คุณหมายถึงการวางแผนฟังก์ชั่นหนึ่งตัวแปรเช่น(x)หรือคุณสนใจฟังก์ชั่นสองตัวแปร ( (x,Y) ) ที่แสดงใน 2D ด้วยเช่นสี / เฉดสีที่แตกต่างกัน ค่าที่แตกต่างกันอย่างไร
Szabolcs

ฉันหมายถึงการวางแผนฟังก์ชั่นของตัวแปรหนึ่งตัว อย่างไรก็ตามฉันต้องการทราบเกี่ยวกับอัลกอริทึมสำหรับการเลือกจุดที่จะประเมินในการตั้งค่าตัวแปรสองตัวด้วย ฉันไม่ได้สนใจฟังเรื่องสีและการแรเงา
soegaard

สำหรับฟังก์ชั่น 2D, ดูคำถามและคำตอบของฉันที่นี่ สิ่งที่ฉันทำมีข้อ จำกัด และไม่สามารถใช้งานได้ดีสำหรับการใช้งานตามอำเภอใจ นอกจากนี้ยังมีขั้นตอนสำคัญบางอย่างที่ขาดหายไปจากคำอธิบายโดยที่วิธีการจะไม่มาบรรจบกันอย่างถูกต้อง: ฉันต้องการแทรกจุดสุ่มตัวอย่างใหม่ที่กึ่งกลางของแต่ละขอบของตาข่ายซึ่งจะหายไปในการสืบค้นครั้งต่อไป (ต่อ)
Szabolcs

คำตอบ:


10

ฉันใช้การสุ่มตัวอย่างแบบปรับตัวของ Mathematica ที่นี่ใน GitHub (เป็นไฟล์ C ไฟล์เดียวขึ้นไปที่แผนผังต้นไม้สำหรับไฟล์ส่วนหัว) ฉันพบคำอธิบายของกิจวัตรประจำวันในหนังสือเล่มใหญ่ใน Mathematica เมื่อนานมาแล้วและฉันใช้รูปแบบต่าง ๆ ในการใช้งานนี้มาระยะหนึ่งแล้ว โดยทั่วไปแล้วมันจะเป็นตัวอย่างเชิงเส้นคร่าวๆในโดเมนที่สนใจแล้วย้อนกลับไปเพื่อปรับแต่งภูมิภาคที่มีความโค้งสูง มีความเป็นไปได้ที่จะพลาดฟีเจอร์ที่คมชัดบางอย่าง แต่ในทางปฏิบัติฉันพบว่ามันหายากเหลือเกิน ไฟล์นี้ยังมีรุ่นขนาน


1
หนังสือเล่มไหนกันนะ? มันเป็นสิ่งที่ฉันเชื่อมโยงหรือไม่ คุณรู้หรือไม่ว่าการเปลี่ยนแปลงในการติดตั้งระหว่างรุ่น 5 และ 6 เป็นอย่างไร
Szabolcs

1
@Szabolcs: ไม่ฉันเชื่อว่าเป็นในหนังสือเล่มนี้ส่วนที่ 4.1.3 คำอธิบายใช้ Mathematica รุ่นเก่ามาก เวอร์ชันใหม่ (อาจเริ่มต้นจาก v6) ตรวจจับเส้นกำกับแนวดิ่งและลบเส้นแนวตั้งปลอมออกจากแปลง เวอร์ชันใหม่นี้มีการประมวลผลล่วงหน้าที่ซับซ้อนเป็นจำนวนมากเพื่อจัดการกับความไม่ต่อเนื่องภูมิภาคที่ไม่ได้กำหนดและการตัดสาขา
Victor Liu

การประมวลผลสัญลักษณ์ล่วงหน้าที่คุณกำลังพูดถึงเรียกว่า "การตรวจจับการแยก" ในเอกสารประกอบ มันสามารถปิดได้ทั้งโดยExclusions -> Noneหรือโดยการซ่อนโครงสร้างของการทำงานของคุณจากโดยการกำหนดเป็นPlot f[x_?NumericQ] := ...นี่ไม่ใช่สิ่งที่ฉันพูดถึงเมื่อฉันถามเกี่ยวกับการเปลี่ยนแปลง ฉันเชื่อว่ามีการเปลี่ยนแปลงบางอย่างกับอัลกอริทึมเนื่องจาก v5 และ v6 สุ่มตัวอย่างตามจุดต่าง ๆ ตอนนี้ฉันไม่สามารถทดสอบกับ v5 เพื่อเปรียบเทียบอีกครั้งได้
Szabolcs

"คู่มือ Mathematica Graphics" บรรจุการอภิปรายที่ดีมากของปัญหา ฉันชอบโดยเฉพาะอย่างยิ่งที่อธิบายสั้น ๆ ของอัลกอริทึมยัง
soegaard

ฉันไม่พบไฟล์ GitHub อีกต่อไปมันย้ายได้หรือไม่
Andrei

12

การรู้ว่า CAS อื่น ๆ จะช่วยคุณได้อย่างไร

(x)(x(เสื้อ),Y(เสื้อ))(x)

  1. เริ่มต้นด้วยตารางจุดที่เว้นระยะสม่ำเสมอบนโดเมนการพล็อต (ใน Mathematica มีพารามิเตอร์ที่ใช้ควบคุมจำนวนการเรียกPlotPoints)

  2. (x1,(x1)),(x2,(x2)),(x3,(x3))x1+x22x2+x32

  3. หากเรายังไม่ถึงขีด จำกัด การทำซ้ำ (กำหนดโดยMaxRecursionใน Mathematica) ให้ทำซ้ำจากขั้นตอนที่ 2

บางนี้จะกล่าวถึงในหนังสือเล่มนี้ Mathematica ในการดำเนินการโดยสแตน Wagon ซึ่งคุณสามารถดูที่นี่บน Google หนังสือ

ฉันใช้อัลกอริทึมนี้ก่อนเพื่อให้สามารถควบคุมฟังก์ชั่นการคำนวณที่มีราคาแพงได้ดีขึ้น นี่คือรหัส Mathematica สำหรับขั้นตอนที่ 2:

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

เว็บเพจ MathWorld ในกราฟฟังก์ชั่นประกอบด้วยการอ้างอิงไปยังเอกสารหลายฉบับซึ่งดูเหมือนว่าจะเกี่ยวข้องกับการปรับฟังก์ชั่นการปรับตัว การอ้างถึงหน้า:

กิจวัตรที่ดีสำหรับการพล็อตกราฟใช้อัลกอริธึมแบบปรับตัวที่วางแผนจุดเพิ่มเติมในพื้นที่ที่ฟังก์ชันแตกต่างกันไปอย่างรวดเร็วที่สุด (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994) ทัปเปอร์ (1996) ได้พัฒนาอัลกอริทึม [... ]

ในอีกทางหนึ่งบน Google ฉันสะดุดกระดาษ

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

ที่อธิบายถึงวิธีการเลือกโดเมนและสิ่งอื่น ๆ อย่างเหมาะสม ฉันหวังว่าพวกเขาจะเป็นประโยชน์กับคุณ


1

ฉันพบหัวข้อนี้และคิดว่าฉันควรแบ่งปันหน้าปัญหานักพัฒนาซอฟต์แวร์เพื่อเพิ่มสิ่งนี้ลงใน Julia library Plots.jl เราลองใช้เทคนิคหลายอย่างเพื่อดูว่าอะไรจะให้ผลลัพธ์ที่ดีโดยเริ่มจากหมายเหตุเกี่ยวกับการนำ Mathematica มาใช้ การเพิ่มการตัดบางส่วนการก่อกวนเล็ก ๆ ที่ไม่เริ่มต้นที่จุดสิ้นสุดของช่วงเวลาขีด จำกัด การเรียกซ้ำและตัวประมาณความผิดพลาดแบบสองตาข่ายล้วนเป็นสิ่งที่จำเป็นในการ "ทำให้ถูกต้อง" เธรดยังชี้ให้คุณไปยังรหัสโอเพนซอร์สสำหรับการใช้งาน ดังนั้นการปรับแต่งเล็กน้อย แต่การเพิ่มคุณสมบัติเหล่านั้นทำให้มันค่อนข้างแข็งแกร่ง (ตามการทดสอบดังที่แสดงในเธรด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.