الفرنسية: 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])
التي تعطينا تعبيرات للدوال f1 و... 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);
}
}
}
