Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №3. Методы Ньютона и сопряжённых градиентов.doc
Скачиваний:
67
Добавлен:
02.05.2014
Размер:
347.65 Кб
Скачать

Листинг программы метод Ньютона

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <math.h>

#define Eps 0.0001

#define x01 0

#define x02 -1

double f(double x1,double x2)

{return 20*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);}

double f1(double x1,double x2)

{return 20+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);}

double f2(double x1,double x2)

{return 0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f11(double x1,double x2)

{return 0.6*exp(0.3*x1*x1+0.3*x2*x2)+exp(0.3*x1*x1+0.3*x2*x2)*x1*x1*0.6*0.6;}

double f12(double x1,double x2)

{return 0.6*x1*0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f22(double x1,double x2)

{return exp(0.3*x1*x1+0.3*x2*x2)*0.6+exp(0.3*x1*x1+0.3*x2*x2)*0.6*0.6*x2*x2;}

double fi(int ki,double dalf,double x1,double x2,double z)

{return f(x1-dalf*z,x2);}

int main()

{double x[1000][2];

double y[2][2];

int k=0,N1,N2=0;

double y1,y2,del,det,p1,p2;

x[0][1]=x01;

x[0][2]=x02;

y1=f1(x[0][1],x[0][2]);

y2=f2(x[0][1],x[0][2]);

N1=2;

p1:

y[1][1]=f11(x[k][1],x[k][2]);

y[1][2]=f12(x[k][1],x[k][2]);

y[2][1]=y[1][2];

y[2][2]=f22(x[k][1],x[k][2]);

N2=N2+3;

det=y[1][1]*y[2][2]-y[1][2]*y[2][1];

p1=(y1*y[2][2]-y2*y[1][2])/det;

p2=(y[1][1]*y2-y[2][1]*y1)/det;

x[k+1][1]=x[k][1]-p1;

x[k+1][2]=x[k][2]-p2;

y1=f1(x[k+1][1],x[k+1][2]);

y2=f2(x[k+1][1],x[k+1][2]);

N1=N1+2;

del=pow(y1*y1+y2*y2,0.5);

k++;

if (del>Eps) goto p1;

else

{ cout<<"----------Metod Hbl0TOHA----------------"<<endl;

cout<<"\nk="<<k<<" N="<<N1+N2<<"\nx=("<<x[k][1]<<", "<<x[k][2]<<")\ny="<<f(x[k][1],x[k][2])<<endl;getch();

return 0;

}

}

Листинг программы метод Ньютона-Рафсона с оптимальным шагом

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <math.h>

#define Eps 0.0001

#define x01 1

#define x02 0

#define e 2.718281828

double f(double x1,double x2)

{return 20*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);}

double f1(double x1,double x2)

{return 20+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);}

double f2(double x1,double x2)

{return 0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f11(double x1,double x2)

{return 0.6*exp(0.3*x1*x1+0.3*x2*x2)+exp(0.3*x1*x1+0.3*x2*x2)*x1*x1*0.6*0.6;}

double f12(double x1,double x2)

{return 0.6*x1*0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

double f22(double x1,double x2)

{return exp(0.3*x1*x1+0.3*x2*x2)*0.6+exp(0.3*x1*x1+0.3*x2*x2)*0.6*0.6*x2*x2;}

double fi(int ki,double dalf,double x1,double x2,double z)

{return f(x1-dalf*z,x2);}

int main()

{double x[1000][2];

double y[2][2];

int k=0,N1,N2=0,i,l,n=10;

double y1,y2,del,det,p1,p2;

double m,a1,b1,ym1,ym2,min,ma,kan;

double dalf=1;

x[0][1]=x01;

x[0][2]=x02;

y1=f1(x[0][1],x[0][2]);

y2=f2(x[0][1],x[0][2]);

N1=2;

p1:

y[1][1]=f11(x[k][1],x[k][2]);

y[1][2]=f12(x[k][1],x[k][2]);

y[2][1]=y[1][2];

y[2][2]=f22(x[k][1],x[k][2]);

N2=N2+3;

det=y[1][1]*y[2][2]-y[1][2]*y[2][1];

p1=(y1*y[2][2]-y2*y[1][2])/det;

p2=(y[1][1]*y2-y[2][1]*y1)/det;

m=0;

ym1=f(x[k][1],x[k][2]);

N1++;

ab:

ym2=fi(k,dalf*(m+1),x[k][1],x[k][2],y1);

N1++;

if (ym2<ym1)

{m++;ym1=ym2;goto ab;}

else

{ b1=(m+1)*dalf;

if (m==0) a1=0; else a1=(m-1)*dalf;}

ma=a1+(b1-a1)/n;

min=f(x[k][1]-ma*y1,x[k][2]-ma*y2);N1++;

l=1;

for (i=2;i<=n;i++)

{ ma=a1+i*(b1-a1)/n;

kan=f(x[k][1]-ma*y1,x[k][2]-ma*y2);N1++;

if (min>kan) {min=kan;l=i;}

}

x[k+1][1]=x[k][1]-(l*(b1-a1)/n)*p1;

x[k+1][2]=x[k][2]-(l*(b1-a1)/n)*p2;

y1=f1(x[k][1],x[k][2]);

y2=f2(x[k][1],x[k][2]);

del=pow(y1*y1+y2*y2,0.5);

k++;

if (del>Eps) goto p1;

else

{cout<<"----------Metod Hbl0TOHA-PAFCOHA C OntuM waroM----------"<<endl;

cout<<"\nk="<<k<<" N="<<N1+N2<<"\nx=("<<x[k][1]<<", "<<x[k][2]<<")\ny="<<f(x[k][1],x[k][2])<<endl;

return 0;}

return 0;

getch();

return 0;

}