شرحة طريقة نيوتن رافسون وتطبيقها في لغة بايثون

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

ما هي طريقة نيوتن رافسون؟

تنص طريقة نيوتن رافسون على أنه إذا كانت النية هي تتبع الوظيفة F(x)F(x) مع التقديرات الأولية x0x0 في حالة وجودها ، يمكن العثور على القيمة الجذرية بتكرار كافٍ بدقة جيدة على النحو التالي:

x n + 1 = x n f ( x n ) f ( x n )

بهذه الطريقة ، يمكن الحصول على تقدير أولي x1وx2و…x1وx2و… وجدت أنه يزداد بشكل عام مع زيادة الدقة.

طريقة نيوتن رافسون

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

f ( x ) = f ( x + h ) f ( x h ) 2 h

بهذه الطريقة ، يمكن أن تستند العلاقة فقط على F(x)F(x)أعيد كتابتها. يستمر تنفيذ طريقة نيوتن رافسون الآن.

تطبيق طريقة نيوتن رافسون في لغة بايثون

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

استورد المكتبات اللازمة لتطبيق طريقة نيوتن رافسون في بايثون

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

[code language="python"]

import math as mt
import numpy as np
import matplotlib.pyplot as plt

[/code]

حدد وظيفة البحث عن الجذر لتنفيذ طريقة نيوتن رافسون في لغة بايثون

يجب الآن تحديد وظيفة العثور على الجذر. تتلقى هذه الوظيفة التقدير الأولي وعدد خطوات التكرار وقيمة h عند الإدخال. تعريف أو إعلان هذه الوظيفة على النحو التالي:

[code language="python"]

def NewtonRaphson(Function, x0:float, N:int=20, h:float=1e-4):

[/code]

وتجدر الإشارة إلى أنه نظرًا لأنه يمكن تحديد قيم N و h بشكل تجريبي ولا تعتمد كثيرًا على حالة الوظيفة ، فمن الأفضل تحديد قيمة افتراضية لها. الآن يمكننا تحديد الحلقة الرئيسية للدالة ، والتي تتكرر N مرة:

def NewtonRaphson(Function, x0:float, N:int=20, h:float=1e-4):
    for n in range(N):

من أجل تخزين آخر تقدير للوظيفة من الجذر ، يسمى متغير xx عرف ذلك في بداية الوظيفة ، يساوي x0x0 يكون:

def NewtonRaphson(Function, x0:float, N:int=20, h:float=1e-4):
    x = x0
    for n in range(N):

الآن يمكن تنفيذ العلاقة (الصيغة) المقابلة داخل الوظيفة:

def NewtonRaphson(Function, x0:float, N:int=20, h:float=1e-4):
    x = x0
    for n in range(N):
        x = x - Function(x) / Derivative(Function, x, h)

كما يتضح ، يتم تنفيذ العلاقة ذات الصلة في سطر الرمز أعلاه. فيما يلي مناقشة تنفيذ دالة المشتق العددي.

حدد دالة مشتقة رقمية لتنفيذ وظيفة مكتشف الجذر

وتجدر الإشارة إلى أنه لتنفيذ دالة المشتق العددي ، يجب القيام بما يلي:

def Derivative(Function, x:float, h:float):
    d = (Function(x + h) - Function(x - h)) / (2*h)
    return d

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

اعرض قيمة الوظيفة في كل خطوة لتحديد وظيفة العثور على الجذر

يمكنك الآن إظهار قيمة الوظيفة في كل خطوة داخل الوظيفة الرئيسية باستخدام أمر الطباعة:

def NewtonRaphson(Function, x0:float, N:int=20, h:float=1e-4):
    x = x0
    print(f'Iteration {0}: {x = } -- y = {Function(x)}')
    for n in range(N):
        x = x - Function(x) / Derivative(Function, x, h)
        print(f'Iteration {n+1}: {x = } -- y = {Function(x)}')

أخيرًا ، يجب إرجاع قيمة الجذر:

def NewtonRaphson(Function, x0:float, N:int=20, h:float=1e-4):
    x = x0
    print(f'Iteration {0}: {x = } -- y = {Function(x)}')
    for n in range(N):
        x = x - Function(x) / Derivative(Function, x, h)
        print(f'Iteration {n+1}: {x = } -- y = {Function(x)}')
    return x

اختبر وظيفة التجذير التي تم إنشاؤها باستخدام مثال

الآن إذا كانت الوظيفة التالية موجودة للكشف عن الجذر:

f ( x ) = 2 x x 2

للعثور على جذرها يمكن القيام بذلك على النحو التالي:

def Func1(x:float):
    return 2**x - x**2

x = NewtonRaphson(Func1, 1, N=8)

سيتم الحصول على النتائج التالية بعد التنفيذ:

Iteration 0: x = 1 -- y = 1
Iteration 1: x = 2.629445679580636 -- y = -0.726102607396632
Iteration 2: x = 1.8807152492127912 -- y = 0.145486022977461
Iteration 3: x = 2.0010646793622606 -- y = -0.00130684350311
Iteration 4: x = 2.0000000356631285 -- y = -4.3773325408e-08
Iteration 5: x = 2.0000000000000004 -- y = -8.8817841970e-16
Iteration 6: x = 1.9999999999999998 -- y = 4.44089209850e-16
Iteration 7: x = 2.0 -- y = 0.0
Iteration 8: x = 2.0 -- y = 0.0

وهكذا لوحظ أن x=2x=2 لقد وجد كجذر أن قيمة الوظيفة عند هذه النقطة تساوي تمامًا 00يكون. الآن إذا كانت نقطة البدايةx0=0x0=0 في حالة التغيير ، يتم الحصول على النتائج التالية:

ITERATION 0: X = 0 -- Y = 1
ITERATION 1: X = -1.4426950397336544 -- Y = -1.7134895362060
ITERATION 2: X = -0.8970645796858707 -- Y = -0.2677466617320
ITERATION 3: X = -0.7734702256475462 -- Y = -0.0132475754264
ITERATION 4: X = -0.7666850787387707 -- Y = -3.955810434E-05
ITERATION 5: X = -0.7666646961459681 -- Y = -3.567960371E-10
ITERATION 6: X = -0.766664695962123 -- Y = 1.11022302462E-16
ITERATION 7: X = -0.7666646959621232 -- Y = -1.110223024E-16
ITERATION 8: X = -0.766664695962123 -- Y = 1.11022302462E-16

كما يتضح ، فإن الخوارزمية x=-0.766x=-0.766لقد تقاربت. لذلك ، يلعب التقدير الأولي للجذر دورًا حاسمًا في نتيجة الخوارزمية.

اعرض نتائج طريقة نيوتن-رافسون على رسم بياني بلغة بايثون

للتحقيق في هذا ، يمكننا استخدام الأرقام بين x0=-3×0=-3 حتى ال x0=+3×0=+3 إلى الخوارزمية وشاهد نتائجها على الرسم البياني:

X0 = np.linspace(-3, +3, num=300)

X = np.zeros(300)

for i in range(300):
    X[i] = NewtonRaphson(Func1, X0[i], N=30, h=1e-5)

وهكذا ، 300 قطعة في الفترة [-3و+3][-3و+3] يتم تحديد كمية الجذور التي تم الحصول عليها في المصفوفة وداخلها XXتم حفظه. الآن يمكنك الحصول على المبلغXX من ناحية X0X0 مسحوب:

plt.scatter(X0, X, s=10, c='crimson')
plt.xlabel('x0')
plt.ylabel('x (After 20 Iteration)')
plt.show()

عند الإخراج ، سيتم الحصول على الرسم التخطيطي التالي:

اعرض نتائج خوارزمية نيوتن-رافسون على رسم بياني بلغة بايثون

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

اعرض النتائج المفلترة لخوارزمية نيوتن رافسون على مخطط في بايثون

وهكذا يلاحظ أن معظم النقاط على الجواب x=-0.766x=-0.766لقد تقاربت. بهذه الطريقة ، من خلال زيادة عدد نقاط البداية ، يمكن العثور على المزيد من الجذور. الآن إذا كانت هناك وظيفة أخرى ذات جذور أكثر:

f ( x ) = sin ( x 2 ) x

مخطط الوظيفة أعلاه هو كما يلي:

بالنسبة لهذه الوظيفة ، سيكون مخطط الإخراج لطريقة نيوتن رافسون كما يلي:

رسم تخطيطي لطريقة نيوتن رافسون لوظيفة ما

يمكن ملاحظة أنه تم العثور على جذور من -20 إلى +20. إذا كنت تريد إظهار هذه الجذور على الرسم البياني ، فقم بما يلي:

def Func2(x:float):
    return mt.sin(x**2) / x

X0 = np.linspace(-6, +6, num=400)
Y0 = np.zeros(400)

X = np.zeros(400)
Y = np.zeros(400)

for i in range(400):
    Y0[i] = Func2(X0[i])
    X[i] = NewtonRaphson(Func2, X0[i], N=60, h=1e-5)
    Y[i] = Func2(X[i])

plt.plot(X0, Y0, ls='-', lw=1.2, c='crimson', label='Function')
for x in X[Y<1e-3]:
    if x<+6 and x>-6:
        plt.plot([x, x], [-2, +2], c='teal', ls='--', lw=0.8)
plt.xlabel('x')
plt.ylabel('y')
plt.axhline(c='k')
plt.axvline(c='k')
plt.legend()
plt.show()

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

يوضح الرسم البياني أعلاه أنه تم العثور على جميع الجذور بشكل صحيح.

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