seven070223 seven070223
关注数: 28 粉丝数: 7 发帖数: 1,292 关注贴吧数: 26
求解Matlab最速下降法问题 写了个求解最速下降法的程序,但报错显示 ??? Error using ==> GR Too many output arguments. Error in ==> FastFlow at 21 Mini=GR(ff,Ga,Gb,Gepsilon,GN); 最速下降法M文件: function FastFlow(f,a,b,epsilon,N) syms x; syms y; v=[x,y]; j=jacobian(f,v); T=[subs(j(1),x,a),subs(j(2),y,b)]; temp=sqrt((T(1))^2+(T(2))^2); x1=a;y1=b; V=[x1,y1]; Ga=a;Gb=b;Gepsilon=epsilon;GN=N; n=0; syms kk; for n=1:N if (temp<=epsilon) disp('最优解是:');disp(V); else d=-T; f1=x1+kk*d(1);f2=y1+kk*d(2); fT=[subs(j(1),x,f1),subs(j(2),y,f2)]; ff=sqrt((fT(1))^2+(fT(2))^2); Mini=GR(ff,Ga,Gb,Gepsilon,GN); x0=x1+Mini*d(1); y0=y1+Mini*d(2); T=[subs(j(1),x,a),subs(j(2),y,b)]; temp=sqrt((T(1))^2+(T(2))^2); x1=a;y1=b; n=n+1; disp('最优解是:');disp(x0); disp('最优值是:');diso(y0); end end GR是黄金分割法,其M文件是: function GR(f,a,b,epsilon,N)%f为目标函数,a、b分别为单谷区间的上限和下限,epsilon为区间精度,N为迭代次数,在没有给定迭代次数的情况下,N一般取10000 f=inline(f); t1=a+0.382*(b-a); t2=a+0.618*(b-a); f1=f(t1); f2=f(t2); n=N; for k=1:n if f(t1)<=f(t2) if t2-a<=epsilon disp('最优值是:') f1 disp('最优解是:') t1 break; else b=t2; t2=t1; t1=b-0.618*(b-a); f2=f1; f1=f(t1); end else if b-t1<=epsilon disp('最优值是:') f2 disp('最优解是:') t1 break; else a=t1; t1=t2; t2=a+0.618*(b-a); f1=f2; f2=f(t2); end end end end 求各位帮小弟调试一下,该怎么改,谢谢
求学霸解答用matlab写分支定界法问题 有这么一个Matlab程序 function [x,fval,status]=intprog(f,A,b,Aeq,beq,lb,ub,I,e)%记I为整数约束,如果x1,x2为整数,则I=[1,2] if nargin < 10, options = []; if nargin < 9, x0 = []; if nargin < 8, ub = []; if nargin < 7, lb = []; if nargin < 6, Beq = []; if nargin < 5, Aeq = []; if nargin<4,w=1:dimx; end, end, end, end, end, end, end [x0,fval0,exitflag]=linprog(f,A,b,Aeq,beq,lb,ub,[]);%求整数规划对应的线性规划,判断是否有解 if exitflag<0 disp('没有整数解'); x=x0;fval=fval0;status=exitflag; return; else u=inf;%定义一个上界,并取值无穷 [x,fval,status]=branchbound(f,A,b,Aeq,beq,lb,ub,I,x0,fval0,u,e);%调用分支定界法 end function [newx,newfval,status,newbound]=branchbound(f,A,b,Aeq,beq,lb,ub,I,x,fval,u,e)%定义分支定界法 [x0,fval0,status0]=linprog(f,A,b,Aeq,beq,lb,ub,[]); if status0<=0||fval0>=u%È如果无解或出现比现有上界大则返回原值 newx=x; newfval=fval;newu=u; status=status0; return; end %是否为整数解,如果是整数解则返回 intindex=find(abs(x0(I)-round(x0(I)))>e); if isempty(intindex)%isempty用於判断一个数组是否是空的 new(I)=round(x0(I));newfval=fval0;newu=fval0;status=1; return; end %当有非整可行解时,进行分支求解 n=I(intindex(1)); addA=zeros(1,length(f));%构造一个1行length(f)列的零矩阵 addA(n)=1; %构造第一个分支 A=[A;addA]; b=[b,floor(x(n))];%floor表示向负方向舍入 [x1,fval1,status1,bound1]=branchbound(f,A,b,Aeq,beq,lb,ub,x0,fval0,e); A(end,:)=[];%A(end,:)表示矩阵A的最后一行,任意列 b(:,end)=[]; %解第一个分支,若为更优解则替换,如不是则保持原状´ status=status1; if status1>0&&bound1<bound newx=x1; newfval=fval; bound=fval1; newbound=bound1; else newx=x0; newfval=fval0; newbound=bound; end %构造第二分支 A=[A;-addA]; b=[b,-ceil(x(n))];%ceil表示向正方向舍入 [x2,fval2,status2,bound2]=branchbound(f,A,b,Aeq,beq,lb,ub,x0,fval0,e); A(end,:)=[]; b(:,end)=[]; %解第二分支,并与第一分支作比较,如果更优则替换 if status2>0&&bound2<bound status=status2; newx=x2; newfval=fval2; newbound=bound2; end 想问一下 %是否为整数解,如果是整数解则返回 intindex=find(abs(x0(I)-round(x0(I)))>e); if isempty(intindex)%isempty用於判断一个数组是否是空的 new(I)=round(x0(I));newfval=fval0;newu=fval0;status=1; return; end 这步是什么意思呢,看不懂.....
1 下一页