คำนวณ


13

ฟังก์ชั่นมีความแปลกประหลาดที่อยู่ใกล้กับx = 0 ความแปลกประหลาดนั้นสามารถยกได้แม้ว่า: สำหรับx = 1 , หนึ่งควรมีf ( x ) = 1 , เนื่องจาก e x = k = 0 x kf:x(ex1)/xx=0x=1f(x)=1 และ (ex-1)/x=k=1x k - 1

ex=k=0xkk!
อย่างไรก็ตามรูปแบบ(ex-1)/xไม่เพียง แต่ไม่ได้กำหนดที่x=0เท่านั้น แต่ยังมีความไม่แน่นอนเชิงตัวเลขในบริเวณใกล้เคียงของจุดนั้น เพื่อประเมินf(x)สำหรับx ที่เล็กมากตัวเลขหนึ่งสามารถใช้การขยายตัวของเทย์เลอร์นั่นคือการตัดทอนของซีรีย์พลังงานที่กล่าวถึงข้างต้น
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x

ถาม : ฟังก์ชั่นมีชื่อหรือไม่? นี่เป็นปัญหาที่พบบ่อยหรือไม่?f

ถาม : มีใครบ้างที่รู้ว่าไลบรารี C / C ++ ที่จัดการกับสถานการณ์นี้ได้ดีคือใช้การขยายตัวของเทย์เลอร์ในระดับที่เหมาะสมใกล้กับ 0 และการแสดงอื่น ๆ อยู่ห่างจากศูนย์

คำตอบ:


19

อาจจะเป็นหนึ่งสามารถเริ่มต้นด้วยฟังก์ชั่นซึ่งเป็นส่วนหนึ่งของมาตรฐาน C99 และคำนวณE x - 1ถูกต้องใกล้x = 0expm1ex1x=0


17

นี่เป็นตัวอย่างของข้อผิดพลาดในการยกเลิก expm1ไลบรารี่มาตรฐาน C (ตั้งแต่ C99) มีฟังก์ชันที่เรียกว่าหลีกเลี่ยงปัญหานี้ หากคุณใช้expm1(x) / xแทนคุณ(exp(x) - 1.0) / xจะไม่ประสบปัญหานี้ (ดูกราฟด้านล่าง) <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </code>

รายละเอียดและวิธีการแก้ปัญหานี้โดยเฉพาะอย่างยิ่งที่จะกล่าวถึงที่มีความยาวในมาตรา 1.14.1 ของความถูกต้องและความมั่นคงของตัวเลขอัลกอริทึม วิธีแก้ปัญหาแบบเดียวกันก็อธิบายไว้ในหน้า 19 ของเอกสารของ W. Kahan เรื่องการประเมินผล Roundless ในเกมการคำนวณแบบลอยๆ . การดำเนินงานที่เกิดขึ้นจริงของexpm1ในห้องสมุด GNU C จะแตกต่างจากวิธีการที่อธิบายไว้ในลำดับที่ดังกล่าวข้างต้นและมีการบันทึกไว้อย่างละเอียดในรหัสที่มา


1
ขอบคุณนั่นเป็นสิ่งที่ฉันต้องการ! น่าเสียดายที่ฉันสามารถตอบได้เพียงคำตอบเดียว ...
ไม่ระบุชื่อ

แน่นอน! ไม่มีปัญหา :-)
Juan M. Bello-Rivas

3

เพื่อตอบคำถามแรกของคุณไม่ใช่ฟังก์ชันไม่มีชื่อ (อย่างน้อยก็ไม่ใช่ชื่อที่รู้จักกันอย่างกว้างขวาง)

วิธีที่ดีที่สุดในการคำนวณฟังก์ชั่นคือการปฏิบัติต่อกรณีพิเศษหลาย ๆ อย่าง นี่คือวิธีที่ไลบรารีใด ๆ จะคำนวณฟังก์ชัน

  1. กรณีที่ 0: x = 0, ส่งคืน 1
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. กรณีอื่น: expm1(x)/xการกลับมา

คุณสามารถซับซ้อนกว่าและกรณีพิเศษมากกว่านี้ด้วยซีรีย์ Taylor ที่ถูกตัดทอน แต่อาจไม่คุ้มค่า ในความเป็นจริงมันไม่ชัดเจนว่ากรณีที่ 1 จะต้องจัดการแยกต่างหากเนื่องจาก k20 ชี้ให้เห็นว่าการยกเลิกมีความปลอดภัย อย่างไรก็ตามการจัดการแยกต่างหากจะทำให้ฉันรู้สึกมั่นใจมากขึ้น


2

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

ใช่คำตอบนี้ผิดอย่างสมบูรณ์ ฉันไม่แน่ใจว่าทำไมมันถูก upvoted มากอาจเป็นเพราะมีการระบุไว้อย่างเป็นทางการ ฉันพบลิงค์ที่มีอยู่ในใจ มันเป็น stackexchange คณิตศาสตร์ที่นี่ไม่ได้อยู่ใน stackexchange scicomp expm1สูตรการยกเลิกข้อผิดพลาดที่ปราศจากจะได้รับในคำตอบโดย JM และใช้u = exp(x)การเปลี่ยนแปลง


xdx(edx1)/dx(1+dx1)/dx1

1
dx1+dx=1

0

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


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

@anonymous: ผลรวม tripple ใดที่คุณหมายถึง คุณไม่จำเป็นต้องใช้ชื่อพหุนาม Bernoulli เฉพาะหมายเลข Bernoulli และคุณสามารถแสดงรายการเหล่านั้นล่วงหน้า แต่ใช่มันยังคงไม่ดีไปกว่าซีรีย์ Taylor
Nikolaj-K

คุณสามารถคำนวณล่วงหน้าได้หากเห็นได้ชัดว่าคุณต้องการเพียงจำนวน จำกัด แน่นอนสำหรับอินพุตใด ๆ เท่านั้น
ไม่ระบุชื่อ

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