|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
算法源代码:
用变尺度法求函数 + 的最小值
#include<stdio.h>
void dpfmethod(float a,float b,float m)
{
static float H[2][2]={1,0,0,1};
float x[2];
x[0]=a,x[1]=b;
float c;
c=4*(x[0]-5)*(x[0]-5)+(x[1]-6)*(x[1]-6);
float df[2];
df[0]=8*(x[0]-5);
df[1]=2*(x[1]-6);
float hdf[2];
hdf[0]=(H[0][0]*df[0]+H[0][1]*df[1]);
hdf[1]=(H[1][0]*df[0]+H[1][1]*df[1]);
float namu=(-8*x[0]*hdf[0]+40*hdf[0]-2*hdf[1]*x[1]+12*hdf[1])/(8*hdf[0]*hdf[0]+2*hdf[1]*hdf[1]);
float G[2];
G[0]=(-8*namu*hdf[0]);
G[1]=(-2*namu*hdf[1]);
float k=m;
if(df[0]*df[0]+df[1]*df[1]<=k){printf("最小值点是x1=%f,x2=%f\n",x[0],x[1]);
printf("此时原函数的值为%f\n",c);
getchar();}
else {
x[0]+=namu*hdf[0];
x[1]+=namu*hdf[1];
H[0][0]+=namu*hdf[0]*namu*hdf[0]/(G[0]*namu*hdf[0]+G[1]*namu*hdf[1])-((H[0][0]*G[0]+H[0][1]*G[1])*G[0]*H[0][0]+(H[0][0]*G[0]+H[0][1]*G[1])*G[1]*H[1][0])/(G[0]*(G[0]*H[0][0]+G[1]*H[1][0])+G[1]*(G[0]*H[0][1]+G[1]*H[1][1]));
H[0][1]+=namu*hdf[0]*namu*hdf[1]/(G[0]*namu*hdf[0]+G[1]*namu*hdf[1])-((H[0][0]*G[0]+H[0][1]*G[1])*G[0]*H[0][1]+(H[0][0]*G[0]+H[0][1]*G[1])*G[1]*H[1][1])/(G[0]*(G[0]*H[0][0]+G[1]*H[1][0])+G[1]*(G[0]*H[0][1]+G[1]*H[1][1]));
H[1][0]+=namu*hdf[1]*namu*hdf[0]/(G[0]*namu*hdf[0]+G[1]*namu*hdf[1])-((H[1][0]*G[0]+H[1][1]*G[1])*G[0]*H[0][0]+(H[1][0]*G[0]+H[1][1]*G[1])*G[1]*H[1][0])/(G[0]*(G[0]*H[0][0]+G[1]*H[1][0])+G[1]*(G[0]*H[0][1]+G[1]*H[1][1]));
H[1][1]+=namu*hdf[1]*namu*hdf[1]/(G[0]*namu*hdf[0]+G[1]*namu*hdf[1])-((H[1][0]*G[0]+H[1][1]*G[1])*G[0]*H[0][1]+(H[1][0]*G[0]+H[1][1]*G[1])*G[1]*H[1][1])/(G[0]*(G[0]*H[0][0]+G[1]*H[1][0])+G[1]*(G[0]*H[0][1]+G[1]*H[1][1]));
dpfmethod(x[0],x[1],k);
}
}
void main(){
printf("********************* result area *************************\n");
printf("\n");
printf("使用DFP法求函数4(x1-5)^2+(x2-6)^2的最小值\n");
printf("输入x1,x2的初值,以及精度m\n");
float a,b,m;
scanf("%f%f%f",&a,&b,&m);
dpfmethod(a,b,m);
getchar();
}
|
|