阻尼牛顿法
-
上机实验报告
课
程
名
称:
机械优化设计
班级
姓名
日
期
实验室
成绩评定
老师签名
实验
利用牛顿法求解相关函数的极
小值点
名称
所用
DEV-C++ 5
软件
实验目的:
1.
掌握并能够建立最优化基本类型问题的数学模型。
实
验
目
的
及
内
容
2.
掌握
最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础。
3.
能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基
础
实验内容:
理解牛顿法并编写相关程序求其最优解。
牛顿法程序考核题:
f
(
X
)
< br>4
(
x
1
1
)
2
2
(
x
2
p>
1
)
2
x
1
x
2
10
初始点:
X
[
0
,
0
]
< br>,梯度精度
0
.
01
0
T
实
验
原
理
步
骤
、
实验原理:
实验步骤:
1
,画流程图,编写程序;
2
,将目标函数代入;
3
,编译运行,将结果保存。
f
(
X
p>
)
4
(
x
1
1
)
2
2
< br>(
x
2
1
)
2
x
1
x
2
p>
10
初始点:
X
[
0
,
p>
0
]
,梯度精度
0
.
01<
/p>
0
T
****
******
阻尼牛顿法计算结果
**********
p>
++++++
一维搜索方法:黄金分割法
+
+++++
初始坐标:
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;
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; -
-
-