الفرنسية: Méthode des parties proportionnelles
المبدأ
ننشئ متتالية مجال [an, bn]، تضم الجدر ، بحيث an أو bn يكون تقاطع المحور الأفقي مع المستقيم المار من
(bn-1, f(bn-1)) و (an-1, f(an-1))
الخوارزم
ليكن و بحيثf(a) f(b) < 0
تهيئ:a0 = a, b0 = b
مثال
نعتبر المعادلة :f(x) = (x+3)/(x-1) - x + 2 = 0
هذه المعادلة تقبل جذرين هما : 2 + و 2 -
حساب رقمي للجذر السالب، نعتبر مجال الانطلاق a = -1 و b = 0.
الكرتان الأوليتان
f(a0) = f(-1) = (-1+3)/(-1-1) - (-1) + 2 = 2
f(b0) = f(0) = (0+3)/(0-1) - 0 + 2 = -1
c1 = (a0 f(b0)-b0 f(a0))/(f(b0)- f(a0)) = ((-1)(-1) - (0)(2))/(-1-2) = -1/3
f(c1) = f(-1/3) = (-1/3+3)/(-1/3-1) - (-1/3) + 2 = 1/3
لهما نفس الإشارة f(a0) و f(c1)
a1 = c1 = -1/3 , b1 = b0 = 0
f(a1) = f(c1) = 1/3 , f(b1) = f(b0) = -1
c2 = (a1 f(b1)-b1 f(a1))/(f(b1)- f(a1)) = ((-1/3)(-1) - (0)(1/3))/(-1-1/3) = -1/4
f(c2) = f(-1/4) = (-1/4+3)/(-1/4-1) - (-1/4) + 2 = 1/20
لهما نفس الإشارة f(a1) و f(c2)
a2 = c2 = -1/4 , b2 = b1 = 0
البرمجة
#include <math.h> #include <conio.h> #define ITERMAX 51 double eq_f(double x) { return((x+3.0)/(x-1.0)-x+2.0); }
void eq_proport(double a,double b,double eps,double t[ITERMAX]);
main() { int i; double a,b,eps,vr_rac,err,c; double t[ITERMAX]; clrscr(); vr_rac=2.0-sqrt(5.0); printf("Méthode des Parties proportionnelles\n"); a=-1.0;b=0.0;eps=1e-16; eq_proport(a,b,eps,t); for(i=1;i<ITERMAX;i++) if (t[i]!=0) { err=fabs(t[i]-vr_rac); printf("c%2d = %.17e err = %.3e",i,t[i],err); printf("\n"); } }
نتيجة البرنامج
c 1 = -3.3333333333333331e-01 err = 9.73e-02 c 2 = -2.5000000000000000e-01 err = 1.39e-02 c 3 = -2.3809523809523808e-01 err = 2.03e-03 c 4 = -2.3636363636363636e-01 err = 2.96e-04 c 5 = -2.3611111111111110e-01 err = 4.31e-05 c 6 = -2.3607427055702918e-01 err = 6.29e-06 c 7 = -2.3606889564336372e-01 err = 9.18e-07 c 8 = -2.3606811145510836e-01 err = 1.34e-07 c 9 = -2.3606799704360681e-01 err = 1.95e-08 c10 = -2.3606798035119417e-01 err = 2.85e-09 c11 = -2.3606797791580400e-01 err = 4.16e-10 c12 = -2.3606797756048536e-01 err = 6.07e-11 c13 = -2.3606797750864508e-01 err = 8.86e-12 c14 = -2.3606797750108169e-01 err = 1.29e-12 c15 = -2.3606797749997818e-01 err = 1.88e-13 c16 = -2.3606797749981720e-01 err = 2.75e-14 c17 = -2.3606797749979372e-01 err = 4.02e-15 c18 = -2.3606797749979028e-01 err = 5.83e-16 c19 = -2.3606797749978978e-01 err = 8.33e-17 c20 = -2.3606797749978972e-01 err = 2.78e-17 c21 = -2.3606797749978969e-01 err = 0.00e+00
الدالة الرئيسية eq_proport
معايير هذه الدالة هي كالتالي:
a و b: حدي المجال ]a, b[
eps : الدقة المطلوبة
t : جدول ذي الدرجة ITERMAX.
تستدعي الدالة الرئيسة دالة أخرى هي كالتالي:
double eq_f(double x)
التي يجب أن تعرف في البرنامج الأساسي وهي تمثل الدالة الرياضية f.
ترجع الدالة في الجدول t التكرارات المتتالية للخوارزم الثنائي.
الثابتة الصحيحة ITERMAX تساوي العدد القصوي للتكرارات المطلوبة (+1).
void eq_proport(double a,double b,double eps,double t[ITERMAX])
{
double c,fa,fb,fc;
int n,stop;
for(n=0;n<ITERMAX;n++)
t[n]=0;
n=0;
stop=0;
fa=eq_f(a);
fb=eq_f(b);
if(fa*fb > 0) stop=1;
if(fa==0) {t[1]=a;stop=1;}
if(fb==0) {t[1]=b;stop=1;}
while ((b-a > eps) && (stop==0) && (n < ITERMAX-1))
{
n++;
c=(a*fb-b*fa)/(fb-fa);
fc=eq_f(c);
t[n]=c;
if(fc != 0)
{
if(fa*fc > 0)
{
a=c;
fa=fc;
}
else
{
b=c;
fb=fc;
}
}
else stop=1;
}
}