声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1956|回复: 0

[C/C++] 变尺度法求最小值,跪求大哥大姐们改正

[复制链接]
发表于 2012-4-7 17:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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();
                }


回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-11 12:30 , Processed in 0.139686 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表