① 最速下降法的c语言编程,急求大神
// this program made by lusiyuan
#include<stdio.h>
#include<math.h>
#define N 10
#define eps pow(10,-6)
double f(double x[],double g[],double t)
{
double s;
s=pow(x[0]-t*g[0],2)+4*pow(x[1]-t*g[1],2);
return s;
}
void sb(double *a,double *b,double x[],double g[])
{
double t0,t1,t,h,alpha,f0,f1;
int k=0;
t0=10; /*初始值*/
h=1; /*初始步长*/
alpha=2; /*加步系数*/
f0=f(x,g,t0);
t1=t0+h;
f1=f(x,g,t1);
while(1)
{
if(f1<f0)
{
h=alpha*h; t=t0;
t0=t1; f0=f1;
k++;
}
else
{
if(k==0)
{h=-h;t=t1;}
else
{
*a=t<t1?t:t1;
*b=t>t1?t:t1;
break;
}
}
t1=t0+h;
f1=f(x,g,t1);
}
}
double hjfg(double x[],double g[])
{
double beta,t1,t2,t;
double f1,f2;
double a=0,b=0;
double *c,*d;
c=&a,d=&b;
sb(c,d,x,g);
printf("\n[a,b]=[%lf,%lf]",a,b);
beta=(sqrt(5)-1.0)/2;
t2=a+beta*(b-a); f2=f(x,g,t2);
t1=a+b-t2; f1=f(x,g,t1);
while(1)
{
if(fabs(t1-t2)< eps)
break;
else
{
if(f1<f2)
{
t=(t1+t2)/2; b=t2;
t2=t1; f2=f1;
t1=a+b-t2; f1=f(x,g,t1);
}
else
{
a=t1; t1=t2;
f1=f2; t2=a+beta*(b-a);
f2=f(x,g,t2);
}
}
}
t=(t1+t2)/2;
return t;
}
void zsxjf()
{
double x[N],g[N],t=0,f0,mod;
int i,n;
printf("请输入n(为几元函数)=");
scanf("%d",&n);
printf("\n请输入初始值:\n");
for(i=0;i<n;i++)
scanf("%lf",&x[i]);
f0=f(x,g,t);
g[0]=2*x[0]; g[1]=8*x[1];
t=hjfg(x,g);
printf("\nt=%lf",t);
while(1)
{
mod=sqrt(pow(g[0],2)+pow(g[1],2));
printf("\nmod=%lf",mod);
if(mod<eps)
break;
else
{
x[0]=x[0]-t*g[0];
x[1]=x[1]-t*g[1];
f0=f(x,g,t);
g[0]=2*x[0];
g[1]=8*x[1];
t=hjfg(x,g);
}
printf("\n-----------------------------------------------");
printf("\nt=%lf",t);
}
printf("\n最优解为:x%d=%lf,x%d=%lf",1,x[0],2,x[1]);
printf("\n函数最有值为:f=%lf",f(x,g,t));
}
int main()
{
zsxjf();
}
编译通过,这种代码很好写的。
② 请教高手帮忙编程序~~用matlab编写数值优化方法(最速下降法,惩罚函数法),具体题目如下:
例1 求 f = 2 在0<x<8中的最小值与最大值
主程序为wliti1.m:
f='2*exp(-x).*sin(x)';
fplot(f,[0,8]); %作图语句
[xmin,ymin]=fminbnd (f, 0,8)
f1='-2*exp(-x).*sin(x)';
[xmax,ymax]=fminbnd (f1, 0,8)
运行结果:
xmin = 3.9270 ymin = -0.0279
xmax = 0.7854 ymax = 0.6448
★(借助课件说明过程、作函数的图形)
例2 对边长为3米的正方形铁板,在四个角剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大?
设剪去的正方形的边长为x,则水槽的容积为: ,建立无约束优化模型为:min y=- , 0<x<1.5
先编写M文件fun0.m如下:
function f=fun0(x)
f=-(3-2*x).^2*x;
主程序为wliti2.m:
[x,fval]=fminbnd('fun0',0,1.5);
xmax=x
fmax=-fval
运算结果为: xmax = 0.5000,fmax =2.0000.即剪掉的正方形的边长为0.5米时水槽的容积最大,最大容积为2立方米.
★(借助课件说明过程、作函数的图形、并编制计算程序)
例3
1、编写M-文件 fun1.m:
function f = fun1 (x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
2、输入M文件wliti3.m如下:
x0 = [-1, 1];
x=fminunc(‘fun1’,x0);
y=fun1(x)
3、运行结果:
x= 0.5000 -1.0000
y = 1.3029e-10
★(借助课件说明过程、作函数的图形并编制计算程序)
例4 Rosenbrock 函数 f(x1,x2)=100(x2-x12)2+(1-x1)2 的最优解(极小)为x*=(1,1),极小值为f*=0.试用不同算法(搜索方向和步长搜索)求数值最优解.初值选为x0=(-1.2 , 2).
为获得直观认识,先画出Rosenbrock 函数的三维图形, 输入以下命令:
[x,y]=meshgrid(-2:0.1:2,-1:0.1:3);
z=100*(y-x.^2).^2+(1-x).^2;
mesh(x,y,z)
画出Rosenbrock 函数的等高线图,输入命令:
contour(x,y,z,20)
hold on
plot(-1.2,2,' o ');
text(-1.2,2,'start point')
plot(1,1,'o')
text(1,1,'solution')
f='100*(x(2)-x(1)^2)^2+(1-x(1))^2';
[x,fval,exitflag,output]=fminsearch(f, [-1.2 2])
运行结果:
x =1.0000 1.0000
fval =1.9151e-010
exitflag = 1
output =
iterations: 108
funcCount: 202
algorithm: 'Nelder-Mead simplex direct search'
★(借助课件说明过程、作函数的图形并编制计算程序)
(五)、 作业
陈酒出售的最佳时机问题
某酒厂有批新酿的好酒,如果现在就出售,可得总收入R0=50万元(人民币),如果窖藏起来待来日(第n年)按陈酒价格出售,第n年末可得总收入 (万元),而银行利率为r=0.05,试分析这批好酒窖藏多少年后出售可使总收入的现值最大. (假设现有资金X万元,将其存入银行,到第n年时增值为R(n)万元,则称X为R(n)的现值.)并填下表:
③ 用MATLAB解决最小二乘解的题
这个题目本质上就是个二次函数的求极值问题。
(1)首先将式子化简
如图
(2)代入下列函数中函数中
2.1
最速下降法子函数(代码)
2.2
拟牛顿法(对秩1
子函数代码)
2.3
bfgs子函数代码
2.3
dfp(子函数代码)
(3)上述过程包含了计算的步骤,可以用optimtool设置方法来求解并得到过程。本来想给你结果的,分数太少,就不写上去了。