题目:
用共轭梯度法求解 的极小值, 。
要求: 1、需编写一维搜索方法(进退法、黄金分割法);
2、在使用共轭梯度法梯度法进行搜索时可以调用一维搜索方法。
程序:
//*****************************************************************************
//function: min f=x1*x1+x2*x2-x1*x2-10*x1-4*x2+60
//eps=0.001
//method:gradient
//*****************************************************************************
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//原函数
#define f(x1,x2) x1*x1+x2*x2-x1*x2-10*x1-4*x2+60
//梯度模
#define tdm(x1,x2) sqrt((2*x1-x2-10)*(2*x1-x2-10)+(2*x2-x1-4)*(2*x2-x1-4))
//x1 的偏导数
#define G1(x1,x2) 2*x1-x2-10
//x2 的偏导数
#define G2(x1,x2) 2*x2-x1-4
//一维搜索
//进退法求搜索区间
const float eps=0.001;
//eps 为计算精度;
double HJFC(double x1[],double s1[])
{
int k=1,i,j;
double a0=1,b0=0.5,a1,b1,a[3],f[3],y[3][2],m,n,ak2,c;
//a0 为初始步长,b0 为初始步长增量;a1,b1 为进退法确定的最终区间;
a[0]=a0;
a[1]=a0+b0;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
y[i][j]=x1[j]+a[i]*s1[j];
for(i=0;i<2;i++)