现代设计方法
- 格式:doc
- 大小:547.28 KB
- 文档页数:19
机械设计方法实验报告
姓名:
学号:
成绩:
指导教师:
进退试算法实验报告
一、实验目的
1.加深对进退试算法的基本理论和算法步骤的理解。
2.培养独立编制、调试计算机程序的能力。
3.掌握常用优化程序的使用方法。
4.培养灵活运用优化设计方法解决工程实际问题的能力。
二、实验要求
1.明确进退试算法基本原理及程序框图。
2.编制进退试算法程序。
三.实验内容
计算实例:用进退试算法求函数())2
t
f的搜索区间。
(+
=t t
①.进退试算法基本原理简述
进退试算法的基本思想是:按照一定的规律给出若干试算点,一次比较各试算点的函数值的大小,直到找出相邻的三点的函数值按“高——低——高”变化的单峰区间为止。
②、程序的流程图
③.编制进退试算法程序
#include
#include
#define f(t) (t*(t+2))
void sb(double *a,double *b)
{
double t0,t1,t,h,alpha,f0,f1;
int k=0;
printf("请输入初始点t0=");
scanf("%lf",&t0);
printf("\n请输入初始步长h=");
scanf("%lf",&h);
printf("\n请输入加步系数alpha(需大于1)=");
scanf("%lf",&alpha);
f0=f(t0);
t1=t0+h;
f1=f(t1);
while(1)
{
printf("\nf1=%lf,f2=%lf,t0=%lf,t=%lf,h=%lf,k=%d",f0,f1,t0,t1,h,k);
if(f1 { h=alpha*h; t=t0; t0=t1; f0=f1; k++; } else { if(k==0) {h=-h;t=t1;} else { *a=t *b=t>t1?t:t1; break; } } t1=t0+h; f1=f(t1); } } main() { double a=0,b=0; double *c,*d; c=&a,d=&b; sb(c,d); printf("\na=%lf,b=%lf",a,b); } ④.程序运行结果 鲍威尔共轭方向法实验报告 一、实验目的 5. 加深对鲍威尔法的基本理论和算法步骤的理解。 6. 培养独立编制、调试计算机程序的能力。 7. 掌握常用优化程序的使用方法。 8. 培养灵活运用优化设计方法解决工程实际问题的能力。 二、实验要求 3. 明确鲍威尔法基本原理及程序框图。 4. 编制鲍威尔法程序。 三.实验内容 计算实例:用鲍威尔法求函数()212 221212141060,x x x x x x x x f -++--=的极 小值。 ①.鲍威尔法基本原理简述 任选一初始点X 0,再选两个线性无关的向量。从X 0出发,顺 次沿e 1、e 2作一维搜索得01X 、02X ,两点连线得一新方向d 1,用d 1代替e 1形成两个线性无关向量e 2、d 1,作为下一轮搜索方向。再从02 X 出发,沿d 1作一维搜索得点01X ,作为下一轮迭代的初始点。从X 1出发,顺次沿e 2、d 1作一维搜索,得到点11X 、12X ,两点的连线得一新方向d 2。10X 、12X 两点是从不同点X 0、11X 出发,分别沿d 1方向进 行一维搜索而得到的极小点。再从12X 出发,沿d 2作一维搜索得点X 2,即是二维问题的极小点X *。 ③.编制鲍威尔法程序 #include "stdio.h" #include "stdlib.h" #include "math.h" double objf(double x[]) {double ff; ff=60-10*x[0]-4*x[1]+x[0]*x[0]+x[1]*x[1]-x[0]*x[1]; return(ff); } void jtf(double x0[],double h0,double s[],int n,double a[],double b[]) {int i; double *x[3],h,f1,f2,f3; for(i=0;i<3;i++) x[i]=(double *)malloc(n*sizeof(double)); h=h0; for(i=0;i *(x[0]+i)=x0[i]; f1=objf(x[0]); for(i=0;i *(x[1]+i)=*(x[0]+i)+h*s[i]; f2=objf(x[1]); if(f2>=f1) { h=-h0; for(i=0;i *(x[2]+i)=*(x[0]+i); f3=f1; for(i=0;i {*(x[0]+i)=*(x[1]+i); *(x[1]+i)=*(x[2]+i); } f1=f2; f2=f3; } for(;;) {h=2*h; for(i=0;i *(x[2]+i)=*(x[1]+i)+h*s[i]; f3=objf(x[2]); if(f2 else { for(i=0;i {*(x[0]+i)=*(x[1]+i); *(x[1]+i)=*(x[2]+i);