实验报告阻尼牛顿法参考模板.docx
- 文档编号:1758346
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:18
- 大小:23.16KB
实验报告阻尼牛顿法参考模板.docx
《实验报告阻尼牛顿法参考模板.docx》由会员分享,可在线阅读,更多相关《实验报告阻尼牛顿法参考模板.docx(18页珍藏版)》请在冰点文库上搜索。
实验报告阻尼牛顿法参考模板
太原理工大学机械学院机测系课程上机实验报告
课程名称:
机械优化设计
班级
日期
成绩评定
姓名
实验室
老师签名
实验名称
用阻尼牛顿法程序解题
所用软件
C++DEV
实
验
目
的
及
内
容
实验目的:
1.掌握并能够建立最优化基本类型问题的数学模型。
2.掌握最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础。
3.能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础
实验内容:
理解阻尼牛顿法并编写相关程序求其最优解。
牛顿法程序考核题
实
验
原
理
步
骤
、
实验原理:
实验步骤:
1,画流程图,编写程序;
2,将目标函数代入;
3,编译运行,将结果保存
实
验
结
果
及
分
析
*********阻尼牛顿法计算结果**********
++++++一维搜索方法:
黄金分割法++++++
初始坐标:
x(0)=[0.0000000,0.0000000],f(0)=16.0000000
迭代轮数k=1
x
(1)=[-1.1249988,0.7499992],f
(1)=9.8125000
迭代精度:
0.000009986
迭代轮数k=2
x
(2)=[-1.1250000,0.7500000],f
(2)=9.8125000
迭代精度:
0.000000114
*********************
阻尼牛顿法法优化最优点及目标函数值为:
x(*)=[-1.1250000,0.7500000],f(*)=9.8125000
迭代精度:
0.000000114
算法程序实现
/*csssqj.cpp*/
#include
#include
#include
#include
#include
#defineN2/*优化设计维数*/
#defineEPSIN0.000001/*迭代精度*/
#defineH_QJ1.0/*初始区间搜索步长*/
#defineY_F1/*一维搜索方法选择:
1——黄金分割法*/
/*2——二次插值法*/
FILE*fp;
charoutname[50]="阻尼牛顿法计算结果.txt";/*计算结果输出文件*/
/*给出初始点坐标*/
voidcsd_x(doublex0[])
{
inti;
for(i=0;i x0[i]=0.0; return; } /*目标函数*/ doublehanshu(doublex[]) { doublef; f=4.0*(x[0]+1.0)*(x[0]+1.0)+2.0*(x[1]-1.0)*(x[1]-1.0) +x[0]+x[1]+10.0;/*阻尼牛顿法*/ returnf; } /*函数的梯度*/ voidgread(doublex[],doublegf[]) { /*阻尼牛顿法*/ gf[0]=8.0*(x[0]+1.0)+1.0; gf[1]=4.0*(x[1]-1.0)+1.0; return; } /*Heisen矩阵*/ voidheisen(doublex[],doublehei[][N]) { hei[0][0]=8.0; hei[0][1]=0.0; hei[1][0]=0.0; hei[1][1]=4.0; return; } /*计算f(xk+as)*/ doublexkadd(doublex[],doubled[],doublea) { inti; doublex1[N]; for(i=0;i x1[i]=x[i]+a*d[i]; returnhanshu(x1); } /*输出选定的一维迭代方法*/ voidywddf(intyw) { switch(yw) { case1: fprintf(fp,"++++++一维搜索方法: 黄金分割法++++++\n\n"); break; case2: fprintf(fp,"++++++一维搜索方法: 二次插值法++++++\n\n"); break; } return; } /*输出当前迭代点坐标及目标函数值*/ doublexfout(doublex[],intm) { intj; doublef; f=hanshu(x); if(-1==m) fprintf(fp,"x(*)=["); else fprintf(fp,"x(%3d)=[",m); for(j=0;j fprintf(fp,"%15.7lf,",x[j]); if(-1==m) fprintf(fp,"%15.7lf],f(*)=%15.7lf\n",x[N-1],f); else fprintf(fp,"%15.7lf],f(%3d)=%15.7lf\n",x[N-1],m,f); returnf; } /*初始搜索区间的确定*/ voidcsssqj(doublex[],doubled[],doubleh,doubleab[]) { doublea1,a2,a3,f1,f2,f3; a2=0.0; a3=a2+h; f2=xkadd(x,d,a2); f3=xkadd(x,d,a3); if(f3>f2) { a2=a3; a3=0.0; f1=f2; f2=f3; f3=f1; h=-h; } do { a1=a2; a2=a3; f1=f2; f2=f3; a3=a2+h; f3=xkadd(x,d,a3); h=2*h; }while(f3 if(h>0.0) { ab[0]=a1; ab[1]=a3; } else { ab[0]=a3; ab[1]=a1; } return; } /*黄金分割法*/ voidgoldcut(doublex[],doubled[],doubleh,doubleebsin) { doublea1,a2,f1,f2,a,b,ab[2]; inti; csssqj(x,d,h,ab); a=ab[0]; b=ab[1]; a1=b-0.618*(b-a); f1=xkadd(x,d,a1); a2=a+0.618*(b-a); f2=xkadd(x,d,a2); do { if(f1>f2) { a=a1; a1=a2; f1=f2; a2=a+0.618*(b-a); f2=xkadd(x,d,a2); } else { b=a2; a2=a1; f2=f1; a1=b-0.618*(b-a); f1=xkadd(x,d,a1); } }while(b-a>ebsin); for(i=0;i x[i]+=(b+a)*d[i]/2; return; } /*二次插值法*/ intrccz(doublex[],doubled[],doubleh,doubleebsin) { doublea1,a2,a3,a4,f1,f2,f3,f4,c1,c2,ab[2]; inti,p=0,k=0; csssqj(x,d,h,ab); a1=ab[0]; a3=ab[1]; a2=(a1+a3)/2; f1=xkadd(x,d,a1); f2=xkadd(x,d,a2); f3=xkadd(x,d,a3); while (1) { c1=(f3-f1)/(a3-a1); c2=((f2-f1)/(a2-a1)-c1)/(a2-a3); if(0==c2) { p=1; break; } a4=0.5*(a1+a3-c1/c2); if((a4-a1)*(a3-a4)<=0.0) { p=2; break; } f4=xkadd(x,d,a4); if(1==k&&fabs(a4-a2)<=ebsin) break; if(a4 { if(f2>f4) { f1=f2; a1=a2; k=1; a2=a4; f2=f4; } else { a3=a4; f3=f4; } } else { if(f2>f4) { f3=f2; a3=a2; k=1; a2=a4; f2=f4; } else { a1=a4; f1=f4; } } } if(0==p) f1=f4-f2? a4: a2; else f1=a2; for(i=0;i x[i]+=f1*d[i]; returnp; } /*矩阵求逆*/ voidatoa_1(doublea[][N],doubleb[][N]) { inti,j,k,m; doublefact,ebs=0.0; for(i=0;i for(j=0;j { b[i][j]=0.0; ebs+=a[i][j]*a[i][j]; } ebs=sqrt(ebs)/(N*N*100); for(i=0;i b[i][i]=1.0; for(i=0;i { if(fabs(a[i][i]) { for(k=i;k { if(fabs(a[i][i])>ebs) { for(m=0;m { fact=a[i][m]; a[i][m]=a[k][m]; a[k][m]=fact; fact=b[i][m]; b[i][m]=b[k][m]; b[k][m]=fact; } break; } } } fact=a[i][i]; for(k=0;k { a[i][k]/=fact; b[i][k]/=fact; } for(k=0;k { fact=a[k][i]; for(m=0;m { a[i][m]-=a[i][m]*fact; b[i][m]-=b[i][m]*fact; } } for(k=i+1;k { fact=a[k][i]; for(m=0;m { a[i][m]-=a[i][m]*fact; b[i][m]-=b[i][m]*fact; } } } return; } /*阻尼牛顿法*/ voidnewtow_method(doublex[],doubleh,doubleebsin,intyw) { doubled[N],t,f,s[N],hei[N][N],hei_1[N][N]; inti,j,k=1; fprintf(fp,"**********阻尼牛顿法计算结果**********\n\n"); ywddf(yw);/*输出一维迭代方法*/ fprintf(fp,"初始坐标: \n"); f=xfout(x,0); fprintf(fp,"\n"); gread(x,d); do { heisen(x,hei); atoa_1(hei,hei_1); for(i=0;i { s[i]=0.0; for(j=0;j s[i]+=hei_1[i][j]*d[j]; } switch(yw) { case1: goldcut(x,s,h,ebsin); break; case2: j=rccz(x,s,h,ebsin); break; } gread(x,d); fprintf(fp,"迭代轮数k=%3d\n",k); f=xfout(x,k); t=0; for(i=0;i t+=d[i]*d[i]; t=sqrt(t); fprintf(fp,"迭代精度: %15.9lf\n",t); k++; }while(t>ebsin); fprintf(fp,"\n*********************\n"); fprintf(fp,"阻尼牛顿法法优化最优点及目标函数值为: \n"); f=xfout(x,-1); fprintf(fp,"迭代精度: "); fprintf(fp,"%15.9lf\n",t); return; } main() { doublex0[N],h,ebsin; intyw; csd_x(x0);/*初始坐标*/ h=H_QJ; ebsin=EPSIN; yw=Y_F; fp=fopen(outname,"w"); newtow_method(x0,h,ebsin,yw);/*调用阻尼牛顿法*/ fclose(fp); return0; } 备注: 不交此报告者,本次实验为“不合格”。 友情提示: 范文可能无法思考和涵盖全面,供参考! 最好找专业人士起草或审核后使用,感谢您的下载!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 阻尼 牛顿 参考 模板