مصطلحات
العربية: طريقة جوردن
الإنجليزية: Jordan Method
الفرنسية: Méthode de Jordan
المبدأ
-
تستعمل هذه الطريقة نفس مبدأ طريقة جوص ولكن في المرحلة K في الجدول (A(k) | b(k)), ، نقوم بتأليفة خطية لسطر lk ، ليس فقط مع السطور li (بحيث i = i+1,... n) ولكن مع السطور li (بحيث i = 1,... i-1) بحيث تنعدم فيها العناصر غير القطرية للعمود ke المنتمي إلى المصفوفة A(k)، وهذا ما يجعل المصفوفة قطرية.
-
نحل بعد ذلك النظمة القطرية.
الخوارزم
المرحلة 1: التحويل القطري للمصفوفة A، أي تحويل النظمة إلى نظمة مكافئة لمصفوفة قطرية.
A(1) = A, b(1) = b.
المرحلة 2 : لنحل النظمة القطرية A(n+1) x = b(n+1)
مثال
لنحل النظمة Ax=b بحيث:
و
حل يدوي (باستعمال الكسر)
المرحلة 1: التحويل القطري للمصفوفة A
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
المرحلة 2: حل النظمة القطرية A(5)x = b(5)
البرمجة
-
#include <math.h> #include <conio.h> #define NMAX 5 #define N2MAX 6
int sl_jordan_aff(double a[NMAX][NMAX],double b[NMAX],int n);
main() { double a[NMAX][NMAX],b[NMAX]; int i,j,n,err; clrscr(); n=4; printf("Méthode de Jordan\n"); a[1][1]=8;a[1][2]=-4;a[1][3]=3;a[1][4]=7;b[1]=12; a[2][1]=4;a[2][2]=2;a[2][3]=-6;a[2][4]=4;b[2]=1; a[3][1]=-16;a[3][2]=6;a[3][3]=-2;a[3][4]=-15;b[3]=-19; a[4][1]=6;a[4][2]=10;a[4][3]=-15;a[4][4]=10;b[4]=1; printf(" A(1) b(1)\n"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%12.6e ",a[i][j]); printf("I %12.6e \n",b[i]); } err=sl_jordan_aff(a,b,n); if(err==1) { printf("Solution:\n"); for(i=1;i<=n;i++) printf("x%d =%23.16e \n",i,b[i]); } else printf("Erreur, matrice singulière"); }
النتائج
يظهر البرنامج في كل مرحلة ما يلي :
-
المصفوفة A(k)
-
العنصر الثاني b(k)
-
ويظهر بعد ذلك حل النظمة
A(1) b(1) 8.00000e+00 -4.00000e+00 3.00000e+00 7.00000e+00 I 1.20000e+01 4.00000e+00 2.00000e+00 -6.00000e+00 4.00000e+00 I 1.00000e+00 -1.60000e+01 6.00000e+00 -2.00000e+00 -1.50000e+01 I -1.90000e+01 6.00000e+00 1.00000e+01 -1.50000e+01 1.00000e+01 I 1.00000e+00 A(2) b(2) 8.00000e+00 -4.00000e+00 3.00000e+00 7.00000e+00 I 1.20000e+01 0.00000e+00 4.00000e+00 -7.50000e+00 5.00000e-01 I -5.00000e+00 0.00000e+00 -2.00000e+00 4.00000e+00 -1.00000e+00 I 5.00000e+00 0.00000e+00 1.30000e+01 -1.72500e+01 4.75000e+00 I -8.00000e+00 A(3) b(3) 8.00000e+00 0.00000e+00 -4.50000e+00 7.50000e+00 I 7.00000e+00 0.00000e+00 4.00000e+00 -7.50000e+00 5.00000e-01 I -5.00000e+00 0.00000e+00 0.00000e+00 2.50000e-01 -7.50000e-01 I 2.50000e+00 0.00000e+00 0.00000e+00 7.12500e+00 3.12500e+00 I 8.25000e+00 A(4) b(4) 8.00000e+00 0.00000e+00 0.00000e+00 -6.00000e+00 I 5.20000e+01 0.00000e+00 4.00000e+00 0.00000e+00 -2.20000e+01 I 7.00000e+01 0.00000e+00 0.00000e+00 2.50000e-01 -7.50000e-01 I 2.50000e+00 0.00000e+00 0.00000e+00 0.00000e+00 2.45000e+01 I -6.30000e+01 A(5) b(5) 8.00000e+00 0.00000e+00 0.00000e+00 -1.38778e-16 I 3.65714e+01 0.00000e+00 4.00000e+00 0.00000e+00 -5.55112e-17 I 1.34286e+01 0.00000e+00 0.00000e+00 2.50000e-01 -1.73472e-17 I 5.71429e-01 0.00000e+00 0.00000e+00 0.00000e+00 2.45000e+01 I -6.30000e+01 Solution: x1 = 4.571428571428571e+00 x2 = 3.357142857142857e+00 x3 = 2.285714285714286e+00 x4 = -2.571428571428572e+00
-
الدالة الرئيسية sl_jordan_aff
- معايير الدالة
a : المصفوفة
b : العنصر الثاني
n : درجة المصفوفة
القيمة الرجعية
ترجع القيمة 1 عندما تكون المصفوفة مقلوبة رقميا والقيمة 0 إذا كان عكس ذلك.
إذا كانت قيمة الرجوع هي 1 فسيكون الحل في الجدول b.
خلال كل كرة يتم إظهار المصفوفة Ak والعنصر الثاني bk.
تساوي الثابتة NMAX البعد القصوي للمصفوفة زائد 1، وتساوي الثابتة N2MAX القيمة NMAX+1
int sl_jordan_aff(double a[NMAX][NMAX],double b[NMAX],int n)
{
int i,j,k,err;
double pivot,coef;
double t[NMAX][N2MAX];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
t[i][j]=a[i][j];
t[i][n+1]=b[i];
}
err=1;
k=1;
while (err==1 && k<=n)
{
pivot=fabs(t[k][k]);
j=k;
while(pivot==0 && j<n)
{
j++;
pivot=fabs(t[j][k]);
}
if(pivot!=0)
{
if(j!=k)
for(i=k;i<=n+1;i++)
{
pivot=t[k][i];
t[k][i]=t[j][i];
t[j][i]=pivot;
}
pivot=t[k][k];
for(i=1;i<=n;i++)
if(i!=k)
{
coef=t[i][k]/pivot;
for(j=1;j<=n+1;j++)
t[i][j] -= coef*t[k][j];
}
printf(" A(%d) b(%d)\n",k+1,k+1);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%12.6e ",t[i][j]);
printf("I %12.6e \n",t[i][n+1]);
}
}
else err=0;
k++;
}
if(err==1)
for(i=1;i<=n;i++)
b[i]=t[i][n+1]/t[i][i];
return(err);
}