?? zs.c
字號(hào):
#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是為了控制開(kāi)始的迭代*/
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");/*輸入一次項(xiàng)系數(shù)矩陣b*/
for(i=0;i<MAX;i++)
scanf("%lf",&b[i]);
printf("Please input changliang c:\n");/*輸入常數(shù)c*/
scanf("%lf",&c);
printf("please input the first point x:\n");/*輸入初始節(jié)點(diǎn)x*/
for(i=0;i<MAX;i++)
scanf("%lf",&x[i]);
while(w>ET) /*最速下降的控制循環(huán)*/
{
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];/*計(jì)算每次迭代時(shí)多項(xiàng)式的近似值*/
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]; /*求多項(xiàng)式的梯度矩陣*/
for(i=0;i<MAX;i++) /*求每次迭代的最優(yōu)步長(zhǎng)*/
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; /*求得最優(yōu)下降步長(zhǎng)t=p/q*/
/*輸出部分*/
fprintf(fp,"第 %d 次迭代:",count);
fprintf(fp,"目標(biāo)函數(shù)值f=%lf ",f+c);
fprintf(fp,"梯度范式的模w=%lf ",w);
fprintf(fp,"步長(zhǎng)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]; /*代入最優(yōu)步長(zhǎng)對(duì)t進(jìn)行循環(huán)迭代*/
count++; /*計(jì)數(shù)器*/
}
fprintf(fp,"最后的結(jié)果為:\n"); /*在文件中輸出最后的結(jié)果*/
fprintf(fp,"總共迭代%d次,控制的精度為%f.\n",count-1,ET);
fprintf(fp,"目標(biāo)函數(shù)值f=%lf ",f+c);
fprintf(fp,"最優(yōu)解為: ");
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中輸出最后的結(jié)果*/
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();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -