هل يمكن لشخص ما يفسر لماذا Scipy.integrate.quad يعطي نتائج مختلفة للنطاقات الطويلة على قدم المساواة أثناء دمج الخطيئة (س)؟

StackOverflow https://stackoverflow.com/questions/581186

سؤال

أحاول أن أدمج عدديا تعسفا (معروفا عند رمز I) في برنامجي باستخدام طرق التكامل العددية. أنا أستخدم Python 2.5.2 جنبا إلى جنب مع حزمة التكامل العددية SCIPY. من أجل الحصول على شعور بذلك، قررت تجربة دمج الخطيئة (X) ولاحظت هذا السلوك

>>> from math import pi
>>> from scipy.integrate import quad
>>> from math import sin
>>> def integrand(x):
...     return sin(x)
... 
>>> quad(integrand, -pi, pi)
(0.0, 4.3998892617846002e-14)
>>> quad(integrand, 0, 2*pi)
(2.2579473462709165e-16, 4.3998892617846002e-14)

أجد هذا السلوك غريب لأنه -
1. في التكامل العادي، دمج على الدورة الكاملة يعطي صفر.
2. في التكامل العددي، هذا (1) ليس بالضرورة الحالة، لأنك قد تقريب فقط من المساحة الإجمالية تحت المنحنى.

على أي حال، إما على افتراض أن 1 صحيح أو افتراض 2 صحيح، أجد السلوك أن يكون غير متناسق. إما أن كلا التكاملين (-pi إلى PI و 0 إلى 2 * * PI) يجب أن يعود 0.0 (القيمة الأولى في Tuple هي النتيجة والثاني هو الخطأ) أو العودة 2.257 ...

يمكن للشخص يرجى توضيح لماذا يحدث هذا؟ هل هذا حقا غير متناسق؟ هل يمكن لأي شخص أن يقول لي أيضا إذا فقد فقد شيئا بسيطا حقا حول الأساليب العددية؟

في أي حال، في تطبيقي النهائي، أخطط لاستخدام الطريقة المذكورة أعلاه للعثور على طول القوس لوظيفة. إذا كان شخص ما لديه خبرة في هذا المجال، فيرجى تقديم المشورة لي في أفضل سياسة للقيام بذلك في بيثون.

يحرر
ملحوظة
لدي بالفعل القيم التفاضلية الأولى في جميع النقاط في المدى المخزن في صفيف.
الخطأ الحالي مقبول.
ملاحظة نهاية

لقد قرأت ويكيبايديا على هذا. كما أشار DILITRY، سأكون دمج SQRT (1 + diff (f (x)، x) ^ 2) للحصول على طول القوس. ما أردت أن أسأله كان - هل هناك تقدير أفضل / أفضل الممارسات (؟) / أسرع طريقة للقيام بذلك. إذا كان هناك حاجة إلى مزيد من السياق، فسوف نشره بشكل منفصل / سياق آخر، كما يحلو لك.

هل كانت مفيدة؟

المحلول

ال quad وظيفة هي وظيفة من مكتبة فورتران القديمة. إنه يعمل من خلال الحكم من خلال التسطيح ونحدر الوظيفة، يدمج كيفية التعامل مع حجم الخطوة التي تستخدمها للتكامل العددي من أجل زيادة الكفاءة. ما يعنيه هذا هو أنه قد تحصل على إجابات مختلفة قليلا من منطقة واحدة إلى التالي حتى لو كانت نفسية نفسها.

بلا شك يجب أن تعود كلا التكاملين صفر. إرجاع شيء ما هو 1 / (10 تريليون) قريب جدا من الصفر! الاختلافات الطفيفة ترجع إلى الطريق quad هو المتداول sin وتغيير أحجام خطوة لها. لمهمتك المخططة، quad سيكون كل ما تحتاجه.

تحرير: لما تفعله أعتقد quad على ما يرام. إنه سريع وبشكل جيد. بياني النهائي الخاص بي هو استخدامه بثقة ما لم تجد شيئا قد ذهب حقا. إذا لم يعد إجابة نونية، فمن المحتمل أن تعمل على ما يرام. لا قلق.

نصائح أخرى

أعتقد أنه من المحتمل أن يكون الدقة الآلية لأن كلا الإجابات صفر فعالية.

إذا كنت تريد إجابة من فم الحصان وأود نشر هذا السؤال على مجلس مناقشة SCIPY

أود أن أقول أن عدد O (10 ^ -14) صفر فعال. ما هو التسامح الخاص بك؟

قد يكون ذلك أن الخوارزمية الكامنة وراء رباعية ليست هي الأفضل. قد تحاول طريقة أخرى للتكامل ومعرفة ما إذا كان ذلك يحسن الأشياء. يمكن أن يكون الترتيب الخامس كوتا تقنية غرض عام لطيف للغاية.

قد يكون مجرد طبيعة أرقام النقطة العائمة: "ما يجب أن يعرفه كل عالم كمبيوتر حول الحساب العائم".

يبدو هذا الإخراج صحيحا بالنسبة لي لأن لديك تقدير خطأ مطلق هنا. إن القيمة المتكاملة للخطيئة (X) هي في الواقع يجب أن يكون لها قيمة صفر لفترة كاملة (أي فاصل طول 2 * PI) في كل من التكامل العادي والرقمي ونتائجك قريبة من هذه القيمة.
لتقييم طول القوس، يجب عليك حساب Integral for SQRT (1 + Diff (f (x)، x) ^ 2)، حيث Diff (f (x)، x) مشتق من f (x). أنظر أيضا طول القوس

0.0 == 2.3e-16 (absolute error tolerance 4.4e-14)

كلا الإجابات هي نفسها و صيح أي، صفر داخل التسامح معين.

يأتي الفرق من حقيقة أن الخطيئة (X) = - SIN (-X) بالضبط حتى في الدقة المحدودة. في حين أن الدقة المحدودة تعطي فقط sin (x) ~ sin (x + 2 * pi) تقريبا. من المؤكد أنه سيكون من الرائع أن تكون الرباعية ذكية بما فيه الكفاية لمعرفة ذلك، لكن ليس من الممكن حقا معرفة Apriori أن لا يتجزأ على الفواصل الزمنية التي تقدمها تعادلها أو أن الأول هو نتيجة أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top