- •Лабораторная работа №3
- •Блок-схема метода Ньютона-Рафсона с оптимальным шагом
- •Метод Ньютона-Рафсона модификация 1
- •Метод Ньютона-Рафсона модификация 2
- •Метод Ньютона
- •Метод Ньютона-Рафсона с оптимальным шагом
- •Метод Ньютона-Рафсона с оптимальным шагом модификация 1
- •Метод Ньютона-Рафсона с оптимальным шагом модификация 2
- •Листинг программы метод Ньютона
- •Листинг программы метод Ньютона-Рафсона с оптимальным шагом
- •Листинг программы метод Ньютона-Рафсона с оптимальным шагом модификация 1
- •Листинг программы метод Ньютона-Рафсона с оптимальным шагом модификация 2
Листинг программы метод Ньютона
#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;
}