الفرنسية: Méthode de Newton-Raphson
المبدأ
أوجد بحيث f(
) = 0
ننشئ متتالية {xn}، بحيث تكون الكرة xn+1 تقاطع مع محور الأفقي للمماس في النقطة(xn, f(xn)) للتمثيل المبياني لـ f.
الخوارزم
تهيئ: ليكن x0 مجاور لـ .
الكرة:
مثال
نعتبر المعادلة :f(x) = (x+3)/(x-1) - x + 2 = 0
هذه المعادلة تقبل جذرين هما : 2 + و 2 -
حساب رقمي للجذر السالب، نعتبر نقطة الانطلاق x0 = 0 .
الكرتان الأوليتان
f '(x) = (-4)/(x-1)2 - 1
f(x0) = f(0) = (0+3)/(0-1) - 0 + 2 = -1
f '(x0) = (-4)/(0-1)2 - 1 = -5
x1 = x0 - f(x0)/f '(x0) = 0 - (-1)/(-5) = -1/5
f(x1) = f(-1/5) = (-1/5+3)/(-1/5-1) - (-1/5) + 2 = -2/15
f '(x1) = (-4)/(-1/5-1)2 - 1 = -34/9
x2 = x1 - f(x1)/f '(x1) = -1/5 - (-2/15)/(-34/9) = -4/17
البرمجة
#include <math.h> #include <conio.h> #define ITERMAX 51
double eq_f(double x) { return((x+3.0)/(x-1.0)-x+2.0); }
double eq_fp(double x) { return(-4.0/((x-1.0)*(x-1.0))-1.0); }
void eq_newton(double x,double eps,double t[ITERMAX]);
main() { int i; double x,eps,vr_rac,er0,er1,c; double t[ITERMAX]; clrscr(); vr_rac=2.0-sqrt(5.0); printf("Méthode de Newton\n"); x=0;eps=1e-16; er0=fabs(x-vr_rac); eq_newton(x,eps,t); for(i=1;i<ITERMAX;i++) if (t[i]!=0) { er1=fabs(t[i]-vr_rac); printf("x%2d = %.17e err = %.3e",i,t[i],er1); if (er0!=0) { c=er1/pow(er0,2); printf(" rap = %.3e",c); } printf("\n"); er0=er1; } }
نتيجة البرنامج
في كل كرة البرنامج يظهر قيمة الكرة والإرتياب (أي الفرق بين الكرة والقيمة الحقيقية)
تحسب القيمة rap باعتبار الفرق بين خطأ الكرة الحالية وخطأ الكرة السابقة.
x 1 = -2.0000000000000001e-01 err = 3.61e-02 rap = 6.47e-01 x 2 = -2.3529411764705882e-01 err = 7.74e-04 rap = 5.95e-01 x 3 = -2.3606762680025048e-01 err = 3.51e-07 rap = 5.86e-01 x 4 = -2.3606797749971770e-01 err = 7.20e-14 rap = 5.85e-01 x 5 = -2.3606797749978969e-01 err = 0.00e+00 rap = 0.00e+00 x 6 = -2.3606797749978969e-01 err = 0.00e+00
الدالة الرئيسية eq_newton
معايير هذه الدالة هي كالتالي:
x: يمثل القيمة البدئية x0 المخصصة لانطلاق عمل الخوارزم.
t : جدول ذي الدرجة ITERMAX.
eps : الدقة المطلوبة
تستدعي الدالة الرئيسية دالتين أخرتين هما كالتالي:
double eq_f(double x)
double eq_fp(double x)
يجب أن تعرفا معا في البرنامج الأساسي، حيث eq_f تمثل الدالة الرياضية f و eq_fp تمثل مشتقتها.
تُرجع الدالة في الجدول t التكرارات المتتالية للخوارزم الثنائي.
الثابتة الصحيحة ITERMAX تساوي العدد القصوي للتكرارات المطلوبة (+1).
void eq_newton(double x,double eps,double t[ITERMAX])
{
double y,err,der;
int n,stop;
for(n=0;n<ITERMAX;n++)
t[n]=0;
n=0;
err=2*eps;
stop=0;
while ((fabs(err) > eps) && (stop==0) && (n < ITERMAX-1))
{
n++;
der=eq_fp(x);
if(der!=0)
{
y=x-eq_f(x)/der;
err=y-x;
x=y;
t[n]=x;
}
else stop=1;
}
}