أنت هنا:برمجها»التحليل الرقمي»المعادلات اللاخطية»طريقة الأجزاء المتناسبة
طريقة الأجزاء المتناسبة طريقة الأجزاء المتناسبة
قيم الموضوع
(0 أصوات)
 
 

مصطلحات
العربية: طريقة الأجزاء المتناسبة
الإنجليزية: .....
الفرنسية: Méthode des parties proportionnelles

المبدأ

ننشئ متتالية مجال [an, bn]، تضم الجدر  ، بحيث an  أو bn يكون تقاطع المحور الأفقي مع  المستقيم المار من

  (bn-1f(bn-1)) و (an-1f(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: حدي المجال ]ab[
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;
}
}

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث