الفرنسية: 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);
}
}
}