طريقة رونج كوطا ذات الرتبة 4
طريقة رونج كوطا ذات الرتبة 4
 Range-kutta
 

مصطلحات
العربية: طريقة رونج كوطا ذات الرتبة 4
الإنجليزية: Runge Kutte Method
الفرنسية: Méthode de Runge Kutta d'ordre 4

المبدأ

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

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

لهدا نبدل ميل المماس f(xn, yn) بمتوسط cefficientée لهدا الميل مع 3 قيمة مصححة على التوالي في 3 نقط من المجال [xnxn+1] في صيغة ؤلير.


الخوارزم

 


مثال

نعتبر مشكلة كوشي:
لتكن    علما أن y(0) = 1
الحل المضبوط هو : 
احسب رقميا قيمy(x)   لـ x = 0, 0.1, 0.2, ..., 1  بأخد  لـ N القوى المتتالية لـ 10.
الخطوتين الأولتين لـ N = 10

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

x1 = 1/10
k1 = f(x0, y0))
    = -y02
    = -12
    = -1
k2 = f(x0+(h/2), y0+h(k1/2))
    = -(y0+h(k1/2))2
    = -(1+(1/10)(-1/2))2
    = -361/400
k3 = f(x0+(h/2), y0+h(k2/2))
    = -(y0+h(k2/2))2
    = -(1+(1/10)(-361/800))2
    = -58354321/64000000
k4 = f(x0+h, y0+hk3)
    = -(y0+hk3)2
    = -(1+(1/10)(-58354321/64000000))2
    = -(581645679/640000000)2
y1 = y0 +(h/6)(k1+2k2+2k3+k4)
    = 1+(1/60)( -1-2(361/400)-2(58354321/64000000)-(581645679/640000000)2)


البرمجة

#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_runge_kutta(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 Runge-Kutta\n"); for(n=10;n<=1000;n*=10) { nmax=ed_runge_kutta(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]))*pow(n,4)); } }

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

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

  • قيمة xn

  • قيمة yn

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

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

h =  0.1000
     xn              yn            الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0909118633221964e-01  2.77e-07
  0.2000  8.3333372884307211e-01  3.96e-07
  0.3000  7.6923120575328652e-01  4.37e-07
  0.4000  7.1428615389276151e-01  4.40e-07
  0.5000  6.6666709106586264e-01  4.24e-07
  0.6000  6.2500040094917386e-01  4.01e-07
  0.7000  5.8823566858083909e-01  3.74e-07
  0.8000  5.5555590318321424e-01  3.48e-07
  0.9000  5.2631611126425815e-01  3.22e-07
  1.0000  5.0000029758023101e-01  2.98e-07
   نسبة = 2.98e-03 
h =  0.0100
     xn              yn            الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0909090911944701e-01  2.85e-11
  0.2000  8.3333333337395810e-01  4.06e-11
  0.3000  7.6923076927553513e-01  4.48e-11
  0.4000  7.1428571433074217e-01  4.50e-11
  0.5000  6.6666666671009622e-01  4.34e-11
  0.6000  6.2500000004099976e-01  4.10e-11
  0.7000  5.8823529415591624e-01  3.83e-11
  0.8000  5.5555555559106540e-01  3.55e-11
  0.9000  5.2631578950654223e-01  3.29e-11
  1.0000  5.0000000003037637e-01  3.04e-11
   نسبة= 3.04e-03
h =  0.0010
     xn              yn            الارتياب
  0.0000  1.0000000000000000e+00  0.00e+00
  0.1000  9.0909090909091184e-01  2.81e-15
  0.2000  8.3333333333333726e-01  4.03e-15
  0.3000  7.6923076923077394e-01  4.83e-15
  0.4000  7.1428571428571919e-01  5.05e-15
  0.5000  6.6666666666667118e-01  4.66e-15
  0.6000  6.2500000000000422e-01  4.38e-15
  0.7000  5.8823529411765119e-01  4.30e-15
  0.8000  5.5555555555555947e-01  4.10e-15
  0.9000  5.2631578947368829e-01  4.27e-15
  1.0000  5.0000000000000366e-01  3.83e-15
   نسبة = 3.83e-03

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

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

  • 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_runge_kutta(double a,double b,double y,long n,double res[101][2]) 
{
double x,h,k1,k2,k3,k4,tol,xx,exx;
long i,j;
h=(b-a)/n;
tol=h/2;
x=a;
res[0][0]=a;
res[0][1]=y;
j=1;

for(i=1;i<=n;i++)
{
k1=ed_f(x,y);
k2=ed_f(x+h/2,y+h*k1/2);
k3=ed_f(x+h/2,y+h*k2/2);
k4=ed_f(x+h,y+h*k3);
y += h*(k1+2*k2+2*k3+k4)/6;
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]));
}

}
}

التعليقات   

 
Waldo
0 # Waldo 2017-04-25 23:43
I every time spent my half an hour to read this weblog's articles or reviews all the time along
with a cup of coffee.

Here is my page: overnight delivery australia (kewvineyards.com)
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
Thao
0 # Thao 2017-04-25 16:28
I was looking through some of your articles on this internet site and
I believe this website is very informative! Continue posting.


Feel free to visit my web page - Сайт
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
Louie
0 # Louie 2017-04-14 01:55
This is a very good tip particularly to those new
to the blogosphere. Simple but very accurate info? Thanks for sharing this one.
A must read post!

Feel free to visit my web site: приведенная ссылка
(geschenkefuermaenner.info)
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير
 
 
# Guest 2015-06-17 05:53
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-06-15 10:34
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-06-12 16:07
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-06-04 11:07
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-05-22 00:23
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-05-14 11:32
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-04-25 07:55
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-04-19 13:08
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-04-15 22:15
قام المدير بحذف هذا التعليق
 
 
# Guest 2015-03-20 21:42
قام المدير بحذف هذا التعليق
 

أضف تعليق


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

المزيد في هذه الفئة :


Go to top