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