⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zs.c

📁 最优化的一系列算法
💻 C
字号:
#define MAX 2
#define ET 1e-6
#include<stdio.h>
#include<math.h>
 
main()
{
FILE *fp;
int i,j,k,count=0;
double a[MAX][MAX],b[MAX],x[MAX],g[MAX],gtemp1[MAX],gtemp2[MAX],ftemp[MAX];
double p,q,t,f,w=1,c;              /*w置1是为了控制开始的迭代*/
fp=fopen("d:/zuisu.txt","w+");

clrscr();
printf("Please input juzhen a:\n");/*输入Hesse矩阵*/
for(i=0;i<MAX;i++)
  for(j=0;j<MAX;j++)
  scanf("%lf",&a[i][j]);

printf("Please input  juzhen b:\n");/*输入一次项系数矩阵b*/
for(i=0;i<MAX;i++)
  scanf("%lf",&b[i]);

printf("Please input  changliang c:\n");/*输入常数c*/
scanf("%lf",&c);

printf("please input the first point x:\n");/*输入初始节点x*/
for(i=0;i<MAX;i++)
  scanf("%lf",&x[i]);


while(w>ET)                    /*最速下降的控制循环*/
{

 for(i=0;i<MAX;i++)  
 {
 ftemp[i]=0;
 gtemp1[i]=0;
 gtemp2[i]=0;
 }
 f=0;
 p=0;
 q=0;


 for(i=0;i<MAX;i++)   
   for(j=0;j<MAX;j++)
   ftemp[i]+=x[j]*a[j][i];

 for(i=0;i<MAX;i++)
   f+=ftemp[i]*x[i]/2+b[i]*x[i];/*计算每次迭代时多项式的近似值*/

 for(i=0;i<MAX;i++)
   for(j=0;j<MAX;j++)
   gtemp1[i]+=a[i][j]*x[j];
 for(i=0;i<MAX;i++)
   g[i]=gtemp1[i]+b[i];    /*求多项式的梯度矩阵*/
 
 for(i=0;i<MAX;i++)       /*求每次迭代的最优步长*/ 
   p+=g[i]*g[i];
   w=sqrt(p);            /*求梯度矩阵范式的模*/


 for(i=0;i<MAX;i++)
   for(j=0;j<MAX;j++)
   gtemp2[i]+=g[j]*a[j][i];

 for(i=0;i<MAX;i++)
   q+=gtemp2[i]*g[i];

 if(q!=0) 
 t=p/q;               /*求得最优下降步长t=p/q*/
 

 /*输出部分*/
 fprintf(fp,"第 %d 次迭代:",count);
 fprintf(fp,"目标函数值f=%lf  ",f+c);
 fprintf(fp,"梯度范式的模w=%lf  ",w);
 fprintf(fp,"步长t=%lf  \n",t);
 for(i=0;i<MAX;i++)
 fprintf(fp,"x[%d]=%lf\t",i+1,x[i]);
 fprintf(fp,"\n\n");
 /*输出部分*/
 
 for(i=0;i<MAX;i++)
 x[i]=x[i]-t*g[i];    /*代入最优步长对t进行循环迭代*/

 count++;             /*计数器*/
 
}
 
 
 fprintf(fp,"最后的结果为:\n");      /*在文件中输出最后的结果*/
 fprintf(fp,"总共迭代%d次,控制的精度为%f.\n",count-1,ET); 
 fprintf(fp,"目标函数值f=%lf  ",f+c);
 fprintf(fp,"最优解为: ");
 for(i=0;i<MAX;i++)
 fprintf(fp,"x[%d]=%lf\t",i+1,x[i]);
 fclose(fp);

 printf("\nThe last result is:\n");  /*在TC中输出最后的结果*/
 printf("A total of %d iterative.\n",count-1);
 printf("f=%lf  ",f+c);
 printf("The optimal solution is: ");
 for(i=0;i<MAX;i++)
 printf("x[%d]=%lf\t",i+1,x[i]);
 getch();
 
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -