阻尼牛顿法

玛丽莲梦兔
504次浏览
2021年02月11日 05:39
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:墨梅的意思)


上机实验报告




课



程



名



称:





机械优化设计













班级



姓名






日




期



实验室






成绩评定




老师签名





实验


利用牛顿法求解相关函数的极 小值点



名称



所用


DEV-C++ 5


软件




实验目的:



1.

掌握并能够建立最优化基本类型问题的数学模型。



实



验



目



的



及



内



容



2.


掌握 最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础。



3.


能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基 础



实验内容:



理解牛顿法并编写相关程序求其最优解。



牛顿法程序考核题:



f


(


X


)


< br>4


(


x


1



1


)


2



2


(


x


2



1


)


2



x


1



x


2



10


初始点:


X



[


0


,


0


]

< br>,梯度精度




0


.


01



0


T



实




验





原




理




步




骤



、




实验原理:




实验步骤:



1


,画流程图,编写程序;



2


,将目标函数代入;



3


,编译运行,将结果保存。




f


(


X


)



4


(


x


1



1


)


2



2

< br>(


x


2



1


)


2



x


1



x


2



10


初始点:


X



[


0


,


0


]


,梯度精度




0


.


01< /p>


0


T



**** ******


阻尼牛顿法计算结果


**********


++++++


一维搜索方法:黄金分割法


+ +++++


初始坐标:





x(



0)=[ 0.0000000, 0.0000000],



f(



0)= 16.0000000


迭代轮数




k= 1





x(



1)=[ -1.1233083, 0.7488722],



f(



1)= 9.8125140







迭代精度:


0.014265760


迭代轮数




k= 2






x(



2)=[ -1.1249975, 0.7499983],



f(



2)= 9.8125000






迭代精度:


0.000021452


*********************


阻尼牛顿法法优化最优点及目标函数值为:













x( * )=[ -1.1249975, 0.7499983],











f( * )= 9.8125000












迭代精度:


0.000021452



实




验




结




果




及




分




析



算法程序实现



/* */






#include


#include


#include


#include


#include



#define N 2
















/*


优化设计维数


*/


#define EPSIN 0.000001





/*


迭代精度


*/


#define H_QJ 1.0











/*


初始区间搜索步长


*/


#define Y_F



1













/*< /p>


一维搜索方法选择:


1


——黄金分割法< /p>


*/





























/*

















2


——二次插值法


*/



FILE *fp;


char o utname[50]=


阻尼牛顿法计算结果


.txt




/*


计算结果输出文件


*/



/*


给出初始点坐标


*/


void csd_x(double x0[])


{






}



/*


目标函数


*/


double hanshu(double x[])


{


int i;


for(i=0;i












/*


初始点为坐标原点的情况


*/



x0[i]=0.0;


return;







}



double f;


< p>
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;









































/*


阻尼牛顿法


*/


return f;


/*


函数的梯度


*/


void gread(double x[],double gf[])


{







}



/*Heisen


矩阵


*/


void heisen(double x[],double hei[][N])


{








}



/*


计算


f(xk+as)*/


double xkadd(double x[],double d[],double a)


{








}



/*


输出选定的一维迭代方法


*/


void ywddf(int yw)


{





switch(yw)


{



case 1:


for(i=0;i



x1[i]=x[i]+a*d[i];


return hanshu(x1);


int i;


double x1[N];


return;


hei[0][0]=8.0;


hei[0][1]=0.0;


hei[1][0]=0.0;


hei[1][1]=4.0;


gf[0]=8.0*(x[0]+1.0)+1.0;


gf[1]=4.0*(x[1]-1.0)+1.0;


return;


/*


阻尼牛顿法


*/









}








}






fpr intf(fp,


一维搜索方法:黄金分割法


++++++nn


break;


fprintf(fp,


一维搜索方法:二次插值法


++++++nn


break;


case 2:


return;


/ *


输出当前迭代点坐标及目标函数值


*/


double xfout(double x[],int m)


{

















}



/*


初始搜索区间的确定


*/


void csssqj(double x[],double d[],double h,double ab[])


{















double a1,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;


f=hanshu(x);


if(-1==m)



else





else



fprintf(fp,











f(%3d)=%15.7lfn


return f;


fprintf(fp,











x(% 3d)=[


fprintf(fp,


fprintf(fp,< /p>











f( * )=%15.7lfn


for(j=0;j


if(-1==m)


fprintf(fp,











x( * )=[


int j;


double f;


























}




}


do


{









h=-h;


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)


{




}


else


{




}


return;


ab[0]=a3;


ab[1]=a1;


ab[0]=a1;


ab[1]=a3;


/*


黄金分割法


*/


void goldcut(double x[],double d[],double h,double ebsin)


{


















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;


double a1,a2,f1,f2,a,b,ab[2];


int i;

-


-


-


-


-


-


-


-