/*
tt ---- 一维搜索初始步长
ff ---- 差分法求梯度时的步长岩链迟
ac ---- 终止迭代收敛精度
ad ---- 一维搜索收敛精度
n ----- 设计变量的维数
xk[n] -- 迭代初始点
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#define tt 0.01
#define ff 1.0e-6
#define ac 1.0e-6
#define ad 1.0e-6
#define n 2
double ia
double fny(double *x)
{
double x1=x[0],x2=x[1]
double f
f=x1*x1+2*x2*x2-4*x1-2*x1*x2
return f
}
double * iterate(double *x,double a,double *s)
{
double *x1
int i
x1=(double *)malloc(n*sizeof(double))
for(i=0i<ni++)
x1[i]=x[i]+a*s[i]
return x1
}
double func(double *x,double a,double *s)
{
double *x1
double f
x1=iterate(x,a,s)
f=fny(x1)
return f
}
void finding(double a[3],double f[3],double *xk,double *s)
{
double t=tt
int i
double a1,f1
a[0]=0f[0]=func(xk,a[0],s)
for(i=0i++)
{
a[1]=a[0]+t
f[1]=func(xk,a[1],s)
if(f[1]<f[0]) break
if(fabs(f[1]-f[0])>=ad)
{
t=-t
a[0]=a[1]f[0]=f[1]
}
else
{
if(ia==1) return//break
t=t/2ia=1
}
}
for(i=0i++)
{
a[2]=a[1]+t
f[2]=func(xk,a[2],s)
if(f[2]>f[1]) break
t=2*t
a[0]=a[1]f[0]=f[1]
a[1]=a[2]f[1]=f[2]
}
if(a[0]>a[2])
{
a1=a[0]
f1=f[0]
a[0]=a[2]
f[0]=f[2]
a[2]=a1
f[2]=f1
}
return
}
double lagrange(double *xk,double *ft,double *s)
{
int i
double a[3],f[3]
double b,c,d,aa
finding(a,f,xk,s)
for(i=0i++)
{
if(ia==1) { aa=a[1]*ft=f[1]break}
d=(pow(a[0],2)-pow(a[2],2))*(a[0]-a[1])-(pow(a[0],2)-pow(a[1],2))*(a[0]-a[2])
if(fabs(d)==0) break
c=((f[0]-f[2])*(a[0]-a[1])-(f[0]-f[1])*(a[0]-a[2]))/d
if(fabs(c)==0) break
b=((f[0]-f[1])-c*(pow(a[0],2)-pow(a[1],2)))/(a[0]-a[1])
aa=-b/(2*c)
*ft=func(xk,aa,s)
if(fabs(aa-a[1])<=ad) {if(*ft>f[1]) aa=a[1]break}
if(aa>a[1])
{
if(*ft>粗李f[1]) {a[2]=aaf[2]=*ft}
else if(*ft<f[1]) {a[0]=a[1]a[1]=aaf[0]=f[1]f[1]=*ft}
else if(*ft==f[1])
{
a[2]=aaa[0]=a[1]
f[2]=*ftf[0]=f[1]
a[1]=(a[0]+a[2])/2
f[1]=func(xk,a[1],s)
}
}
else
{
if(*ft>f[1]) {a[0]=aaf[0]=*ft}
else if(*ft<f[1]) {a[2]=a[1]a[1]=aaf[2]=f[1]f[1]=*ft}
else if(*ft==f[1])
{a[0]=aaa[2]=a[1]
f[0]=*ftf[2]=f[1]
a[1]=(a[0]+a[2])/2
f[1]=func(xk,a[1],s)
}
}
}
if(*ft>f[1]) {*ft=f[1]aa=a[1]}
return aa
}
double *gradient(double *xk)
{
double *g,f1,f2,q
int i
g=(double*)malloc(n*sizeof(double))
f1=fny(xk)
for(i=0i<ni++)
{q=ff
xk[i]=xk[i]+qf2=fny(xk)
g[i]=(f2-f1)/qxk[i]=xk[i]-q
}
return g
}
double * bfgs(double *xk)
{
double u[n],v[n],h[n][n],dx[n],dg[n],s[n]
double aa,ib
double *ft,*xk1,*g1,*g2,*xx,*x0=xk
double fi
int i,j,k
ft=(double *)malloc(sizeof(double))
xk1=(double *)malloc(n*sizeof(double))
for(i=0i<ni++)
{
s[i]=0
for(j=0j<nj++)
{
h[i][j]=0
if(j==i) h[i][j]=1
}
}
g1=gradient(xk)
fi=fny(xk)
x0=xk
for(k=0k<nk++)
{
ib=0
if(ia==1) { xx=xkbreak}
ib=0
for(i=0i<ni++) s[i]=0
for(i=0i<ni++)
for(j=0j<nj++)
s[i]+= -h[i][j]*g1[j]
aa=lagrange(xk,ft,s)
xk1=iterate(xk,aa,s)
g2=gradient(xk1)
for(i=0i<ni++)
if((fabs(g2[i])>=ac)&&(fabs(g2[i]-g1[i])>=ac))
{ib=ib+1}
if(ib==0) { xx=xk1break}
fi=*ft
if(k==n-1)
{ int j
xk=xk1
for(i=0i<ni++)
for(j=0j<nj++)
{
h[i][j]=0
if(j==i) h[i][j]=1
}
g1=g2k=-1
}
else
{
int j
double a1=0,a2=0
for(i=0i<ni++)
{
dg[i]=g2[i]-g1[i]
dx[i]=xk1[i]-xk[i]
}
for(i=0i<ni++)
{
int j
u[i]=0v[i]=0
for(j=0j<nj++)
{
u[i]=u[i]+dg[j]*h[j][i]
v[i]=v[i]+dg[j]*h[i][j]
}
}
for(j=0j<nj++)
{
a1+=dx[j]*dg[j]
a2+=v[j]*dg[j]
}
if(fabs(a1)!=0)
{
a2=1+a2/a1
for(i=0i<ni++)
for(j=0j<nj++)
h[i][j]+=(a2*dx[i]*dx[j]-v[i]*dx[j]-dx[i]*u[j])/a1
}
xk=xk1g1=g2
}
}
if(*ft>fi) { *ft=fixx=xk}
xk=x0
return xx
}
void main ()
{
int k
double *xx,f
double xk[n]={1,1}
xx=bfgs(xk)
f=fny(xx)
printf("\n\nThe Optimal Design Result Is:\n")
for(k=0k<nk++)
{printf("\n\tx[%d]*=%f",k+1,xx[k])}
printf("\n\tf*=%f",f)
getch()
}
这是基于一本书上的算法。但我很奇怪,原书中的算法有结果列出,但是我却不能通过编译。真是纳闷!修改后可以得到结果了,如果你要使用这个简单的程序,你只需更改 维数n、double fny(double *x)的实现部分以及main函数中的xk初值就可以了。不过这个程序也不是很好。
机械设计的一般步骤是1.充分了解客户需轮首森要解决什么样的问题或实现什么样的功能;2.制定设计方案;3.制作模型或输出图纸;4.模拟、评估、及优化;腊亩5.设计的实现,及按设计方案或图纸实现产品制作;6.产品测试,是否满足客户需求;7.产品交付。
设计机械应满足的基本要求是:
(1)良好的使用性能 实现预期功能,满足使用要求。 *** 作容易,保养简单,维修方便。不必追求“多功能”,因为“多功能”会增加成本,降低可靠性。
(2)安全 许多重大事故出自机械故障。密封件泄露导致“挑战者号”航天飞机失事,起落架故障引发空难,刹车失灵酿成车祸,频繁出现的汽车“召回”更暴露机械设计不良造成的安全隐患。机械设计必须以人为本。凡关系到人身安全或重大设备事故的零、部件都必须进行认真、严格的设计计算或校核计算,不能凭经验或以“类比”代替。
计算说明书应妥善保留,以备核查。暴露的运动构件要配以防护网。易造成人身伤害的部位必须有安全连锁装置或实施远距离 *** 纵。电气元件、导线的规格和安装必须符合安全标准。初次之外,为了保护设备,还应设置保险销、安全阀等过载保护装置以及红灯、警铃等警示装置。
(3)可靠、耐用 在预定的使用期限内不发生或极少发生故障。大修或更换易损件的周期不宜太短,以免经常停机影响生产。但是,也不宜过分强调“耐用”。现代化生产推行定期更新和预期强制报废,个别零、部件的“长寿”对整机并无实际意义。因追逐“耐用”而芹锋滥用贵重材料突然增加成本。
(4)经济 设计中应尽可能多选用标准件和成套组件,它们不仅可靠、廉价,而且能大大节省设计工作量。可以说,设计中使用标准件的多少是评价设计水平的重要标志。要重视节约贵重原材料,降低成本。零件设计必须关注加工工艺性,力求减少加工费用。良好的经济性不仅体现在制造成本低廉,更应体现在机器使用中的高效率、低效能。
(5)符合环保要求 机器噪声不超标。不采用石棉等禁用的原材料。确保机械使用过程中不会泄漏水、油、粉尘和烟雾。生产中的废水、废气必须经过治理,达标排放。
f(x)x呢?
牛顿法不知道,但知道用拉格朗日法。差数漏不过这个方法是求条件极值的。象你这样毕亏的函数用普通方法就可以了。
f(x,y)=x^2-2*x+2*y^2+4*y+5
f'x(x,y)=2*x-2
f'y(x,y)=4*y+4
令
f'x(x,y)=0
f'y(x,y)=0
求得 x=1,y=-1
得极值是1-2+2-4+5=2
至于判断是最大值,或最小值,方法忘记了,好像还要计算2介虚烂导数的
编程,就很难了,不会
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)