📄 newton.cpp
字号:
#include<iostream.h>
#include"matrix.h"//矩阵的有关运算
int const n1=2;
double f(double *x);//目标函数;
void g(double *x,double *y);//目标函数的梯度;
void main()
{
int i;
double x0[n1],x1[n1],g0[n1],g1[n1],H[n1][n1],h[n1][n1],p[n1],f0,f1,temp,e;
x0[0]=0;x0[1]=0;e=0.01;H[0][0]=2;H[0][1]=-1;H[1][0]=-1;H[1][1]=2;
f0=f(x0);
g(x0,g0);
matrix_inv(H,h);
matrix_mul(h,g0,p);
//matrix_minus(x0,p,x1);
for(i=0;i<n1;i++)
x1[i]=x0[i]-p[i];
g(x1,g1);
f1=f(x1);
temp=g1[0]*g1[0]+g1[1]*g1[1];
while(temp>e)
{
for(i=0;i<n1;i++)
{
x0[i]=x1[i];
g0[i]=g1[i];
}
f0=f1;
//matrix_inv(H,h);
matrix_mul(h,g0,p);
//matrix_minus(x0,p,x1);
for(i=0;i<n1;i++)
x1[i]=x0[i]-p[i];
g(x1,g1);
f1=f(x1);
temp=g1[0]*g1[0]+g1[1]*g1[1];
}
cout<<"当X取X("<<x1[0]<<","<<x1[1]<<")时,Min(f(X)="<<f(x1)<<endl;
}
double f(double *x)
{
return 60-10*x[0]-4*x[1]+x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
}
void g(double *x,double *y)
{
y[0]=2*x[0]-x[1]-10;
y[1]=2*x[1]-x[0]-4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -