سؤال

FindRoot[
 27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x] == 0
 , 
 {x, 0.000001}
]

يتقارب إلى الحل {x -> -0.0918521} ولكن كيف يمكنني جعل Mathematica يتجنب رسالة الخطأ التالية قبل الحل:

FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>

أنا أستخدم FindRoot لحل بعض التعبيرات الفوضوية جدًا.أحيانًا أتلقى أيضًا الخطأ التالي، على الرغم من أن Mathematica ستظل تقدم إجابة، لكنني أتساءل عما إذا كانت هناك طريقة لتجنب ذلك أيضًا:

FindRoot::lstol: The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the merit function. You may need more than MachinePrecision digits of working precision to meet these tolerances. >> 
هل كانت مفيدة؟

المحلول

الحل الذي تحصل عليه ليس هو الحل الفعلي.تشير الرسالة إلى وجود خطأ ما و FindRoot إرجاع القيمة الأخيرة لـ x.هذا هو العنصر الأخير ضمن "مزيد من المعلومات" لـ FindRoot:

  • إذا لم ينجح FindRoot في إيجاد حل للدقة التي تحددها داخل MaxIterations الخطوات، تقوم بإرجاع أحدث تقريب للحل الذي تم العثور عليه.يمكنك بعد ذلك تطبيق FindRoot مرة أخرى، مع هذا التقريب كنقطة بداية.

على سبيل المثال، في هذه الحالة أيضًا لا يوجد حل:

FindRoot[x^2 + 1 == 0, {x, 1}]

سوف تحصل على FindRoot::jsing تحذير و الرياضيات عائدات {x -> 0.} (وهو التقريب الأحدث).

حالة مماثلة مثل هذه، ولكن مع Log وظيفة:

FindRoot[1 + Log[1 + x]^2 == 0, {x, 2}]

يعطي FindRoot::nlnum على غرار ما تراه والعودة {x -> 0.000269448} (وهو أحدث تقريب في هذه الحالة).

هذه مؤامرة لنفس الوظيفة، لأغراض التوضيح:

Mathematica graphics

إذا كنت تريد تضمين جذور معقدة، ففكر في هذا الجزء من الوثائق الخاصة بـ FindRoot (ضمن "مزيد من المعلومات" أيضًا):

  • يمكنك دائمًا إخبار FindRoot بالبحث عن الجذور المعقدة عن طريق إضافة 0.I إلى قيمة البداية.

لذا، على سبيل المثال، يمكنك أخذ قيمة ابتدائية بالقرب من جذر مركب واحد، كما يلي:

FindRoot[x^2 + 1 == 0, {x, 1 + 1. I}]

الذي يتقارب (بدون رسائل) ل {x -> 8.46358*10^-23 + 1. I} (لذلك في الأساس I).

أو بقيمة بداية بالقرب من الجذر المعقد الآخر:

FindRoot[x^2 + 1 == 0, {x, 1 - 1. I}]

سوف تحصل على الأساس -I (على وجه الدقة تحصل عليه {x -> 8.46358*10^-23 - 1. I}).

نصائح أخرى

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

أدخل وصف الصورة هنا

تحذرك ماثيماتيكا من هذا: Genacodicetagpre

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