سؤال

إليك سؤال سهل جدًا لرجال VBA.أقوم بتشغيل طريقة نيوتن على بعض الوظائف، وأحيانًا أجد تخمينًا بأنني لا أستطيع إلا أن أفترض أنه يتجاوز وظيفة Exp() (ويوقف الكود).ما هي اقتراحاتكم يا رفاق للتعامل مع هذه الحالة ببساطة؟(ربما نوع من معالجة الأخطاء؟)

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

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

تنصل:أنا مبتدئ VBA تمامًا، لذا سيتم قراءة أي اقتراحات وتقديرها.شكرا لك مقدما.

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

Newtons Method Loop

Bisection Loop

داخل حلقة طريقة نيوتن، قمت بالتتبع إلى نقطة لدي فيها تخمين تالي لشيء يبلغ حوالي 28000 أو نحو ذلك، وقمت بتعيين متغير ح القيمة Exp(28,000) أو الدوارات.ينقطع مصحح الأخطاء عند هذه النقطة؛يتم الخروج من الكود الخاص بي بشكل أساسي، وأيًا كانت القيمة التي يجب أن ترجعها وظيفتي فإنها تنتج #VALUE!في زنزانتي.

أعلم أن هذه ليست معلومات كثيرة، لكنني آمل (وأعتقد) أن تكون كافية.صحح لي إن كنت مخطئ.

تحرير 2:إذا فشل كل شيء آخر، فسوف أقوم بالتقاط قيم كبيرة جدًا بشكل صريح، لكنني أتساءل عما إذا كان هناك حل أكثر قوة وأناقة.

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

المحلول

ليس من المستغرب أن يفيض نظرا لذلك Exp(28,000) هو 1.8x1012160, ، الحد الأقصى للقيمة التي يمكنك التمرير إليها Exp هو ~ 709.

إذا كنت تريد الخروج من حلقتك إذا واجهت قيمة كبيرة جدًا، فما عليك سوى التحقق من القيمة قبل تمريرها؛

function Newton
   const MAX_EXP_ARGUMENT as double = 709.782712893#

   do ....
      if (abs(var) <= MAX_EXP_ARGUMENT) then
         r = exp(var)
      else
         exit do '// exit the loop
      end if
      '//use r
   loop

   do ....

نصائح أخرى

كانت هناك مشكلة SO تم نشرها منذ فترة للتعامل معها أرقام أكبر من Long في VBA.

أشارت الإجابة المقبولة إلى رابط يسمى حساب الأعداد الكبيرة.لقد حاولت للتو تنفيذ المثال الخاص بك لـ exp(28000) باستخدام هذا المثال، لكنني تلقيت خطأ "عدم تطابق النوع" بعد معالجة بضع حلقات.ومع ذلك، قد يكون خطأي في التنفيذ المتسرع.إذا لم يكن لديك أي خيوط حتى الآن، سأبدأ من هناك.

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