بعض الرياضيات مرة أخرى
من الواضح أنه كلما انخفضت قيمة سلسلة تايلور بشكل أسرع ، قل عدد المصطلحات اللازمة لتحقيق الدقة المطلوبة. وهكذا ، يبدو أن النتيجة ستكون أكثر دقة (أدناه سيتم مناقشة هذا بمزيد من التفصيل). للمقارنة ، على سبيل المثال ، خذ مصطلحًا من الدرجة السابعة من سلسلة تايلور () في و . ستكون قيم التعبير و على التوالي. فرق كبير ، أليس كذلك؟ لذلك دعونا نحاول إيجاد طريقة لتقليل الحد الأعلى لفترة حساب دالة الجيب.
توسيع السلسلة حول القيم المعطاة
لفهم هذه الطريقة ، نحتاج إلى العودة إلى السنة الأولى من المعهد وتذكر تعريفات سلسلة تايلور ( ويكي ). باختصار: بمعرفة الوظيفة ومشتقاتها في مرحلة ما ، يمكنك العثور على قيم الدالة بالقرب من هذه النقطة من خلال التوسع في سلسلة تايلور. بالنسبة لوظيفة الجيب ، فهذا يعني ما يلي
ماذا يعطينا هذا النهج من وجهة نظر عملية؟ تخيل أن لدينا فاصل زمني من قبل ... دعنا نختار 10 نقاط موزعة خطيًا في هذا الفاصل الزمني (الخيار ليس هو الأمثل):، ، ، ... لكل نقطة ، احسب اللوحة التي بها جيب الزاوية ومشتقاته عند هذه النقطة. الآن يمكنك تعديل الوظيفة بحيث عند الحصول على القيمة تأخذ الدالة أقرب قيمة ويضع في صف حول النقطة ، ليس حول الصفر ().
استخدام التحولات المثلثية
إذا عدت أبعد من ذلك ، إلى فصول المدرسة العليا ، فيمكنك أن تتذكر صيغة واحدة مهمة جدًا:
وبعد ذلك كل شيء هو نفسه كما في الفقرة السابقة. نختار النقاط داخل الفترة ، ونحسب الجيب وجيب التمام لهما ، وعند استدعاء دالة الجيب ، نبحث عن أقرب نقطة ، وباستخدام الصيغة أعلاه ، نحسب الجيب باستخدام قيمة صغيرة...
فكر في أي من هاتين الطريقتين من الأفضل اختياره ، ولكن في الوقت الحالي سننتقل من الرياضيات إلى الحسابات العملية.
توزيع خاصية الضرب في عالم النقطة العائمة
كان علي أن أطلب النصيحة من الإنترنت ، ما يسمى ... اتضح أنها خاصية توزيعية. دعنا نعود إلى السؤال الذي طرحته في نهاية الجزء الأول. وهي ، لماذا التعبيرات المتكافئة رياضيا و يمكن أن تعطي نتائج مختلفة في حسابات النقطة العائمة؟ أسهل طريقة لتوضيح ذلك هي بمثال. لنأخذ نظامًا افتراضيًا يعمل بأرقام الفاصلة العائمة بتنسيق عشري بدقة 4 أرقام. دعونا نتظاهر بذلك، و و ... أولاً ، لنأخذ تعبيرًا بين قوسين ونحسبه خطوة بخطوة ، مع تذكر التقريب في كل خطوة:
1)
2)
تلقى الرد
لنحسب الآن التعبير الثاني بنفس الطريقة خطوة بخطوة:
تلقى الرد
الإجابة الصحيحة هي 0.0574806652.
كما ترى ، فإن الإجابة التي تم الحصول عليها في الحالة الثانية أقرب بكثير إلى الإجابة الصحيحة عنها في الحالة الأولى. إذا شرحنا هذا بالأصابع ، فتخيل أنه في الحالة الأولى نضيف الرقم إلى 1.0نطرح آخر رقمين فقط. هم ليسوا أكثر. في الحالة الثانية ، يحدث الرمي في النهاية ، بعد الضرب. أولئك. في الحالة الثانية ، تكون عملية (عمليات) الضرب أكثر دقة.
يبدو أنه يمكنك الانتهاء من هذا ، ولكن ألق نظرة فاحصة على الطريقة الأولى وأخبرني ما ستكون نتيجة الحساب... و ... لدينا طريقة لتقريب أرقام الفاصلة العائمة! لا تفوت هذا المثال. امنح نفسك الوقت لمعرفة ذلك. سيتم استخدام تقريب الأرقام بشكل مكثف للغاية من قبلنا في هذا المقال وفي المقالات التالية.
دعنا نلاحظ ميزة أخرى لهذا التعبير. تخيل أن دقة المتغير المكونة من 4 أرقام ليست كافية بالنسبة لنا. ماذا أفعل؟ وهنا لدينا الإجابة بالفعل - لتمثيل الرقم في الصورةوتخزينها في الذاكرة كمجموع من رقمين. وبناءً على ذلك ، نفذ العمليات (مثل الضرب) بشكل منفصل لكلا المصطلحين. تم وصف هذه التقنية بمزيد من التفصيل في المقالة إضافة عددين من الفاصلة العائمة دون فقدان الدقة .
في المقال السابق ، كتبت أيضًا أن الطريقةهناك ميزة واحدة غير سارة. وهي على النحو التالي. رقم يتم اقتطاعه دائمًا عند آخر رقم مميز من الرقم ... هذا يعني أنه بغض النظر عن الرقم، اذا كان ، فإن الخطأ في العلامة الأخيرة ممكن دائمًا حتى لو كان صغيرًا ... هذا غير مسموح به في النهج في الفصل التالي.
كيف تعمل باستخدام مكتبة جنو كمثال
كيف هذا؟ هل اخترت أي من الطريقتين الموصوفتين في بداية المقال اخترت لحساب الجيب بدقة؟ أيًا كانت الطريقة التي تختارها ، كلاهما صحيح. علاوة على ذلك ، فهما متطابقان تمامًا. صدقني ، تحقق من ذلك. أدناه سأستخدم الصيغ المدرسية. من السهل شرحها.
مسلحًا بالمعرفة المكتسبة في المقالة السابقة وفي هذه المقالة ، يمكنك بسهولة فهم رمز المكتبة القياسية. لنفتح ملف s_sin.c ونجد وظيفة __sin هناك : رمزه
بسيط للغاية. من السهل أن نفهم أنه يستدعي مجموعة مختلفة من الوظائف اعتمادًا على حدود متغير الإدخال. في هذه المقالة ، سنناقش قسم كود 218-224 للزوايا 2 ^ -26 <| x | <0.855469. يمكنك أن ترى أنه في هذا القسم من الكود يتم استدعاء الوظيفة do_sin (x، 0). سوف نتناول هذه الوظيفة بمزيد من التفصيل:
- , dx=0 .
- 129-130 , abs(x)<0.126, .. x , . , , , .
- 136-137. , . x 2 . u x. , 0.345678. u=0.34, 0.005678.
- 140-142. ( s ) ( c ) x . , cos(x)=1-c, 1.0, (. ), .
- 143. u. , u=0.34 34. sin(u)=sn+ssn, cos(u)=cs+ccs. sn cs — «» u, ssn ccs — .
- 144-145. sin(u+x)=(sn+ssn)*(1-c)+(cs+ccs)*s. , , 144-145. — .
في الواقع ، لقد وصفت فقط أبسط جزء من حساب الجيب بهذه الطريقة. هناك الكثير من الرياضيات خلفها. على سبيل المثال ، كيف تحسب حجم الجدول والعناصر الموجودة فيه؟ من أين أتت الأرقام السحرية 0.126 و 0.855469؟ متى تقطع الحساب برقم تايلور؟ تصحيحات لمعاملات سلسلة تايلور لتحسين النتيجة.
كل هذا ، بالطبع ، مثير للاهتمام ، ولكن من الناحية الموضوعية ، فإن الطريقة المقدمة لها العديد من العيوب: من الضروري حساب الجيب (s) وجيب التمام (c) في وقت واحد ، الأمر الذي يتطلب ضعف عدد حسابات سلسلة تايلور 1 . الضرب بالقيم الجدولية ، كما نرى ، ليس مجانيًا أيضًا. أيضًا ، لا يمثل تخزين جدول من 3520 بايت في ذاكرة الوصول العشوائي ، بالطبع ، مشكلة ، ولكن الوصول إليه (حتى في ذاكرة التخزين المؤقت) قد يكون مكلفًا.
لذلك ، في الجزء التالي سنحاول التخلص من اللوحة وحساب الجيب في الفترة [0.126 ، 0.855469] بشكل مباشر ، ولكن بشكل أكثر دقة مما في الفصل الأول.
قبل أن تنتهي - مسألة ذكاء سريع. الرقم الكبير في هذا المثال هو 52776558133248 = 3 * 2 44 . من أين أتى هذا الرقم ، وليس ، على سبيل المثال ، 452 ؟ سأصوغ السؤال بشكل أكثر دقة. لماذا الرقم 3 * 2 N هو الأمثل عند تقريب الأرقام وليس 2 N + 1 على سبيل المثال ؟ سؤال آخر ، أي N يجب أن تختار لتقريب رقم إلى عدد صحيح؟
1 وتجدر الإشارة إلى أن ميزة كبيرة لهذا النهج يمكن أن تظهر عندما يتم حساب الجيب وجيب التمام في وقت واحد من نفس الزاوية. يمكن حساب الوظيفة الثانية مجانًا تقريبًا.