机械优化设计二次插值法流程图

合集下载

机械优化设计-第三章一维优化方法

机械优化设计-第三章一维优化方法
23
机械优化设计
• 第四次缩小区间: 第四次缩小区间: • 令 x2=x1=0.764, , f2=f1=0.282 • x1=0.472+0.382*(0.944-0.472)=0.652, f1=0.223 • 由于f1<f2, 故新区间 由于f 故新区间[a,b]=[a, x2]=[0.472, 0.764] • 因为 b-a=0.764-0.472=0.292>0.2, 应继续缩小区间。 , 应继续缩小区间。 第五次缩小区间: 第五次缩小区间: f2=f1=0.223 令 x2=x1=0.652, x1=0.472+0.382*(0.764-0.472)=0.584, f1=0.262 由于f 故新区间[a,b]=[x1,b]=[0.584, 0.764] 由于f1>f2, 故新区间 因为 b-a=0.764-0.584=0.18<0.2, 停止迭代。 程序演示 , 停止迭代。 极小点与极小值: 极小点与极小值: x*=0.5*(0.584+0.764)=0.674,
x2 = a + 0.618(b − a), y2 = f ( x2 )
f
b = x2 , x2 = x1, y2 = y1
x1 = a + 0.382(b − a), y1 = f ( x1 )
y1 < y2


y1 y2
x
b
a = x1 , x1 = x2 , y1 = y2
x2 = a + 0.618(b − a), y2 = f ( x2 )
7
机械优化设计
h0
x2
机械优化设计
2.前进搜索 加大步长 h=2 h ,产生新点x3= x2+ 2h0 ; (a)如y2<y3,则函数在[x1,x3]内 必有极小点,令a= x1,b= x3搜索 区间为[a,b] ; (b)如y2>y3, 令x1=x2 ,y1=y2 ; x2=x3 ,y2=y3 ; h=2h 重新构造新点x3=x2+h,并比较y2、 y3的大小,直到y2<y3。

机械优化设计(全,120张)

机械优化设计(全,120张)

| F ( X (k1) ) F ( X (k) ) |

|
F(
X
(k1) ) F ( X | F(X (k)) |
(k)
)
|


(三)梯度准则
目标函数在迭代点的梯度模已达到充分小, 即:
|| F ( X (k1) ||
式中的ε为结定的迭代精度或允许误差,可 根据设计要求预先给定。
1.3 优化设计问题的基本解法
求解优化问题的方法:
解析法
数学模型复杂时不便求解
数值法
可以处理复杂函数及没有数学表达式 的优化设计问题
寻求极值点的搜索过程
1.4、迭代计算的终止准则
在迭代过程中,如果根据一个迭代公式能够计 算出接近精确解的近似解,即近似解序列X(k) 有极限
lim X (k) X * k
在设计这根主轴时, 有两个重要因素需要 考虑。一是主轴的自 重;一是主轴伸出端 c点的挠度。
1.11、设计变量
在优化设计的过程中,不断进行修改、调整, 一直处于变化的参数称为设计变量。
设计变量的全体实际上是一组变量,可用一 个列向量表示:
x x1 x2 ... xn T
本问题中,当主轴的材料选定时,其设计方案 由四个设计变量决定。孔径d、外径D、跨距l及 外伸端长度a。由于机床主轴内孔用于通过待加 工的棒料,其大小由机床型号决定。不作为设 计变量。故设计变量取为:
2、现代设计方法
现代设计方法是以电子计算机 为手段,运用工程设计的新理论和 新方法,使计算结果达到最优化,使 设计过程实现高效化和自动化.
运用现代设计方法可以适应市 场剧烈竞争的需要,提高设计质量 和缩短设计周期.
二、优化设计方法

机械优化设计 多项式插值和分段插值1

机械优化设计 多项式插值和分段插值1
4/27
一、插值思想简介
5/27
一、插值思想简介
引例1、函数查表问题
求标准正态分布函数值F(2.3456789) 由标准正态分布函数值表可以得到: F(2.34)=0.99036; F(2.35)=0.99061 2.3456789接近2.35 故F(2.3456789)约等于0.99061
在对精度要求较高时,这种处理方法受到质疑 问题:利用一个表格给出的函数值,计算未给出的函数值
设函数f(x)在n+1个节点x0,x1,…,xn处的函数值已知, 为 y0,y1,…,yn 。 要求一个分段( 共 n段)线性函数q(x),使其满足:
q(xi)=yi , i=0,1,…,n.
17/27
二、一维插值方法
这n+1个点 x0,x1,…,xn
称为节点
y
o x0

xj-1 xj xj+1 xn
n=3时
axis([-6,6,-1.5 2]); n=9时
高阶振荡
n=15时
15/27
二、一维插值方法
2、分段多项式插值 由于高次插值多项式的振荡缺陷,促使人们转而寻求简单的低 次多项式插值。分段插值的基本思想是将插值区间划分为若干 个小区间,然后在每个小区间上做满足一定条件的低阶插值。 2.1分段线性插值
Li
(x)

(x x0 )( x x1)(x (xi x0 )( xi x1)(xi
xi1)( x xi1)(x xn ) xi1)( xi xi1)( xi xn
)
易知n次多项
式Li
(
x)满足Li
(
x
j
)

1,i 0,i

线性插值与二次插值公式ppt课件

线性插值与二次插值公式ppt课件
11
MATLAB计算程序
1
x=0:.6:1.8; y=erf(x);
0 .8
x=x';y=y';
A=[ones(4,1) x x.^2 x.^3]; 0.6
p=A\y;
0 .4
a0=p(1);a1=p(2); 0 .2
a2=p(3);a3=p(4);
t=0:.2:2;
0
0
0 .5
1
1 .5
2
u=a0+a1*t+a2*t.^2+a3*t.^3;
plot(x,y,'o',t,u)
12
拉格朗日插值的基函数构造法
n=1 线性插值问题 x
x0
x1
已知函数表 f(x)
y0
y1
求满足: L1(x0)=y0 , L1(x1)=y1的线性插值多项式 L1(x)
由过两点直线方程,得
L1( x)

y0

y1 x1

y0 x0
(x

x0 )
化为等价形式
L1( x)
当 x∈(0.5, 1)时
Erf ( x) 1 [( x 0.5) 0.8427 (1 x) 0.5205] 1 0.5
当 x∈(1, 1.5)时
Erf ( x) 1 [( x 1) 0.9661 (1.5 x) 0.8427] 1.5 1
3
实际问题中遇到的函数f(x)有的表达式复杂,有 的只提供了离散点上的函数值或导数值。为了进 一步分析问题的性质和变化规律,自然希望找到 一种简单函数p(x),能近似描述函数f(x)的变化规 律,又便于处理。把这个函数p(x)称作f(x)的近似 函数。

机械优化设计黄金分割法 外推法

机械优化设计黄金分割法 外推法

郑州大学机械优化设计部分程序1.外推法2.黄金分割法3.二次插值法4.坐标轮换法5.随机方向法6.四杆机构优化设计1.外推法源程序:#include<>#include<>#define Rdouble fun(double x){ double m;m=x*x-10*x+36;return m;}void main(){double h0=R,y1,y2,y3,x1,x2,x3,h; x1=0;h=h0;x2=h;y1=fun(x1);y2=fun(x2);if(y2>y1){h=-h;x3=x1;y3=y1;x1=x2;y1=y2;x2=x3;y2=y3;}x3=x2+h;y3=fun(x3);while(y3<y2){h*=;x1=x2;y1=y2;x2=x3;y2=y3;x3=x2+h;y3=fun(x3);}printf("fun(%f)=%f,fun(%f)=%f,fun( %f)=%f\n",x1,y1,x2,y2,x3,y3);}运行过程及结果:fun=,fun=,fun=2.黄金分割法源程序:#include<>#include<>#define f(x) x*x*x*x-5*x*x*x+4*x*x-6*x+60double hj(double *a,double *b,double e,int *n){double x1,x2,s;if(fabs((*b-*a)/(*b))<=e)s=f((*b+*a)/2);else{x1=**(*b-*a);x2=*a+*(*b-*a);if(f(x1)>f(x2))*a=x1;else*b=x2;*n=*n+1;s=hj(a,b,e,n);}return s;}void main() {double s,a,b,e,m;int n=0;printf("输入a,b值和精度e值\n"); scanf("%lf %lf %lf",&a,&b,&e);s=hj(&a,&b,e,&n);m=(a+b)/2;printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\n ",a,b,s,m,n);}运行过程及结果:输入a,b值和精度e值-35a=,b=,s=,m=,n=213.二次插值法源程序:#include<>#include<>int main(void){doublea1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j[3];int i,h=1;void finding(double a[3]);finding(j);a1=j[0];a2=j[1];a3=j[2];m=;double f(double x);y1=f(a1);y2=f(a2);y3=f(a3);for(i=1;1>=1;i++){c1=(y3-y1)/(a3-a1);c2=((y2-y1)/(a2-a1)-c1)/(a2-a3); ap=*(a1+a3-c1/c2);yp=f(ap);if(fabs((y2-yp)/y2)<m)break;else if((ap-a2)*h>0){ if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;}}else if(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;}else{a1=ap;y1=yp;} }double x,y;if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f\n",x); printf("y*=%f\n",y); return 0;}double f(double x) {double y;y=x*x-10*x+36;return y;}void finding(double a[3]){int h,i;double y[3];a[0]=0;h=1;a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]); if(y[1]>y[0]){h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]); h=2*h;}while(y[2]<y[1]);}else{for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]); if(y[2]>=y[1])break;h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}运行过程及结果:a*=y*=4.坐标轮换法源程序:#include <>#include <>#include <>float fun1(float x,float a,float b) {float y;y=x+a*b;return y;}float fun2(float x,float y){float z;z=4*(x-5)*(x-5)+(y-6)*(y-6);return z;}main(){floatd[100][3],x[100][3],xx[3],ax[100][3]; floata1,a2,a3,h,t,y1,y2,y3,e,a,b,l,fi;int i,k;printf("输入初始点坐标\n");scanf("%f%f",&x[0][1],&x[0][2]); e=;l=;x[2][1]=x[0][1];x[2][2]=x[0][2];k=0;k--;do{x[0][1]=x[2][1];x[0][2]=x[2][2];k++;for(i=1;i<=2;i++){if(i==1){d[i][1]=1; d[i][2]=0;}else{d[i][1]=0;d[i][2]=1;}h=;a1=0;a2=h;x[i][1]=fun1(x[i-1][1],d[i][1],a1); x[i][2]=fun1(x[i-1][2],d[i][2],a1); y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2); x[i][2]=fun1(x[i-1][2],d[i][2],a2); y2=fun2(x[i][1],x[i][2]);if(y2>y1){h=-h;a3=a1;y3=y1;a1=a2;a2=a3;y1=y2;y2=y3;}a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]);do{a1=a2;y1=y2;a2=a3;y2=y3;a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]);}while(y3<y2);for(;a1>a3;){t=a3;a3=a1;a1=t; t=y1;y3=y1;y1=t;}a=a1;b=a3;a1=b-l*(b-a);a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1); x[i][2]=fun1(x[i-1][2],d[i][2],a1); y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2); x[i][2]=fun1(x[i-1][2],d[i][2],a2); y2=fun2(x[i][1],x[i][2]);if(b<1e-3){for(;fabs(b-a)>e;){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}else{for(;fabs((b-a)/b)>=e||fabs((y2-y1 )/y2)>=e;){if(y1>=y2){a=a1; a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}ax[k][i]=*(a+b);x[i][1]=fun1(x[i-1][1],d[i][1],ax[k][i]);x[i][2]=fun1(x[i-1][2],d[i][2],ax[k][i ]);}}while(sqrt(pow((x[2][1]-x[0][1]),2)+po w((x[2][2]-x[0][2]),2))>=1e-6);xx[1]=x[2][1];xx[2]=x[2][2];fi=fun2(xx[1],xx[2]);printf("最优解为\nx1*=%f\nx2*=%f\nf*=%f\nk=%d\n",xx[1],xx[2],fi,k); }运行过程及结果:输入初始点坐标89最优解为x1*=x2*=f*=k=25.随机方向法源程序:#include<>#include<>#include<>float f(float x,float y){float z;z=(x-2)*(x-2)+(y-1)*(y-1); return z;}float g1(float x,float y){float z;z=x*x-y;return z;}float g2(float x,float y){float z;z=x+y-2;return z;}void main(){int i,j;float k=8,c=,a0=-3,b0=3,a1=-3,b1=3; floatx[10],x0[10],xl[10],e[10],r[10],d[10], h,fl,f0,fx;while(g1(x0[0],x0[1])>0||g2(x0[0],x0[1 ])>0){x0[0]=a0+(rand()/*(b0-a0);x0[1]=a1+(rand()/*(b1-a1);}fl=f(x0[0],x0[1]);f0=f(x0[0],x0[1]);while(1){h=;j=1;r[0]=-1+(rand()/*(1-(-1));r[1]=-1+(rand()/*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}while(j<=k){j++;r[0]=-1+(rand()/*(1-(-1));r[1]=-1+(rand()/*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0) {fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}}x[0]=xl[0];x[1]=xl[1];while(1){h=*h;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)break;fx=f(x[0],x[1]);if(fx<fl) fl=fx; else break;}do{x[0]=x[0]-h*d[0];x[1]=x[1]-h*d[1];h=*h;if(h<c)break;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)continue;fx=f(x[0],x[1]);}while(fx>=fl);if(fabs((f0-fx)/f0)>=c){x0[0]=x[0];x0[1]=x[1];fl=fx;f0=fx;}elsebreak;}printf("输出最优解为\nx1*=%f,x2*=%f, y*=%f\n",x[0],x[1],fx);}运行过程及结果:输出最优解为x1*=,x2*=,y*=6.四杆机构优化设计源程序:#include<>#include<>#include<>#define Paiint g(float l1,float l2){if((-l1<=0)&&(-l2<=0)&&(6-l1-l2<=0)&&(1-l2-4<=0)&&(l2-l1-4<=0)&&(l1*l1+l2**l1*l2-16<=0)&&(36-l1*l1-l2**l1*l2<=0))return (1);elsereturn (0);}float fun(float x0[2]){floatf,a[31],b[31],r[31],p[31],q[31],w[31],x1 [2];int i;p[0]=acos(((1+x0[0])*(1+x0[0])-x0[ 1]*x0[1]+25)/(10+10*x0[0]));q[0]=acos(((1+x0[0])*(1+x0[0])-x0[ 1]*x0[1]-25)/(10*x0[1]));f=0;for(i=1;i<=30;i++){p[i]=p[0]+(Pai/60)*i;r[i]=sqrt(26-10*cos(p[i]));a[i]=acos((r[i]*r[i]+x0[1]*x0[1]-x 0[0]*x0[0])/(2*r[i]*x0[1]));b[i]=acos((r[i]*r[i]+24)/(10*r[i]) );q[i]=Pai-a[i]-b[i];w[i]=q[0]+(2*(p[i]-p[0])*(p[i]-p[0 ]))/(3*Pai);f=f+(Pai/60)*(q[i]-w[i])*(q[i]-w[i ])*(p[i]-p[i-1]);}return f;}void main(){floata,q,f,fl,f0,l[2],z[2],d0[100],d1[100], x[2],xi[2],fx,m0,m1,e;int i,j,n,k;printf("输入精度");scanf("%f",&e);do{z[0]=0+5*(rand()/;z[1]=0+5*(rand()/;}while(g(z[0],z[1])==0);for(i=0;i<=99;i++){d0[i]=-1+2*(rand()/;}for(j=0;j<=99;j++){d1[j]=-1+2*(rand()/;}f0=fun(z);fl=fun(z);ss:a=;for(i=0,j=0;i<=99&&j<=99;i++,j++) {n=1/sqrt((d0[i])*(d0[i])+d1[j]*d1[ j]);d0[i]=n*d0[i];d1[j]=n*d1[j];x[0]=z[0]+a*d0[i];x[1]=z[1]+a*d1[j];if(g(x[0],x[1])==1){f=fun(x);if(f<fl){fl=f;m0=d0[i];m1=d1[j];l[0]=x[0];l[1]=x[1];}}}x[0]=l[0];x[1]=l[1];do{a=*a;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==0)break;f=fun(x);if(f<fl)fl=f;else break;} while(g(z[0],z[1])==1); do{x[0]=x[0]-a*m0;x[1]=x[1]-a*m1;a=*a;if(a<break;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1; if(g(z[0],z[1])==1)f=fun(x);}while(f>=fl);if(fabs((f0-f)/f0)<e){xi[0]=x[0];xi[1]=x[1];fx=f;printf("最优解为\nx1*=%f\nx2*=%f\nfx=%f\n",xi[0],xi[1],fx);}else{f0=f;fl=f;z[0]=x[0];z[1]=x[1];goto ss;}}运行过程及结果:输入精度最优解为x1*=x2*=fx=。

机械优化设计外推法,黄金分割法,二次插值法

机械优化设计外推法,黄金分割法,二次插值法
y1=y2; a2=a3; y2=y3; a3=a2+h; x[i][1]=fun1(x[i-1][1],d[i][1],a3); x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]); } while(y3<y2);
for(;a1>a3;) {t=a3; a3=a1; a1=t; t=y1; y3=y1;
if(f(x1)>f(x2)) *a=x1; else *b=x2; *n=*n+1; s=hj(a,b,e,n); } return s; } void main() { double s,a,b,e,m; int n=0; printf("输入 a,b 值和精度 e 值\n"); scanf("%lf %lf %lf",&a,&b,&e); s=hj(&a,&b,e,&n); m=(a+b)/2; printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\n",a,b,s,m,n); }
} } while(sqrt(pow((x[2][1]-x[0][1]),2)+ pow((x[2][2]-x[0][2]),2))>=1e-6); xx[1]=x[2][1]; xx[2]=x[2][2]; fi=fun2(xx[1],xx[2]); printf("the best answer is : \nx1*= %f\nx2*=%f\nf*=%f\n",xx[1],xx[2],fi);
for(i=1;i<=2;i++) { if(i==1) {d[i][1]=1;

机械优化设计课件第三章-刘宇

机械优化设计课件第三章-刘宇

厦门大学物理与机电工程学院
13
区间消去法原理
基本思想
搜索区间确定之后,采用区间消去法逐步缩短搜索区间,从而找 到极小点的数值近似解 在搜索区间[a, b]内任取两点a1和b1,且a1 < b1 ,计算其函数值得如 下结论 (1)f(a1 )<f(b1),由于函数为单谷,所以极小点必在区间[a, b1]内 (2) f(a1 )>f(b1),同理,极小点必在区间[a1, b]内 (3) f(a1 )=f(b1),极小点在区间 极小点在区间[a1, b1]内
(1)选定初始点a1,初始步长h=h0,计算y1=f(α1)和y2=f(α1+h) (2)比较y1和y2 (a)如果y1>y2,转(3)向前探测 (b)如果y1<y2,h=-h0,将α1和α2,y1和y2的值互换。转(3)向后探测 (c)如果y1=y2,极小点在 极小点在α1和α1+h之间 (3)产生新的探测点α3= α2+h,y3=f(α3)
相同点:两种方法都是利用区间消去法原理将初始搜索区间不断 缩短,求得极小值的数值近似解 不同点:表现在试验点(插入点)位置的确定方法不同 试探法:试验点是按照某种个特定的规律确定;不考虑函数值的 试探法 试验点是按照某种个特定的规律确定 不考虑函数值的 分布 插值法:试验点是按照函数值近似分布的极小点确定;利用了函 数值本身及其导数信息;效果更好
第三章 一维搜索方法
主讲人:刘宇
2014/11/12
厦门大学物理与机电工程学院
1
本章内容
一、一维搜索的概念 维搜索的概念 二、搜索区间的确定与区间消去法原理 三 一维搜索的试探方法 三、 维搜索的试探方法—黄金分割法 四、一维搜索的插值方法

机械优化设计黄金分割法 外推法

机械优化设计黄金分割法 外推法

郑州大学机械优化设计部分程序1、外推法2、黄金分割法3、二次插值法4、坐标轮换法5、随机方向法6、四杆机构优化设计1、外推法源程序:#include<stdio、h>#include<math、h>#define R 0、01double fun(double x){ double m;m=x*x-10*x+36;return m;}void main(){double h0=R,y1,y2,y3,x1,x2,x3,h; x1=0;h=h0;x2=h;y1=fun(x1);y2=fun(x2);if(y2>y1){h=-h;x3=x1;y3=y1;x1=x2;y1=y2;x2=x3;y2=y3;}x3=x2+h;y3=fun(x3); while(y3<y2){h*=2、0;x1=x2;y1=y2;x2=x3;y2=y3;x3=x2+h;y3=fun(x3);}printf("fun(%f)=%f,fun(%f)=%f,fun(%f)= %f\n",x1,y1,x2,y2,x3,y3);}运行过程及结果:fun(2、560000)=16、953600,fun(5、120000)=11、014400,fun(10、240000)=38、4576002、黄金分割法源程序:#include<stdio、h>#include<math、h>#define f(x) x*x*x*x-5*x*x*x+4*x*x-6*x+60double hj(double *a,double *b,double e,int *n) {double x1,x2,s;if(fabs((*b-*a)/(*b))<=e)s=f((*b+*a)/2);else{x1=*b-0、618*(*b-*a);x2=*a+0、618*(*b-*a);if(f(x1)>f(x2))*a=x1;else*b=x2;*n=*n+1;s=hj(a,b,e,n);}return s;}void main(){double s,a,b,e,m;int n=0;printf("输入a,b值与精度e值\n");scanf("%lf %lf %lf",&a,&b,&e);s=hj(&a,&b,e,&n);m=(a+b)/2;printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\n",a,b ,s,m,n);}运行过程及结果:输入a,b值与精度e值-350、0001a=3、279466,b=3、279793,s=22、659008,m=3、279629,n=213、二次插值法源程序:#include<stdio、h>#include<math、h> int main(void){double a1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j[3];int i,h=1;void finding(double a[3]);finding(j);a1=j[0];a2=j[1];a3=j[2];m=0、001;double f(double x);y1=f(a1);y2=f(a2);y3=f(a3);for(i=1;1>=1;i++){c1=(y3-y1)/(a3-a1);c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);ap=0、5*(a1+a3-c1/c2);yp=f(ap);if(fabs((y2-yp)/y2)<m)break;else if((ap-a2)*h>0){if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;}}else if(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;}else{a1=ap;y1=yp;}}double x,y;if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f\n",x);printf("y*=%f\n",y);return 0;}double f(double x){double y;y=x*x-10*x+36;return y;}void finding(double a[3]){int h,i;double y[3];a[0]=0;h=1;a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]);if(y[1]>y[0]){h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]);h=2*h;}while(y[2]<y[1]);}else{for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]);if(y[2]>=y[1])break;h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}运行过程及结果:a*=5、000000y*=11、0000004、坐标轮换法源程序:#include <stdio、h>#include <math、h>#include <conio、h>float fun1(float x,float a,float b) {float y;y=x+a*b;return y;}float fun2(float x,float y){float z;z=4*(x-5)*(x-5)+(y-6)*(y-6);return z;}main(){float d[100][3],x[100][3],xx[3],ax[100][3]; float a1,a2,a3,h,t,y1,y2,y3,e,a,b,l,fi;int i,k;printf("输入初始点坐标\n");scanf("%f%f",&x[0][1],&x[0][2]);e=0、000001;l=0、618;x[2][1]=x[0][1];x[2][2]=x[0][2];k=0;k--;do{x[0][1]=x[2][1];x[0][2]=x[2][2];k++;for(i=1;i<=2;i++){if(i==1){d[i][1]=1;d[i][2]=0;}else{d[i][1]=0;d[i][2]=1;}h=0、1;a1=0;a2=h;x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);if(y2>y1){h=-h;a3=a1;y3=y1;a1=a2;a2=a3;y1=y2;y2=y3;}a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3);y3=fun2(x[i][1],x[i][2]);do{a1=a2;y1=y2;a2=a3;y2=y3;a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3);y3=fun2(x[i][1],x[i][2]);}while(y3<y2);for(;a1>a3;){t=a3;a3=a1;a1=t;t=y1;y3=y1;y1=t;}a=a1;b=a3;a1=b-l*(b-a);a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);if(b<1e-3){for(;fabs(b-a)>e;){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}else{for(;fabs((b-a)/b)>=e||fabs((y2-y1)/y2)>=e; ){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}ax[k][i]=0、5*(a+b);x[i][1]=fun1(x[i-1][1],d[i][1],ax[k][i]);x[i][2]=fun1(x[i-1][2],d[i][2],ax[k][i]);}}while(sqrt(pow((x[2][1]-x[0][1]),2)+pow((x[2][2]-x[0][2]),2))>=1e-6);xx[1]=x[2][1];xx[2]=x[2][2];fi=fun2(xx[1],xx[2]);printf("最优解为\nx1*=%f\nx2*=%f\nf*=%f\nk=%d\n",xx[1],xx[2],fi,k);}运行过程及结果:输入初始点坐标89最优解为x1*=5、000000x2*=6、000000f*=0、000000k=25、随机方向法源程序:#include<math、h>#include<stdio、h>#include<stdlib、h>float f(float x,float y){float z;z=(x-2)*(x-2)+(y-1)*(y-1);return z;}float g1(float x,float y){float z;z=x*x-y;return z;}float g2(float x,float y){float z;z=x+y-2;return z; }void main(){int i,j;float k=8,c=0、000001,a0=-3,b0=3,a1=-3,b1=3;floatx[10],x0[10],xl[10],e[10],r[10],d[10],h,fl,f0,fx; while(g1(x0[0],x0[1])>0||g2(x0[0],x0[1])>0) {x0[0]=a0+(rand()/32767、00)*(b0-a0);x0[1]=a1+(rand()/32767、00)*(b1-a1);}fl=f(x0[0],x0[1]);f0=f(x0[0],x0[1]);while(1){h=0、01;j=1;r[0]=-1+(rand()/32767、00)*(1-(-1));r[1]=-1+(rand()/32767、00)*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}while(j<=k){j++;r[0]=-1+(rand()/32767、00)*(1-(-1));r[1]=-1+(rand()/32767、00)*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}}x[0]=xl[0];x[1]=xl[1];while(1){h=1、3*h;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)break;fx=f(x[0],x[1]);if(fx<fl) fl=fx;else break;}do{x[0]=x[0]-h*d[0];x[1]=x[1]-h*d[1];h=0、7*h;if(h<c)break;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)continue;fx=f(x[0],x[1]);}while(fx>=fl);if(fabs((f0-fx)/f0)>=c){x0[0]=x[0];x0[1]=x[1];fl=fx;f0=fx;}elsebreak;}printf("输出最优解为\nx1*=%f,x2*=%f,y*=%f\n",x[0],x[1],fx);}运行过程及结果:输出最优解为x1*=0、995421,x2*=1、004521,y*=1、009200 6、四杆机构优化设计源程序:#include<math、h>#include<stdio、h>#include<stdlib、h>#define Pai 3、1415926int g(float l1,float l2){if((-l1<=0)&&(-l2<=0)&&(6-l1-l2<=0)&&(1-l2-4<=0)&&(l2-l1-4<=0)&&(l1*l1+l2*l2-1、414*l1*l2-16<=0)&&(36-l1*l1-l2*l2-1、414*l1*l2<=0))return (1);elsereturn (0);}float fun(float x0[2]){floatf,a[31],b[31],r[31],p[31],q[31],w[31],x1[2];int i;p[0]=acos(((1+x0[0])*(1+x0[0])-x0[1]*x0[ 1]+25)/(10+10*x0[0]));q[0]=acos(((1+x0[0])*(1+x0[0])-x0[1]*x0[ 1]-25)/(10*x0[1]));f=0;for(i=1;i<=30;i++){p[i]=p[0]+(Pai/60)*i;r[i]=sqrt(26-10*cos(p[i]));a[i]=acos((r[i]*r[i]+x0[1]*x0[1]-x0[0]*x0[ 0])/(2*r[i]*x0[1]));b[i]=acos((r[i]*r[i]+24)/(10*r[i]));q[i]=Pai-a[i]-b[i];w[i]=q[0]+(2*(p[i]-p[0])*(p[i]-p[0]))/(3*P ai);f=f+(Pai/60)*(q[i]-w[i])*(q[i]-w[i])*(p[i]-p [i-1]);}return f;}void main(){floata,q,f,fl,f0,l[2],z[2],d0[100],d1[100],x[2],xi[2],f x,m0,m1,e;int i,j,n,k;printf("输入精度");scanf("%f",&e);do{z[0]=0+5*(rand()/32767、00);z[1]=0+5*(rand()/32767、00);}while(g(z[0],z[1])==0);for(i=0;i<=99;i++){d0[i]=-1+2*(rand()/32767、00);}for(j=0;j<=99;j++){d1[j]=-1+2*(rand()/32767、00);}f0=fun(z);fl=fun(z);ss:a=0、01;for(i=0,j=0;i<=99&&j<=99;i++,j++) {n=1/sqrt((d0[i])*(d0[i])+d1[j]*d1[j]);d0[i]=n*d0[i];d1[j]=n*d1[j];x[0]=z[0]+a*d0[i];x[1]=z[1]+a*d1[j];if(g(x[0],x[1])==1){f=fun(x);if(f<fl){fl=f;m0=d0[i];m1=d1[j];l[0]=x[0];l[1]=x[1];}}}x[0]=l[0];x[1]=l[1];do{a=1、3*a;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==0)break;f=fun(x);if(f<fl)fl=f;else break;}while(g(z[0],z[1])==1);do{x[0]=x[0]-a*m0;x[1]=x[1]-a*m1;a=0、7*a;if(a<0、00001)break;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==1)f=fun(x);}while(f>=fl);if(fabs((f0-f)/f0)<e){xi[0]=x[0];xi[1]=x[1];fx=f;printf("最优解为\nx1*=%f\nx2*=%f\n fx=%f\n",xi[0],xi[1],fx);}else{f0=f;fl=f;z[0]=x[0];z[1]=x[1];goto ss;}}运行过程及结果:输入精度0、001最优解为x1*=4、161386x2*=2、311257fx=0、000021。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档