- 积分
- 57
- 注册时间
- 2006-1-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2007-11-8 14:45:41
|
显示全部楼层
来自 北京海淀
我算出来的结果是- x1= 5.176045131038809,
- x2=2.301301559119753,
- x3=0.566071813266631 minf=0.0690
- x1=4.837351077980695
- x2=2.438534929133349
- x3=0.615526123391624 minf=0.0646
- 应该有多组极小值,方法:先用蒙特卡罗法找到一个最小点,然后用该点作为初始值,用我以前发的randwalk函数或者MATLAB自带的fminunc来求解(fmincun的option设置下可能得到更好的结果)。说明,有时候不成功,busy时间长了,ctrl+c中断,多试两回。
- 代码如下:
- f=@(x) (x(1).^x(2)+x(2).^x(1)-5*x(1).*x(2).*x(3)-85).^2+(x(1).^3.*x(2).^x(3).*x(3).^x(2)-60).^2+(x(1).^x(3)+x(3).^x(1)-x(2)-0.55).^2;f
- x=unifrnd(0,10,100000,3);
- F=zeros(100000,1);
- for k=1:100000
- F(k)=f(x(k,:));
- end
- [Fmin,ind]=min(F);
- minx=x(ind,:);
- [xmin,minf]=fminunc(f,minx)
- 或者
- f=@(x) (x(1).^x(2)+x(2).^x(1)-5*x(1).*x(2).*x(3)-85).^2+(x(1).^3.*x(2).^x(3).*x(3).^x(2)-60).^2+(x(1).^x(3)+x(3).^x(1)-x(2)-0.55).^2;f
- x=unifrnd(0,10,100000,3);
- F=zeros(100000,1);
- for k=1:100000
- F(k)=f(x(k,:));
- end
- [Fmin,ind]=min(F);
- minx=x(ind,:);
- [mx,minf]=randwalk(f,minx,0.1,0.0001,100,3,3)
- randwalk的代码如下:
- function [mx,minf]=randwalk(f,x,lamda,epsilon,N,n,r)
- %随机行走法求函数的极小值。输入f为所求函数的句柄,
- %x为初始值。lamda为步长。epsilon为控制lamda的减小的阈值,即lamda减小到epsilon时迭代停止。
- %N为为了产生较好点的迭代控制次数。
- %n为单步循环行走次数,目的是尽可能走到全局最优点附近
- %函数返回值mx为n次试验得到的最优解,minf为响应的最优值。
- %r,函数的维数
- F=zeros(n,1);
- X=zeros(n,r);
- f1=f(x);
- while(lamda>=epsilon)
- k=1;
- while(k<=N)
- u=unifrnd(-1,1,n,r);
- for ii=1:n
- X(ii,:)=x+lamda*(u(ii,:)/norm(u(ii,:)));
- F(ii)=f(X(ii,:));
- end
- [f11,kk]=min(F);
- if f11<f1 %&& X(kk,1)>=13 && X(kk,1)<=100 && X(kk,2)>=0 && X(kk,2)<=100 && ((X(kk,1)-5)^2+(X(kk,2)-5)^2>=100)
- f1=f11;
- x=X(kk,:);
- k=1;
- else
- k=k+1;
- end
- end
- lamda=lamda/2;
- end
- mx=X(kk,:);
- minf=f1;
复制代码
[ 本帖最后由 rocwoods 于 2007-11-8 15:01 编辑 ] |
|