أنت هنا:برمجها»التحليل الرقمي»المعادلات اللاخطية»طريقة نيوتن رابسون بالنسبة لـk = 1
طريقة نيوتن-رابسون بالنسبة لـk = 1 طريقة نيوتن-رابسون بالنسبة لـk = 1
قيم الموضوع
(0 أصوات)
 
 

مصطلحات
العربية: طريقة نيوتن رابسون للحالة k = 1
الإنجليزية: Newton-Raphson Method for k = 1
الفرنسية: Méthode de Newton-Raphson pour k=1

المبدأ

تعميم لـ k كيفما كان لـطريقة نيوتن رابسون بالنسبة لـ k = 1.


الخوارزم

تهيئ: ليكن x0 مجاور لـ .

الكرة:  

x(n+1) = x(n) - [ f '(x(n))] -1 f(x(n))

أي

e(n+1) = x(n+1) - x(n)

  (    النهاية إذا )  n = 0,...


مثال

حل النظمة:

f1(x1,x2) = x13 - 3x1x22 + 1 = 0
f2(x1,x2) = 3x12x2 - x23 = 0       

الحل  المضبوط  هو:     x1 = 1/2, x2 = /2                                                      

نعتبر نقطة الانطلاق 

الكرتان الأوليتان


البرمجة

#include <math.h>
#include <conio.h>
#define NMAX 3
#define N2MAX 4
#define ITERMAX 7
void eq_cf(double x[NMAX],double f[NMAX])
{
 f[1]=x[1]*x[1]*x[1]-3*x[1]*x[2]*x[2]+1;
 f[2]=3*x[1]*x[1]*x[2]-x[2]*x[2]*x[2];
}
void eq_df(double x[NMAX],double fp[NMAX][NMAX])
{
 fp[1][1]=3*x[1]*x[1]-3*x[2]*x[2];
 fp[1][2]=-6*x[1]*x[2];
 fp[2][1]=6*x[1]*x[2];
 fp[2][2]=3*x[1]*x[1]-3*x[2]*x[2];
}

int sl_gauss_pivmax(double a[NMAX][NMAX],double b[NMAX],int n);
double al_norme_vect(double x[NMAX],int n);
void eq_newton_nlin(double x[NMAX],double eps,double t[ITERMAX][NMAX],int n);
main() { double x[NMAX],sol[NMAX],err[NMAX]; int i,j,n; double eps,er0,er1,c; double t[ITERMAX][NMAX]; clrscr(); printf("Méthode de Newton à plusieurs variables\n"); n=2; sol[1]=0.5;sol[2]=0.5*sqrt(3); x[1]=1;x[2]=1; for(j=1;j<=n;j++) err[j]=x[j]-sol[j]; er0=al_norme_vect(err,n); eps=1e-16; eq_newton_nlin(x,eps,t,n); for(i=1;i<ITERMAX;i++) if (t[i][1]!=0) { for(j=1;j<=n;j++) err[j]=t[i][j]-sol[j]; er1=al_norme_vect(err,n); printf("x(%d) = (",i); for(j=1;j<=n;j++) printf("%24.17e ",t[i][j]); printf(")\n err = %.3e",er1); if (er0!=0) { c=er1/pow(er0,2); printf(" rap = %.3e",c); } printf("\n"); er0=er1; } }

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

في كل كرة البرنامج يظهر قيمة الكرة والارتياب (أي الفرق بين الكرة والقيمة الحقيقية)

  • تحسب القيمة rap باعتبار الفرق بين خطأ الكرة الحالية وخطأ الكرة السابقة.

x(1) = (  6.6666666666666674e-01    8.3333333333333337e-01  )
    الارتياب = 1.70e-01    rap = 6.34e-01
x(2) = (  5.0869191618745457e-01    8.4109987441337830e-01  )
   الارتياب = 2.64e-02    rap = 9.15e-01
x(3) = (  4.9932999564375125e-01    8.6626917178800567e-01  )
  الارتياب = 7.13e-04    rap = 1.02e+00
x(4) = (  4.9999991136991284e-01    8.6602490315688918e-01  )
   الارتياب = 5.08e-07    rap = 1.00e+00
x(5) = (  4.9999999999995548e-01    8.6602540378469328e-01  )
    الارتياب = 2.59e-13    rap = 1.00e+00
x(6) = (  5.0000000000000000e-01    8.6602540378443860e-01  )
    الارتياب = 0.00e+00    rap = 0.00e+00

الدالة المكملة sl_gauss_pivmax

  • معايير الدالة
    a : المصفوفة
    b : العنصر الثاني
    n : درجة المصفوفة


القيمة الرجعية
ترجع القيمة 1 عندما تكون المصفوفة مقلوبة رقميا والقيمة 0 إذا كان عكس ذلك.
إذا كانت قيمة الرجوع هي 1 فسيكون الحل في الجدول b.

تساوي الثابتة NMAX البعد القصوي للمصفوفة زائد 1، وتساوي الثابتة N2MAX القيمة NMAX+1

int sl_gauss_pivmax(double a[NMAX][NMAX],double b[NMAX],int n) 
{
int i,j,k,l,err;
double max,pivot,coef,s;
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)
{
max=fabs(t[k][k]);
l=k;
for(i=k+1;i<=n;i++)
if(max<fabs(t[i][k]))
{
max=fabs(t[i][k]);
l=i;
}

if(max!=0)
{
if(l!=k)
for(j=k;j<=n+1;j++)
{
pivot=t[k][j];
t[k][j]=t[l][j];
t[l][j]=pivot;
}
pivot=t[k][k];
for(i=k+1;i<=n;i++)
{
coef=t[i][k]/pivot;
for(j=k+1;j<=n+1;j++)
t[i][j] -= coef*t[k][j];
}
}
else
err=0;
k++;
}

if(t[n][n]==0) err=0;
if(err==1)
{
b[n]=t[n][n+1]/t[n][n];
for(i=n-1;i>=1;i--)
{
s=t[i][n+1];
for(j=i+1;j<=n;j++)
s-=t[i][j]*b[j];
b[i]=s/t[i][i];
}
}
return(err);
}

الدالة المكملة al_norme_vect

  • معايير الدالة هي كالتالي:
    x : المتجهة
    n : درجة المتجهة
  •  
  • ترجع بالمنظم المتجهي الأقليدي (منظم 2 لـ Holder).
     الدالة الرئيسية eq_newton_nlin

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

eps : الدقة المطلوبة
x: يمثل القيمة البدئية x0 المخصصة لانطلاق عمل الخوارزم.
t : جدول ذي الدرجة ITERMAX*NMAX.
n: حجم النظام (عدد المتغيرات والمعادلات)


تستدعي الدالة الرئيسة دالتين أخرتين هما كالتالي:

void eq_cf(double x[NMAX],double f[NMAX])

التي تعطينا تعبيرات للدوال fو... fk

void eq_df(double x[NMAX],double fp[NMAX][NMAX])

التي تحسب المشتقات الجزئية للدول f1,... fk

يجب أن تعرف كل الدوال التابعة للنظام في البرنامج الأساسي.
تُرجع الدالة الأساسية في الجدول t التكرارات المتتالية للخوارزم نيوتن رابسون لمتغيرات عدة.

الثابتة الصحيحة ITERMAX تساوي العدد القصوي للتكرارات المطلوبة (+1).
الثابتة الصحيحة NMAX تساوي الحجم القصوي للنظام (+1).
الثابتة الصحيحة N2MAX تساوي NMAX+1.
 

void eq_newton_nlin(double x[NMAX],double eps,double t[ITERMAX][NMAX],int n) 
{
double nor;
double y[NMAX],f[NMAX],err[NMAX],fp[NMAX][NMAX];
int i,j,der,stop;

for(i=0;i<ITERMAX;i++)
for(j=0;j<NMAX;j++) t[i][j]=0;

i=0;
nor=2*eps;
stop=1;
while ((nor > eps) && (stop==1) && (i < ITERMAX-1))
{
i++;
eq_cf(x,f);
eq_df(x,fp);
stop=sl_gauss_pivmax(fp,f,n);

if(stop!=0)
{
for(j=1;j<=n;j++)
{
y[j]=x[j]-f[j];
err[j]=y[j]-x[j];
x[j]=y[j];
t[i][j]=x[j];
}
nor=al_norme_vect(err,n);
}
}
}
مقالات أخرى من نفس الفئة « طريقة القاطعة طريقة بيرستو »

أضف تعليقا


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

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