📄 zs.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 + -