طريقة نيستروم طريقة نيستروم
قيم الموضوع
(0 أصوات)
 
 

مصطلحات

العربية: طريقة نيستروم
الإنجليزية: Nyström Method
الفرنسية: Méthode de Nyström
 


المبدأ

 حل رقميا   y'(x) = f(xy(x))    x  [ab]   y(a) = y0

نجزئ المجال الاندماج [a, b] إلى N مجال ذي طول يساوي h = ،
محدودة بنقط التجزيء xn = a + nh , n = 0,... N .

لكل أفصول xn، نحسب القيمة المقربة yn للقيمة الصحيحة y(xn) لدالة y.

لهدا نعتبر مستقيم ميل ( f(xn, yn المار من نقطة(xn-1, yn-1) (موازي  لمماس المنحنى التام  المار من النقطة (xn, yn)) القيمةyn+1 هي أرتوب نقطة هدا المستقيم ذي أفصولxn+1.


مثال

نعتبر مشكلة كوشي: 
مع y(0) = 1

الحل المضبوط هو :

احسب رقميا قيمy(x)   لـ x = 0, 0.1, 0.2, ..., 1  بأخد  لـ N القوى المتتالية لـ 10.

الخطوة الأولى(حساب y1) سيتم باستعمال طريقة ؤلير المتطورة.

الخطوتين الأولتين لـ N = 10

h = 1/10
x0 = 0 , y0 = 1

x1 = 1/10

الخطوة الأولى طريقة ؤلير المتطورة

y1 = y0 + h f(x0+(h/2), y0+(h/2) f(x0, y0))
     = y0 - h( y0 -(h/2)y02 )2
     = 1 - (1/10)(1-(1/20)12)2
     = 3639/4000

x2 = 2/10
y2 = y0 + 2h f(x1, y1)
     = y0 - 2h y12
     = 1 - 2(1/10)(3639/4000)2
     = 66757679/80000000


البرمجة

#include <math.h>
#include <conio.h>
double ed_f(double x,double y) { return(-y*y); }
double ed_solution(double x) { return(1.0/(1.0+x)); }
long ed_nystrom(double a,double b,double y,long n,double res[101][2]);
void ed_affichage(double a,double b,long n,long nmax,double res[101][2],int nbpts);
main() { int nbpts; long n,nmax; double a,b,y0; double res[101][2]; clrscr(); nbpts=10; a=0;b=1;y0=1; printf("Méthode de Nystr?m\n"); for(n=10;n<=10000;n*=10) { nmax=ed_nystrom(a,b,y0,n,res); ed_affichage(a,b,n,nmax,res,nbpts); printf(" taux = %.3e\n", fabs(res[nmax][1]-ed_solution(res[nmax][0]))*n*n); } }

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

  • في كل خطوة البرنامج يظهر:

  • قيمة xn

  • قيمة yn

  • الارتياب (الفرق بين yالمحسوبة والقيمة المضبوطةy(xn) )

ويظهر أيضا، لكل قيمة h، نسبة التقارب، العلاقة بين الارتياب وh2 في نقطة اعتباطية من المجال (نختار x = 1)

h =  0.1000
     xn            yn              الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0975000000000006e-01  6.59e-04
  0.2000  8.3447098749999993e-01  1.14e-03
  0.3000  7.7048163420415505e-01  1.25e-03
  0.4000  7.1574259777081883e-01  1.46e-03
  0.5000  6.6802414095141105e-01  1.36e-03
  0.6000  6.2649134719204469e-01  1.49e-03
  0.7000  5.8952585933011048e-01  1.29e-03
  0.8000  5.5698319942826369e-01  1.43e-03
  0.9000  5.2747980244104153e-01  1.16e-03
  1.0000  5.0133621103161563e-01  1.34e-03
نسبة = 1.34e-01
h =  0.0100
     xn            yn              الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0909846304181841e-01  7.55e-06
  0.2000  8.3334498858948347e-01  1.17e-05
  0.3000  7.6924454563473610e-01  1.38e-05
  0.4000  7.1430045347788507e-01  1.47e-05
  0.5000  6.6668168459206234e-01  1.50e-05
  0.6000  6.2501489371619001e-01  1.49e-05
  0.7000  5.8824983072805048e-01  1.45e-05
  0.8000  5.5556960654551146e-01  1.41e-05
  0.9000  5.2632929097502856e-01  1.35e-05
  1.0000  5.0001292828105715e-01  1.29e-05
     نسبة = 1.29e-01
h =  0.0010
     xn            yn              الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0909098426961954e-01  7.52e-08
  0.2000  8.3333344916606789e-01  1.16e-07
  0.3000  7.6923090591630972e-01  1.37e-07
  0.4000  7.1428586023760565e-01  1.46e-07
  0.5000  6.6666681503825242e-01  1.48e-07
  0.6000  6.2500014675295934e-01  1.47e-07
  0.7000  5.8823543691185354e-01  1.43e-07
  0.8000  5.5555569309290365e-01  1.38e-07
  0.9000  5.2631592110111602e-01  1.32e-07
  1.0000  5.0000012546470518e-01  1.25e-07
     نسبة = 1.25e-01
h =  0.0001
     xn            yn              الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0909090984227092e-01  7.51e-10
  0.2000  8.3333333449083291e-01  1.16e-09
  0.3000  7.6923077059640355e-01  1.37e-09
  0.4000  7.1428571574361899e-01  1.46e-09
  0.5000  6.6666666814837083e-01  1.48e-09
  0.6000  6.2500000146511059e-01  1.47e-09
  0.7000  5.8823529554275089e-01  1.43e-09
  0.8000  5.5555555692765746e-01  1.37e-09
  0.9000  5.2631579078623758e-01  1.31e-09
  1.0000  5.0000000125045985e-01  1.25e-09
  نسبة = 1.25e-01

الدالة الرئيسية ed_nystrom

معايير هذه الدالة هي كالتالي:

  • a و b : حدي المجال [ab]

  • y : الشرط البدئي y0 = y(a) = y(x0)i

  • n : عدد المجالات الصغيرة (ذات الطول h)

  • res : جدول لحفظ القيم (xnyn)

تستدعي الدالة الرئيسية الدالة التالية التي يجب تعريفها في البرنامج الرئيسي أيضا:

 double ed_f(double x,double y)

 تمثل هذه الدالة الدالة الرياضية  f .

يتم حساب القيم التقريبية لـ y(x)i من خلال طريقة نيستروم. وترجع بعدد القيم (xnyn) المحفوظة (أقصى حد هو 100).

سيتم حفظ هذه القيم في الجدول res : حيث سيحتوي العمود 0 على قيم xn بينما سيمثل العمود 1 قيم yn المقابلة.

ملاحظة: تتم الخطوة الأولى بمساعدة طريقة أولير المطورة.

long ed_nystrom(double a,double b,double y,long n,double res[101][2]) { double x,h,tol,xx,exx,yy,z; long i,j; h=(b-a)/n; tol=h/2; x=a; res[0][0]=a; res[0][1]=y; j=1; z=y; for(i=1;i<=n;i++) { if(i==1) y += h*ed_f(x+h/2,y+h/2*ed_f(x,y)); else { yy=z+2*h*ed_f(x,y); z=y; y=yy; } x += h; xx=x-a; exx=floor(100*xx+0.5)/100; if(fabs(exx-xx)<tol) { res[j][0]=x; res[j][1]=y; j++; } } return(j-1); } 

 دالة الإظهار ed_affichage

معايير دالة الإظهار هي كالتالي:

  • a و b : حدي المجال [ab]
    n : عدد المجالات الصغيرة (ذات الطول h)
    nmax : العدد الأقصى للقيم المحتفظ بها
    res : جدول يحفظ القيم (xnyn)
    nbpts : عدد القيم المسموح لها بالإظهار على الشاشة

وهي بدورها تستدعي الدالة التالية:

 double ed_solution(double x)

 التي يجب أن تعرف في البرنامج الرئيسي وتعطى الحل الحقيقي لـ  y.

ستقوم دالة الإظهار بإظهار جزئي للقيم (nbpts قيمة كأقصى حد) المحفوظة في الجدول res. وتظهر أيضا نسبة الخطأ، أي الفرق بينالقيمة الحقيقية y(xn)i للحل y(x)i والقيمة المقربة لـ yn.

void ed_affichage(double a,double b,long n,long nmax,double res[101][2],int nbpts)
{
double h,x;
long i;
h=(b-a)/n;
printf("h = %.4f\n",h);
printf(" xn yn Erreur\n");
if(nmax<nbpts)
for(i=0;i<=nmax;i++)
printf("%8.4f %.17e %.3e\n", res[i][0],res[i][1],fabs(ed_solution(res[i][0])-res[i][1]));
else
{
for(i=0;i<=nmax;i++)
{
x=floor(res[i][0]*nbpts+0.5)/nbpts;
if(fabs(x-res[i][0])<0.005)
printf("%8.4f %.17e %.3e\n", x,res[i][1],fabs(ed_solution(res[i][0])-res[i][1]));
}

}
}

أضف تعليقا


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

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