ریشهیابی یعنی یافتنِ x که مقدارِ تابع در آن صفر شود؛ این پرسش با کمینهکردنِ زیان یا بررسیِ یک پاسخِ آماده فرق دارد. روشِ نیوتن ممکن است روی یک تابعِ ساده بچرخد. نصفسازی هم فقط با قراردادِ درستِ دامنه، پیوستگی و علامتِ دو سرِ بازه، معنای موردنظر را دارد.
یک تابع، دو شروع متفاوت
تابعِ اصیلِ تمرین f(x)=x³−۲x+۲ است و مشتقش۳x²−۲. در نیوتن، مقدارِ بعدی از x−f(x)/f′(x) میآید. از صفر شروع میکنیم: f(۰)=۲ و مشتق−۲ است، پس گامِ بعدی۱ میشود. در۱، مقدارِ تابع۱ و مشتق۱ است؛ گامِ بعد دوباره صفر است.
کد این رابطه را شش بار با Fraction اجرا میکند و مسیرِ صفر،یک،صفر،یک،صفر،یک،صفر را واقعاً به دست میآورد. این چرخه پاسخِ حلشده نیست و وضعیتِ اجرا budget_exhausted است. از آن نتیجه نمیگیریم همهٔ شروعها یا همهٔ تابعها همین رفتار را دارند.
نصفسازی چه چیزی را حفظ میکند؟
برای همان تابع، بازهٔ آغازینِ [−۲،−۱] را میگیریم. مقدارِ دو سر، علامتِ مخالف دارد و چندجملهای روی بازه پیوسته است. در هر گام، نقطهٔ میانی را حساب میکنیم و نیمهای را نگه میداریم که دو سرش همچنان علامتِ مخالف دارند. دفترِ اجرا قبل و بعدِ بازه، مقدارِ میانی و عرض را مینویسد.
بعد از هشت گام، بازهٔ دقیق [−۴۵۳/۲۵۶،−۱۱۳/۶۴] و عرض۱/۲۵۶ است. تلورانسِ انتخابیِ این اجرا۱/۵۱۲ است؛ پس هنوز شرطِ عرض برآورده نشده و خروجی با برچسبِ پایانِ بودجه گزارش میشود. کوچکشدنِ بازه را نباید به «تلورانس پاس شد» ترجمه کنیم.
سه علتِ توقف را یکی نکنیم
اگر مقدارِ تابع در یک سرِ بازه دقیقاً صفر باشد، endpoint_root میگیریم؛ مثالِ x−۱ روی [۱،۲] همین حالت است. اگر مقدارِ میانی صفر شود، exact_root داریم. اگر عرض به حدِ تعیینشده برسد، width_tolerance است؛ اجرای جداگانهٔ x²−۲ روی [۱،۲] با سقف۱۶گام و تلورانس۱/۱۰۲۴، این وضعیت را واقعاً آزموده است.
تمامشدنِ سقفِ گام، وضعیتِ دیگری است. یک تابعِ فراخوانیکننده باید این وضعیت را ببیند، نه اینکه صرفِ دریافتِ یک عدد یا بازه را موفقیت بنامد. این تمرین، رفتارِ توقفِ خودش را روشن میکند و اجرای SciPy نیست.
تغییرِ علامت بدونِ پیوستگی کافی نیست
تابعِ ۱/x روی [−۱،۲] شاهدِ جداگانهای است. در صفر تعریف نشده و روی تمامِ بازه پیوسته نیست. مسیرِ انتخابشدهٔ هشت گام به صفر نزدیک میشود، اما هیچ نقطهٔ میانی ریشه نیست؛ آخرین مقدارِ تابع−۲۵۶ است. بازهٔ نهایی [−۱/۲۵۶،۱/۱۲۸] هنوز دورِ ناپیوستگی قرار دارد.
در نتیجه حفظِ علامتِ دو سر، در این مثالِ بدونِ پیششرطِ پیوستگی، ریشه تولید نمیکند. کد root_claimed=false را صریح ثبت کرده است. اگر تابع در میانی تعریفنشده شود، آن هم مسئلهای برای ارزیابیِ دامنه است؛ تغییرِ علامت مجوزِ نادیدهگرفتنِ آن نیست.
خطا و کرانِ محلی را ببینیم
بازهٔ معکوس، نبودِ علامتِ مخالف، تلورانسِ صفر، سقفِ بولین و خروجیِ نامتناهی در پنج آزمون رد میشوند. ورودیِ نصفسازی در این فایل صحیح یا کسری، دو سر با قدرمطلقِ حداکثر۱۰۰ و سقفِ ۱تا۳۲گام است. مقدارِ تابع هم باید کسری یا صحیح و کراندار باشد؛ این قراردادِ محلی، حلگرِ عمومیِ همهٔ توابع نیست.
یک اجرای جداگانهٔ نیوتن برای x²−۲ از صفر، مشتقِ صفر را با وضعیتِ zero_derivative متوقف میکند. گرادیانِ کاهشی مقدارِ یک هدف را کاهش میدهد و جایگذاریِ پاسخِ ریاضی جوابِ پیشنهادی را میسنجد؛ اینجا خودِ فرایندِ ریشهیابی و قراردادِ توقف را اجرا کردهایم. ادامه در مبانی هوش مصنوعی، بدونِ وعدهٔ همگراییِ عمومی یا قابلیتِ تأییدنشدهٔ محصول.
فایل تمرین و منبع
کد مستقلِ تمرین و کنترلها؛ Python · ورودیها و تمام خروجی واقعیِ همین تمرین؛ JSON
- مستندات رسمی SciPy۱٫۱۸،bisect؛ پیوستگی،علامتِ مخالف و قراردادِ توقف؛ SciPy اجرا نشده است
- مستندات رسمی SciPy۱٫۱۸،newton؛ مشتق و محدودیتِ تضمینِ ریشه از توقف؛ مثالِ کسریِ این صفحه مستقل است
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.