อนุพันธ์เชิงตัวเลขและสัมประสิทธิ์ผลต่างอันตะ จำกัด : การปรับปรุงใด ๆ ของวิธีการ Fornberg?


11

เมื่อต้องการคำนวณอนุพันธ์เชิงตัวเลขวิธีที่นำเสนอโดย Bengt Fornberg ที่นี่ (และรายงานที่นี่ ) สะดวกมาก (ทั้งแม่นยำและง่ายต่อการใช้งาน) ในฐานะที่เป็นกระดาษดั้งเดิมวันที่จากปี 1988 ฉันต้องการที่จะรู้ว่ามีทางเลือกที่ดีกว่าในวันนี้ (เป็น (หรือเกือบ) ง่ายและแม่นยำยิ่งขึ้น?


1
ยากที่จะพูดโดยไม่ทราบว่าคุณต้องการแยกความแตกต่าง คุณเคยคิดว่าความแตกต่างอัตโนมัติหรือไม่
Biswajit Banerjee

@BiswajitBanerjee: สำหรับสัมประสิทธิ์ความแตกต่าง จำกัด การใช้ความแตกต่างอัตโนมัติไม่ได้ใช้
Geoff Oxberry

@ GeoffOxberry: ฉันหมายถึงปัญหาทางกายภาพที่เกิดขึ้นจริงเช่นส่วนวิทยาศาสตร์ของ "วิทยาศาสตร์การคำนวณ"
Biswajit Banerjee

@Vincent: คุณพยายามแยกฟังก์ชั่นหรือตารางหรือไม่? หากข้อมูลตารางเป็นข้อมูลตารางที่มีเสียงดัง? คุณพยายามแยก PDE ออกหรือไม่
user14717

คำตอบ:


9

ภาพรวม

คำถามที่ดี. มีบทความเรื่อง "การปรับปรุงความถูกต้องของวิธีการสร้างความแตกต่างของเมทริกซ์สำหรับคะแนนการจัดตำแหน่งตามอำเภอใจ" โดย R. Baltensperger มันไม่ใช่เรื่องใหญ่ในความคิดของฉัน แต่มันมีจุด (ซึ่งเป็นที่รู้จักกันก่อนหน้านี้ในปี 2000): มันเน้นถึงความสำคัญของการเป็นตัวแทนที่ถูกต้องของความจริงที่ว่าอนุพันธ์ของฟังก์ชันคงที่(x)=1ควร เป็นศูนย์ (สิ่งนี้ถือได้ว่ามีความหมายทางคณิตศาสตร์ แต่ไม่จำเป็นต้องเป็นตัวแทนตัวเลข)

มันง่ายที่จะเห็นว่าสิ่งนี้ต้องการผลบวกของแถวของเมทริกซ์ n-th อนุพันธ์D(n)เป็นศูนย์ มันเป็นเรื่องธรรมดาที่จะบังคับใช้ข้อ จำกัด นี้โดยการปรับรายการเส้นทแยงมุมคือการตั้งค่า

(1)DJJ(n)=-Σผม=1ผมJยังไม่มีข้อความDผมJ.
เป็นที่ชัดเจนว่าคุณลักษณะนี้ไม่ได้ทำงานอย่างแน่นอนเมื่อทำงานกับคอมพิวเตอร์เนื่องจากข้อผิดพลาดในการปัดเศษในการคำนวณจุดลอยตัว สิ่งที่น่าแปลกใจยิ่งกว่าคือข้อผิดพลาดเหล่านี้จะรุนแรงยิ่งขึ้นเมื่อใช้สูตรการวิเคราะห์สำหรับเมทริกซ์อนุพันธ์ (ซึ่งมีให้สำหรับจุดการจัดวางแบบคลาสสิกจำนวนมากเช่น Gauss-Lobatto)

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

การทดสอบเชิงตัวเลข

ข้อดีคือกระบวนการของ Fornberg นั้นค่อนข้างดีในเรื่องนี้ ในภาพด้านล่างฉันได้เปรียบเทียบพฤติกรรมของสิ่งที่ถูกต้องนั่นคือการวิเคราะห์เมทริกซ์อนุพันธ์อันดับหนึ่งและอันที่ได้มาจากอัลกอริทึม Fornberg สำหรับจำนวนจุดการจัดตำแหน่ง Chebyshev-Lobatto ที่แตกต่างกัน

อีกครั้งที่เชื่อคำแถลงในเอกสารที่อ้างถึงนี่ก็หมายความว่าอัลกอริทึม Fornberg จะให้ผลลัพธ์ที่แม่นยำยิ่งขึ้นสำหรับอนุพันธ์

เพื่อพิสูจน์ว่าฉันจะใช้ฟังก์ชั่นเดียวกับในกระดาษ

(2)(x)=11+x2.
(3)En=สูงสุดผม{0,...,n}|'(xผม)-ΣJ=1nDผมJ(xJ)|.
(4)D~JJ=DJJ-(Σผม=1nDJผม),เพื่อทุกสิ่ง J.

ข้อสรุป

โดยสรุปแล้ววิธีการของ Fornberg นั้นค่อนข้างแม่นยำในกรณีที่แม้จะมีขนาดความแม่นยำประมาณ 3 คำสั่งมากกว่าผลลัพธ์จากสูตรการวิเคราะห์ นี่ควรจะแม่นยำเพียงพอสำหรับการใช้งานส่วนใหญ่ ยิ่งไปกว่านั้นสิ่งนี้น่าทึ่งเพราะ Fornberg ดูเหมือนจะไม่ได้รวมข้อเท็จจริงนี้ไว้ในวิธีการของเขาอย่างชัดเจน (อย่างน้อยก็ไม่มีการพูดถึงในเอกสารของ Fornberg สองฉบับ)ยังไม่มีข้อความ=512

ลำดับความสำคัญอื่นสามารถรับได้จากตัวอย่างนี้ผ่านการรวม Eq. (4) เนื่องจากนี่เป็นวิธีการที่ง่ายมากและใช้เพียงครั้งเดียวสำหรับอนุพันธ์แต่ละอันฉันไม่เห็นเหตุผลที่จะไม่ใช้มัน

วิธีการจากกระดาษ Baltensperger - ซึ่งใช้วิธีการที่ซับซ้อนมากขึ้นสำหรับการประเมินผลรวมใน Eq (1) เพื่อลดข้อผิดพลาดในการปัดเศษ - ให้ผลประมาณขนาดเดียวกันสำหรับข้อผิดพลาด อย่างน้อยที่สุดสำหรับตัวอย่างนี้มันประมาณคร่าวๆกับวิธี "Adjusted Fornberg" ด้านบน


4

สมมติว่าคุณกำลังพยายามแยกความแตกต่างของการใช้ฟังก์ชั่นตัวเลขอย่างต่อเนื่องมีวิธีการมากมาย:

1) ความแตกต่างอัตโนมัติ วิธีที่ถูกต้องและทั่วไปที่สุด รหัสเจ็บปวดต้องใช้ตัวดำเนินการมากเกินไปและการค้นหาขึ้นอยู่กับการโต้แย้ง วางภาระให้ผู้ใช้เข้าใจแนวคิดเหล่านี้ นอกจากนี้ยังต้องต่อสู้กับเอกที่ถอดออกได้เช่นความแตกต่าง sinc ที่ 0x=0

2) การแปลง Chebyshev ฉายภาพการทำงานของคุณบนพหุนามแบบ Chebyshev และแยกความแตกต่างระหว่างการเกิดซ้ำอีกสามคำ เร็วสุดแม่นยำมาก แต่ต้องการให้คุณมีโดเมนที่น่าสนใจรองรับอย่างแน่นหนา นอกโดเมนที่เลือกการทำซ้ำคำสามคำนั้นไม่เสถียร[a,b]

3) ผลต่าง จำกัด underrated ใน 1D; เห็นนิคฮิกคั่มของเคล็ดลับและเทคนิคในเชิงตัวเลขคอมพิวเตอร์ แนวคิดก็คือถ้าคุณสร้างความสมดุลข้อผิดพลาดการตัดและข้อผิดพลาด roundoff แล้วคุณไม่จำเป็นต้องเลือกขั้นตอน; สามารถเลือกได้โดยอัตโนมัติ ใน Boost แนวคิดนี้ใช้เพื่อกู้คืน (ตามค่าเริ่มต้น) 6/7 ของตัวเลขที่ถูกต้องสำหรับประเภท (Higham แสดงให้เห็นถึงความคิดสำหรับกรณีที่ง่ายกว่าของ 1/2 ตัวเลขที่ถูกต้อง แต่ความคิดจะขยายได้อย่างง่ายดาย) ค่าสัมประสิทธิ์มาจากตาราง Equispaced ของ Fornberg แต่ขั้นตอนถูกเลือกภายใต้สมมติฐานว่าฟังก์ชันสามารถประเมินได้ถึง 1ULP ความถูกต้อง ข้อเสียคือต้องใช้การประเมิน 2 ฟังก์ชันเพื่อกู้คืนครึ่งหลักของประเภท 4 เพื่อกู้คืนตัวเลข 3 / 4th เป็นต้น ใน 1D ไม่ใช่เรื่องเลวร้าย ในมิติที่สูงขึ้นมันเป็นหายนะ

4) อนุพันธ์ขั้นตอนที่ซับซ้อน ใช้IH)) ใช้เวลาเพื่อเป็นหน่วย roundoff และสิ่งนี้จะกู้คืนได้เกือบทุกบิตที่ถูกต้อง อย่างไรก็ตามมันเป็นการโกงเพราะโดยทั่วไปแล้วมันยากที่จะใช้ฟังก์ชั่นในระนาบเชิงซ้อนมากกว่าการเขียนโค้ดอนุพันธ์ที่แท้จริง ยังเป็นแนวคิดที่ยอดเยี่ยมและมีประโยชน์ในบางสถานการณ์f(x)(f(x+ih))ชั่วโมง


1

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


ฉันจะไม่เห็นด้วยกับคำสั่ง "ดูที่อัลกอริทึมของเขาเป็นวิธีการคำนวณอนุพันธ์เชิงตัวเลขไม่ถูกต้อง" เมื่อคุณมีน้ำหนักประเมินจุดคุณโดยตรงสามารถคำนวณอนุพันธ์เชิงตัวเลขของฟังก์ชั่นใด ๆผ่าน(x_i) Z F ( x ) F ' ( Z ) = Σ ฉันW ฉัน F ( x ฉัน )WผมZ(x)'(Z)=ΣผมWผม(xผม)
davidhigh

@davidhigh: ถ้าคุณอ่านเอกสารของ Fornberg พวกเขาจะพูดถึงการคำนวณน้ำหนักสำหรับการประมาณค่าผลต่าง จำกัด ซึ่งไม่เกี่ยวกับการคำนวณด้วยตนเอง แน่นอนว่าคุณสามารถใช้อัลกอริธึมในการคำนวณอนุพันธ์ได้เช่นกัน แต่มันก็สมเหตุสมผลกว่าที่จะคำนวณน้ำหนักจัดเก็บพวกมันแล้วใช้มันซ้ำ ๆ เพื่อคำนวณอนุพันธ์โดยประมาณ มิฉะนั้นคุณกำลังคำนวณน้ำหนักซ้ำ ๆ เมื่อไม่ต้องการ
Brian Zatapatique

1

รูปแบบที่เรียบง่าย

นอกจากคำตอบอื่น ๆของฉันซึ่งเป็นส่วนเพิ่มเติมเกี่ยวกับวิธีการของ Fornberg ฉันจะตอบคำถามทางเลือกที่ง่ายขึ้นที่นี่

สำหรับเรื่องนี้ฉันร่างโครงการทางเลือกที่ก่อให้เกิดสัมประสิทธิ์อนุพันธ์ของการประมาณค่าลากรองจ์โดยตรง การใช้งานต้องใช้โค้ดเพียงไม่กี่บรรทัดใช้งานได้กับกริดตามอำเภอใจและจากการทดสอบครั้งแรกของฉันนั้นแม่นยำเหมือนของ Fornberg

พื้นฐานของการดำเนินการเป็นขั้นตอนจินตนาการอนุพันธ์ ที่เป็นตัวแปรตามลำดับความแม่นยำของเครื่องจักร อนุพันธ์ขั้นตอนจินตนาการเป็นที่รู้จักกันเสถียรผลิตค่าอนุพันธ์และไม่ประสบความไม่แน่นอนเชิงตัวเลขของการดำเนินงานที่แตกต่างกับไฟไนต์0

f(x) = 1hIm(f(x+ih)),
hh0

Li(x){x1,,xN}

Li(z) = {1if z=xi μizxkkμkzxkotherwise.
μผม=1Πkผม(xผม-xk)Zผม=(xผม)(x1,ผม)
P(x;)=Σผม=1ยังไม่มีข้อความผมLผม(x).


ขั้นตอนวิธี

อัลกอริทึมถูกร่างในต่อไปนี้ มันมีพารามิเตอร์อินพุตและเอาต์พุตเดียวกับ Fornberg แต่ไม่มีอะไรมาก

การป้อนข้อมูล:

  • x : กริดที่มีจุดกริด N ที่แตกต่างกัน
  • โอRd : ลำดับอนุพันธ์
  • z: จุดที่จะทำการประเมินอนุพันธ์
  • อาจเป็นไปได้: ฟังก์ชั่นหรือค่า funciton ของที่จุดกริด (จำเป็นสำหรับตัวแปรเอาท์พุท 2 เท่านั้น)(x)ผม

การเริ่มต้น

  • เริ่มต้นชื่อพหุนาม Lagrange ผ่านการแก้ไขแบบบาริเซนทริกL
  • เริ่มต้นอาร์เรย์ของเมทริกซ์ , สำหรับยังไม่มีข้อความ×ยังไม่มีข้อความD(โอ)โอ=0,...,โอRd
  • ตั้งนั่นคือเมทริกซ์หน่วยของมิติD(0)=ผมยังไม่มีข้อความยังไม่มีข้อความ×ยังไม่มีข้อความ
  • ตั้งโอ=0

ขั้นตอนวิธี

โอ<โอRd

  • Dผมk(โอ+1)=SD(P(xk;Dผม(โอ)))SDผมk
    Dผม(โอ)ผมD(โอ)

  • ตั้ง o = o + 1;

ตัดสินใจว่าจะเอาท์พุท :

  1. d(โอRd)Zdผม=P(Z;Dผม(โอRd))

  2. พี(โอRd)(x)=Σผม=1ยังไม่มีข้อความ(xผม)P(x;Dผม(โอRd))(โอRd)(x)โอRdผมxผม

  3. diff(int โอRd,ฟังก์ชัน ก.)ก.

โดยส่วนตัวแล้วฉันชอบตัวแปร 3 มากที่สุด


การวิเคราะห์อัลกอริทึม

O(โอRdยังไม่มีข้อความ2)


0

ในการเพิ่มความแม่นยำของความแตกต่างของตัวเลขให้ทำดังนี้

1) เลือกความแม่นยำสูงวิธี "มาตรฐาน" ที่คุณชื่นชอบขึ้นอยู่กับขนาดบางขั้นตอนต่อชั่วโมง

2) การคำนวณมูลค่าของตราสารอนุพันธ์ด้วยวิธีการที่เลือกไว้ใน 1) หลายครั้งที่มีขั้นตอนที่แตกต่างกัน แต่ที่เหมาะสมขนาดชั่วโมง แต่ละครั้งที่คุณเลือกhเป็นตัวเลขสุ่มจากช่วงเวลา (0.5 * H / 10, 1.5 * H / 10) โดยที่ H คือขนาดขั้นตอนที่เหมาะสมสำหรับวิธีการที่คุณใช้

3) ค่าเฉลี่ยผลลัพธ์

ผลลัพธ์ของคุณอาจได้รับคำสั่ง 2-3 ขนาดเมื่อเกิดข้อผิดพลาดสัมบูรณ์ ผลลัพธ์ที่ไม่ได้ค่าเฉลี่ย

https://arxiv.org/abs/1706.10219


3
ยินดีต้อนรับสู่ SciComp.SE! คำตอบนี้จะดียิ่งขึ้นถ้าคุณจะสรุปวิธีสั้น ๆ
Christian Clason

2
นอกจากนี้ชื่อผู้ใช้ของคุณแนะนำว่าคุณเขียนบทความนั้น โปรดอ่านหลักเกณฑ์ของเราเกี่ยวกับการโปรโมตตนเองและแก้ไขโพสต์ของคุณตามนั้น
Wrzlprmft

ฉันคิดว่าการลงคะแนนลบไม่ยุติธรรมถ้าคำตอบของฉันชี้ไปที่คำตอบที่ถูกต้อง
F. Jatpil

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