机械优化设计实验
报告
班级:XXXX
姓名:XX
学号:XXXXXXXXXXX
一、外推法
1、实验原理
常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。
一般情况下,我们并不知道一元函数f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。
由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。
因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。
该区间越小越好,并且仅存在唯一极小值点。
所确定的单股区间应具有如下性质:如果在[α1,α3]区间内任取一点α2,,α1<α2<α3或α3<α2<α1,则必有f(α1)>f(α2)<f(α3)。
由此可知,单股区间有一个共同特点:函数值的变化规律呈现“大---小---大”或“高---低---高”的趋势,在极小值点的左侧,函数值呈严格下降趋势,在极小值点右侧,函数值呈严格上升趋势,这正是单股区间依据。
2、实验工具
C-Free3.5软件
3、程序调试
#include<stdio.h>
#include<math.h>
#define f(x) 3*x*x-8*x+9 //定义函数
int main()
{
double a0,a1,a2,a3,f1,f2,f3,h;
printf(“a0=”,a0); //单谷区间起始点
scanf(“%lf”,&a0);
printf(“h=”,h); //起始的步长
scanf(“%lf”,&h);
a1=a0;
a2=a1+h;
f1=f(a0);
f2=f(a2);
if(f1>f2) //判断函数值的大小,确定下降方向
{
a3=a2+h;
f3=f(a3);
}
else
{
h=-h;
a3=a1;
f3=f1;
a1=a2;
f1=f2;
a2=a3;
f2=f3;
a3=a2+h;
f3=f(a3);
}
while(f3<=f2) //当不满足上述比较时,说明下降方向反向,继续进行判断
{
h=2*h;
a1=a2;
f1=f2;
a2=a3;
f2=f3;
a3=a2+h;
f3=f(a3);
}
printf(“a1=%lf,a3=%lf\n”,a1,a3);
printf(“[a1,a3]=[%lf,%lf]\n”,a1,a3); //输出区间}
4、调试结果
5、总结与讨论
1)当写成void main时会出现如下警告
改成int main警告消失。
二、黄金分割法
1、实验原理
在外推法确定了单股区间[α1,α3]的基础上去其中对称两点α2,α4,且满足
α2=α3−λ(α3−α1)
α4=α1+λ(α3−α1)
式中,λ位0~1的缩小系数。
计算点α2,α4的函数值,记f2=f(α2),f4=f(α4),并比较他们的大小,可能存在如下三种情况:
(1)f2<f4:此时必有极小值点α∈[α1,α4],应舍去区间[α4,α3],保留的区间长度为λl,缩小后的新区间为[α1,α4];
(2)f2>f4:此时必有极小值点α∈[α2,α3],应舍去区间[α1,α2],保留的区间长度为λl,缩小后的新区间为[α2,α3];
(3)f2=f4:此时必有极小值点α∈[α2,α4],应舍去区间[α1,α2]或[α4,α3]。
经过比较取舍后,缩小后所得的新区建长度均为λl,将区间端点重新命名为[α1,α3],就可以进行新一轮的比较,如此循环。
2、实验工具
C-Free 3.5软件
3、程序调试
#include<stdio.h>
#include<math.h>
#define f(x) 3*x*x-8*x+9
#define v 0.618 //黄金分割点
int main()
{
float a0,a1,a2,a3,a4,f0,f1,f2,f3,f4,b; //b收敛精度
puts("单谷区间a1=");
scanf("%f",&a1);
puts("单谷区间a3=");
scanf("%f",&a3);
puts("收敛精度b=");
scanf("%.4f",b);
a2=a3-v*(a3-a1);
f2=f(a2);
a4=a1+v*(a3-a1);
f4=f(a4);
do //do-while循环,知道满足条件退出循环
{
if(f2>f4) //判断函数值大小,缩小比较区间
{
a1=a2;
a2=a4;
f2=f4;
a4=a1+v*(a3-a1);
f4=f(a4);
}
else
{
a3=a4;
a4=a2;
f4=f2;
a2=a3-v*(a3-a1);
f2=f(a2);
}
}
while(abs(a3-a1)>b);。