أنت هنا:برمجها»التحليل الرقمي»الإستكمال»طريقة نيوتن
طريقة نيوتن طريقة نيوتن
قيم الموضوع
(1 تصويت)

 
 

مصطلحات
العربية: طريقة نيوتن
الإنجليزية: Newton Method
الفرنسية: Methode de Newton

المبدأ

نحسب حدودية الاستكمال Pn(x) تحت صيغة تآلفية الخطية لحدودية:

Pn(x) = D0,0 + (x-x0)D0,1 + (x-x0)(x-x1)D0,2 +... + (x-x0)...(x-xn-1)D0,n

عوامل Di,j هي الفوارق المقسمة، محسوبة بالترجع.


الخوارزم

حساب الفوارق المقسمة

نهيئ أولا ما يلي:

 Di,i = yi,     i = 0,... n

تكرار

حساب حدوديات الاستكمال

b0(x) = D0,n

b1(x) = D0,n-1 + b0(x) (x-xn-1)

b2(x) = D0,n-2 + b1(x) (x-xn-2)

....
....

bn-1(x) = D0,1 + bn-2(x) (x-x1)

bn(x) = D0,0 + bn-1(x) (x-x0)             Pn(x) = bn(x)


مثال

نعتبر حدودية الاستكمال P(x)  بحيث:

P(0) = 0, P(1)=3, P(3)=5, P(9/2)=4, P(5)=3

احسب قيمةP(x)  في 20 نقطة متباعدة بنفس المسافة من المجال [0, 5]

حساب P(2)

x0=0, x1=1, x2=3, x3=9/2, x4=5
y0=0, y1=3, y2=5, y3=4, y4=3

D
0,0 = y0 = 0
D1,1 = y1 = 3
D2,2 = y2 = 5
D3,3 = y3 = 4
D4,4 = y4 = 3
D0,1 = (3-0)/(1-0) = 3
D1,2 = (5-3)/(3-1) = 1
D2,3 = (4-5)/(9/2-3) = -2/3
D3,4 = (3-4)/(5-9/2) = -2
D0,2 = (1-3)/(3-0) = -2/3
D1,3 = (-2/3-1)/(9/2-1) = -10/21
D2,4 = (-2-(-2/3))/(5-3) = -2/3
D0,3 = (-10/21-(-2/3))/(9/2-0) = 8/189
D1,4 = (-2/3-(-10/21))/(5-1) = -1/21
D0,4 = (-1/21-8/189)/(5-0) = -17/945
b0(2) = -17/945
b1(2) = (-17/945)*(2-9/2)+8/189 = 11/126
b2(2) = (11/126)*(2-3)-2/3 = -95/126
b3(2) = (-95/126)*(2-1)+3 = 283/126
b4(2) = (283/126)*(2-0)+0 = 283/63
P(2) = b4(2) = 283/63

البرمجة

#include <math.h>
#include <conio.h>
#define NMAX 5

void it_tabdifdiv(int n,double x[NMAX],double f[NMAX],double d[NMAX][NMAX]);
double it_pol_difdiv(int n,double d[NMAX][NMAX],double x[NMAX],double alpha);

main()
{
 double alpha,ord;
 int i,j;
 double x[NMAX],f[NMAX];
 double d[NMAX][NMAX];
 clrscr();
 printf("Méthode de Newton\n");
 x[0]=0;x[1]=1;x[2]=3;x[3]=4.5;x[4]=5;
 f[0]=0;f[1]=3;f[2]=5;f[3]=4;f[4]=3;
 it_tabdifdiv(4,x,f,d);
 printf("Tableau des différences divisées\n");
 for(i=0;i<=4;i++)
 {
  for(j=0;j<=4-i;j++)
   printf("%14.5e",d[i][j]);
  printf("\n");
 }
 printf("Calcul du polynôme d'interpolation\n");
 for(j=0;j<=20;j++)
 {
  alpha=0.25*j;
  ord=it_pol_difdiv(4,d,x,alpha);
  printf("x =%6.2f     y =%24.17e\n",alpha,ord);
 }
}

نتيجة البرنامج

البرنامج يظهر جدول الفوارق المقسمة ثم حساب: قيمة المتغير وقيمة الملائمة لحدودية الاستكمال.

جدول الفوارق المقسمة
    0.0000e+00    3.0000e+00   -6.6667e-01    4.2328e-02   -1.7989e-02
    3.0000e+00    1.0000e+00   -4.7619e-01   -4.7619e-02
    5.0000e+00   -6.6667e-01   -6.6667e-01
    4.0000e+00   -2.0000e+00
    3.0000e+00


حساب  دالة الاستكمال
x =  0.00     y =  0.0000000000000000e+00
x =  0.25     y =  9.3624751984126986e-01
x =  0.50     y =  1.7380952380952381e+00
x =  0.75     y =  2.4213169642857144e+00
x =  1.00     y =  3.0000000000000000e+00
x =  1.25     y =  3.4865451388888893e+00
x =  1.50     y =  3.8916666666666666e+00
x =  1.75     y =  4.2243923611111107e+00
x =  2.00     y =  4.4920634920634921e+00
x =  2.25     y =  4.7003348214285721e+00
x =  2.50     y =  4.8531746031746028e+00
x =  2.75     y =  4.9528645833333336e+00
x =  3.00     y =  5.0000000000000000e+00
x =  3.25     y =  4.9934895833333339e+00
x =  3.50     y =  4.9305555555555562e+00
x =  3.75     y =  4.8067336309523814e+00
x =  4.00     y =  4.6158730158730163e+00
x =  4.25     y =  4.3501364087301599e+00
x =  4.50     y =  4.0000000000000009e+00
x =  4.75     y =  3.5542534722222219e+00
x =  5.00     y =  3.0000000000000004e+00

الدالتين it_pol_difdiv و it_tabdifdiv


يجب إستدعاء هاتين الدالتين بشكل متتابع:

معايير الدالة it_tabdifdiv :
  • n : عدد نقاط الإستكمال
    x : جدول يحتوي على أفاصيل الإستكمال
    f : جدول يحتوي على قيم f(x)i لنقاط الإستكمال
    d : جدول يضم معاملات الحدودية في البداية

    تكون النتائج في الجدول d بحيث يتم حساب الفوارق المقسمة المرتبطة بالدالة f(x)i، التي بدورها يتم تزويدها بقيم المعيار f، من أجل n+1 قيمة مختلفة للمتغير المعطى من خلال المعيار x.

معايير الدالة it_pol_difdiv:

  • n :عدد نقاط الإستكمال
    d : جدول يحتوي على معاملات حدوديات القاعدة
    x : جدول يحتوي على أفاصيل الإستكمال
    alpha : قيمة المتغير

ترجع هذه الدالة، بخصوص القيمة المعطاة للمتغير، قيمة حدودية الإستكمال المحسوبة انطلاقا من عناصر جدول الفوارق المقسمة.

الثابتة الصحيحة NMAX تساوي العدد القصوي لنقاط الإستكمال.

void it_tabdifdiv(int n,double x[NMAX],double f[NMAX],double d[NMAX][NMAX]) 
{
int i,j;
for(j=0;j<=n;j++) d[j][0]=f[j];

for(j=1;j<=n;j++)
for(i=0;i<=n-j;i++)
d[i][j]=(d[i+1][j-1]-d[i][j-1])/(x[i+j]-x[i]);
}

double it_pol_difdiv(int n,double d[NMAX][NMAX],double x[NMAX],double alpha)
{
int i;
double p;

p=d[0][n];
for(i=1;i<=n;i++)
p=p*(alpha-x[n-i])+d[0][n-i];

return(p);
}

أضف تعليقا


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

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