الفرنسية : Méthode de Steffensen
المبدأ
ننشئ متتالية {xn}، باستعمال الصيغة المحصل عليها باستبدال طريقة نيوتن رابسون f '(xn) بالمقاربة ، ميل القاطعة يمر بالنقط (xn+ f(xn), f(xn+ f(xn))) و(xn, f(xn))
الخوارزم
تهيئ: ليكن x0 مجاور لـ .
الكرة:
باعتبار أن : g(x) = f(x)+x
( النهاية إذن ) n = 0,...
مثال
نعتبر المعادلة : f(x) = (x+3)/(x-1) - x + 2 = 0
هذه المعادلة تقبل جذرين هما : 2 + و 2 -
حساب رقمي للجذر السالب، نعتبر نقطة الانطلاق x0 = 0 .
الكرتان الأوليتان
f(x0) = f(0) = (0+3)/(0-1) - 0 + 2 = -1
g(x0) = f(x0) + x0 = -1 + 0 = -1
g(g(x0)) = g(-1) = f(-1) + (-1) = (-1+3)/(-1-1) - (-1) + 2 +(-1) = 1
x1 = (g(g(x0))x0 - g(x0)2)/(g(g(x0)) - 2g(x0) + x0) = ((1)(0)-(-1)2)/(1-2(-1)+0) = -1/3
f(x1) = f(-1/3) = (-1/3+3)/(-1/3-1) - (-1/3) + 2 = 1/3
g(x1) = f(x1) + x1 = 1/3 + (-1/3) = 0
g(g(x1)) = g(0) = f(0) + 0 = (0+3)/(0-1) - 0 + 2 + 0 = -1
x2 = (g(g(x1))x1 - g(x1)2)/(g(g(x1)) - 2g(x1) + x1) = ((-1)(-1/3)-(0)2)/(-1-2(0)+(-1/3)) = -1/4
البرمجة
#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_g(double x) { return(eq_f(x)+x); }
void eq_steffensen(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 Steffensen\n"); x=0;eps=1e-16; er0=fabs(x-vr_rac); eq_steffensen(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 = -3.3333333333333331e-01 err = 9.73e-02 rap = 1.75e+00
x 2 = -2.5000000000000000e-01 err = 1.39e-02 rap = 1.47e+00
x 3 = -2.3636363636363636e-01 err = 2.96e-04 rap = 1.52e+00
x 4 = -2.3606811145510836e-01 err = 1.34e-07 rap = 1.53e+00
x 5 = -2.3606797749981720e-01 err = 2.75e-14 rap = 1.53e+00
x 6 = -2.3606797749978969e-01 err = 0.00e+00 rap = 0.00e+00
الدالة الرئيسية eq_steffensen
معايير هذه الدالة هي كالتالي:
x : يمثل القيمة البدئية x0 المخصصة لانطلاق عمل الخوارزم.
eps : الدقة المطلوبة
t : جدول ذي الدرجة ITERMAX.
تستدعي الدالة الرئيسة دالتين أخريين هما كالتالي:
double eq_f(double x)
double eq_g(double x)
يجب أن تعرفا معا في البرنامج الأساسي، حيث eq_f تمثل الدالة الرياضية f و eq_g تمثل مشتقتها.
تُرجع الدالة في الجدول t التكرارات المتتالية للخوارزم الثنائي.
الثابتة الصحيحة ITERMAX تساوي العدد القصوي للتكرارات المطلوبة (+1).
void eq_steffensen(double x,double eps,double t[ITERMAX])
{
double y,err,den1,den2,den3;
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++;
den1=eq_g(eq_g(x))-eq_g(x);
den2=eq_g(x)-x;
if((den1!=0) && (den2!=0))
{
den3=1.0/den1-1.0/den2;
if(den3!=0)
{
y=eq_g(x)+1.0/den3;
err=y-x;
x=y;
t[n]=x;
}
else stop=1;
}
else stop=1;
}
}