المبدأ
-
هذه الطريقة خطية مرتبطة بتفكيك المصفوفة A الى مصفوفتين M وN بحيث A = M+N :
x(0) ومتجهة اعتباطية للانطلاقة.
x(k+1) = M-1b - M-1N x(k) k = 0,....
-
M هو الجزء القطري للمصفوفة A.
الخوارزم
التهيئة : x(0) اعتباطية
تكرار :
مثال
لنحل النظمة Ax=b بحيث:
و
نعطي المصفوفة (0)x
صيغة التكراريتين الأوليتين :
-
نتائج الكرة x(1) :
x(1)1 = (-19)/(-16) = 19/16
x(1)2 = 1/10
x(1)3 = 12/18 = 2/3
x(1)4 = 1/(-14) = -1/14نتائج الكرة x(2) :
x(2)1 = (-19-6(1/10)+2(2/3)+5(-1/14))/(-16) = 3911/3360
x(2)2 = (1-3(19/16)+5(2/3)-(-1/14))/10 = 283/3360
x(2)3 = (12+4(19/16)-(1/10)-2(-1/14))/18 = 2351/2520
x(2)4 = (1-(19/16)-2(1/10)-2(2/3))/(-14) = 59/480
البرمجة
#include <math.h> #include <conio.h> #define NMAX 5 #define ITERMAX 21
double al_norme_vect(double x[NMAX],int n); void sl_jacobi(double a[NMAX][NMAX],double b[NMAX],double x1[NMAX], int n,int iter,double eps,double t[NMAX][ITERMAX]);
main() { double eps; double x[NMAX],b[NMAX],sol[NMAX]; double a[NMAX][NMAX]; double t[NMAX][ITERMAX]; int i,j,n; clrscr(); printf("Méthode de Jacobi\n"); printf(" A b\n"); eps=1e-15; n=4; a[1][1]=-16;a[1][2]=6;a[1][3]=-2;a[1][4]=-5;b[1]=-19; a[2][1]=3;a[2][2]=10;a[2][3]=-5;a[2][4]=1;b[2]=1; a[3][1]=-4;a[3][2]=1;a[3][3]=18;a[3][4]=2;b[3]=12; a[4][1]=1;a[4][2]=2;a[4][3]=2;a[4][4]=-14;b[4]=1; sol[1]=53141.0/48309.0;sol[2]=9424.0/48309.0; sol[3]=14209.0/16103.0;sol[4]=7781.0/48309.0; 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]); x[i]=0; } printf("Solution exacte :\n"); for(i=1;i<=n;i++) printf("%22.16e\n",sol[i]); printf("Itérations :\n"); sl_jacobi(a,b,x,n,ITERMAX-1,eps,t); for(j=1;j<=ITERMAX-1;j++) { printf("x(%2d)= (",j); for(i=1;i<=n;i++) { x[i]=t[i][j]-sol[i]; printf("%12.6e ",t[i][j]); } printf(") err= %.3e\n",al_norme_vect(x,n)); } printf("Dernier itéré :\n"); for(i=1;i<=n;i++) printf("%22.16e\n",t[i][ITERMAX-1]); }
نتائج البرنامج
في كل كرة يظهر البرنامج:
-
الكرة x(k)
-
( والقيمة المضبوطة x(k) الفرق بين الكرة) الارتياب
A b -1.60000e+01 6.00000e+00 -2.00000e+00 -5.00000e+00 I -1.90000e+01 3.00000e+00 1.00000e+01 -5.00000e+00 1.00000e+00 I 1.00000e+00 -4.00000e+00 1.00000e+00 1.80000e+01 2.00000e+00 I 1.20000e+01 1.00000e+00 2.00000e+00 2.00000e+00 -1.40000e+01 I 1.00000e+00 Solution exacte : 1.100022770084249e+00 1.950775217868306e-01 8.823821648140098e-01 1.610672959489950e-01 Itérations : x( 1)= ( 1.18750e+00 1.00000e-01 6.66667e-01 -7.14286e-02 ) err= 3.42e-01 x( 2)= ( 1.16399e+00 8.42262e-02 9.32937e-01 1.22917e-01 ) err= 1.43e-01 x( 3)= ( 1.06406e+00 2.04980e-01 9.06994e-01 1.57022e-01 ) err= 4.49e-02 x( 4)= ( 1.10192e+00 2.18578e-01 8.74289e-01 1.63429e-01 ) err= 2.50e-02 x( 5)= ( 1.10911e+00 1.90224e-01 8.81237e-01 1.63404e-01 ) err= 1.06e-02 x( 6)= ( 1.09762e+00 1.91545e-01 8.84411e-01 1.60859e-01 ) err= 4.74e-03 x( 7)= ( 1.09851e+00 1.96835e-01 8.82067e-01 1.60681e-01 ) err= 2.37e-03 x( 8)= ( 1.10084e+00 1.95412e-01 8.81991e-01 1.61165e-01 ) err= 9.73e-04 x( 9)= ( 1.10017e+00 1.94626e-01 8.82535e-01 1.61118e-01 ) err= 5.00e-04 x(10)= ( 1.09982e+00 1.95106e-01 8.82434e-01 1.61035e-01 ) err= 2.15e-04 x(11)= ( 1.10004e+00 1.95168e-01 8.82339e-01 1.61064e-01 ) err= 1.01e-04 x(12)= ( 1.10006e+00 1.95052e-01 8.82381e-01 1.61075e-01 ) err= 4.83e-05 x(13)= ( 1.10001e+00 1.95064e-01 8.82392e-01 1.61066e-01 ) err= 2.04e-05 x(14)= ( 1.10002e+00 1.95086e-01 8.82380e-01 1.61066e-01 ) err= 1.05e-05 x(15)= ( 1.10003e+00 1.95079e-01 8.82381e-01 1.61068e-01 ) err= 4.31e-06 x(16)= ( 1.10002e+00 1.95076e-01 8.82383e-01 1.61067e-01 ) err= 2.19e-06 x(17)= ( 1.10002e+00 1.95078e-01 8.82382e-01 1.61067e-01 ) err= 9.62e-07 x(18)= ( 1.10002e+00 1.95078e-01 8.82382e-01 1.61067e-01 ) err= 4.41e-07 x(19)= ( 1.10002e+00 1.95077e-01 8.82382e-01 1.61067e-01 ) err= 2.16e-07 x(20)= ( 1.10002e+00 1.95077e-01 8.82382e-01 1.61067e-01 ) err= 8.96e-08 Dernier itéré : 1.100022710761683e+00 1.950774690066719e-01 8.823822059029754e-01 1.610672900557553e-01
double al_norme_vect(double x[NMAX],int n)
{
double t;
int i;
t=0;
for(i=1;i<=n;i++)
t += x[i]*x[i];
t=sqrt(t);
return(t);
}
الدالة الرئيسية sl_jacobi
- معايير الدالة
a : المصفوفة
b : العنصر الثاني
n : درجة المصفوفة
x1: متجهة البداية
iter: عدد مرات التكرار
eps: الدقة المعطاة
t: جدول مثلثي
القيمة الرجعية
ترجع الدالة القيم المكررة لطريقة يعقوبي في الجدول t.
تساوي الثابتة NMAX البعد القصوي للمصفوفة زائد 1، وتساوي الثابتة ITERMAX القيمة القصوى لعدد مرات التكرار زائد 1.
void sl_jacobi(double a[NMAX][NMAX],double b[NMAX],double x1[NMAX],
int n,int iter,double eps,double t[NMAX][ITERMAX])
{
int i,j,k;
double alfa,s;
double x2[NMAX];
for(i=1;i<=n;i++)
for(j=1;j<=ITERMAX-1;j++)
t[i][j]=0.0;
alfa=1.0;
k=1;
while(k<=iter && alfa>eps)
{
for(i=1;i<=n;i++)
{
s=b[i];
for(j=1;j<=n;j++)
if(i!=j)
s -= a[i][j]*x1[j];
x2[i]=s/a[i][i];
}
alfa=0.0;
for(i=1;i<=n;i++)
{
alfa+=pow(x2[i]-x1[i],2);
x1[i]=x2[i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=ITERMAX-2;j++)
t[i][j]=t[i][j+1];
t[i][ITERMAX-1]=x1[i];
}
k++;
}
}