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

📄 newton.c

📁 最优化的一系列算法
💻 C
字号:
#define MAX 2
#define ET 1e-4
#include<stdio.h>
#include<math.h>
 
main()
{
FILE *fp;
int i,j,k,count=0;
double a[MAX][MAX],ani[MAX][MAX],b[MAX],x[MAX],g[MAX],gtemp1[MAX]={0},gtemp2[MAX],ftemp[MAX],gtemp[MAX];
double p,q,s,t,f,w=1,c,lmd;
fp=fopen("d:/newton.txt","w+");

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

/*为减少程序代码,这里略去Hesse矩阵求逆过程,由人工算出*/
printf("Please input hesse juzhen de ni juzhen:\n");
for(i=0;i<MAX;i++)
  for(j=0;j<MAX;j++)
  scanf("%lf",&ani[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;
 gtemp[i]=0;
 }
 f=0;
 p=0;
 q=0;
 s=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++)
   for(j=0;j<MAX;j++)
   gtemp[i]+=-ani[i][j]*g[j];/*求得搜索方向*/
 
 for(i=0;i<MAX;i++)       /*求每次迭代的最优步长*/ 
   p+=g[i]*g[i];
   w=sqrt(p);             /*求梯度矩阵范式的模*/


  /*输出部分*/
 fprintf(fp,"第 %d 次迭代:",count);
 fprintf(fp,"目标函数值f=%lf  ",f+c);
 fprintf(fp,"梯度范式的模w=%lf  ",w);
 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]+gtemp[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 + -