sun2006 发表于 2007-5-13 10:18

请教Matlab编程问题

在做数值试验(优化方面的)时,程序出现了如下问题:
??? One or more output arguments not assigned during call to ‘……\ADTRR.m (ADTRR)'.

在网上查了一下说是:
调用的某个函数应该是有输出的,但是该输出在函数内部没定义。

但我一直查不出是那里错了,哪位大虾能帮我看一下程序??
谢谢了!!!


程序文件一共有四个:ADTRR.m   test1.m   f.m   g.m

f.m   g.m是两个被调用的函数
f.m---------------------------------------------------------
%   目标函数f(x)
function f=f(x,N)
f=0;
for i=1:N/2
    f=f+(x(2*i)-x(2*i-1)^2)^2+(1-x(2*i-1))^2;
end

g.m------------------------------------------------------
%   求目标函数f(x)的梯度。
function g=g(x,N)
for i=1:N/2
    g(2*i-1)=-4*x(2*i-1)*(x(2*i)-x(2*i-1)^2)+2*(x(2*i-1)-1);
    g(2*i)=2*(x(2*i)-x(2*i-1)^2);
end

------------------------------------------------------------------------------------
ADTRR.m是算法的主要部分
function=ADTRR(x0,bk,epsilon,c0,c2,c6,n)%,L_lower,L_upper
fid=fopen('f_data.txt','wt')
g0=g(x0,n)
NG=1;
N_g0=norm(g0);
delta=N_g0;
f0=f(x0,n)
NF=1;
k=0;
while(N_g0>epsilon)
   
       for i=1:n
      A(i)=(1/bk(i))*g0(i)
    end
   
    N_A=norm(A)
    if N_A<=delta
      dk=-A
    else
      dk=-(delta/N_A)*A
    end
   
    x=x0+dk
       N_dk=norm(dk);B=diag(bk)
       Predk=-(g0*dk'+0.5*dk*B*dk');%%%%%%%%%%%%%%%%???????????/B
       f1=f(x,n);NF=NF+1;
       Aredk=f0-f1;
       rk=Aredk/Predk;%%%%%%%%%%
      
    if rk<=c0
         c6=c6/4;
       else
         x0=x;
         g1=g(x,n);NG=NG+1;
         yk=g1-g0;
         N_yk=norm(yk);
         c6=N_dk/N_yk;%%%%%%%
         
         
         
         L_lower=0.1*(norm(g1))^2;
         L_upper=L_lower+10;
         
         for i=1:n
               if dk(i)==0
                   bk(i)=(L_lower+L_upper)/2;
                                 
               else
                  a=yk(i)/dk(i);%%%%%%%%%%%
                   if a<L_lower
                     bk(i)=L_lower;
                   elseif a>L_upper
                     bk(i)=L_upper;
                   else
                     bk(i)=a;
                   end   
                  
               end
         end
         f0=f1;
         g0=g1;
         N_g0=norm(g0);
       end
       if rk>=c2
         delta=max(c6*N_g0,4*N_dk);
       else
         delta=c6*N_g0;
       end
       k=k+1
       %fprintf(fid,'%f   %f\n',x0,f0)
       fprintf(fid,'%f\n',f0)
end
fclose(fid);
----------------------------------------------------------------
test1.m 测试函数

clc         %清屏
clear all   %清除工作空间中的变数
N=8;                         %N的值可以改动,但必须是2的倍数
for i=1:N/2
    x(2*i-1)=-1.2;
    x(2*i)=1.0;
end
x
epsilon=0.001;
bk=ones(1,N)
c0=0.1;
c2=0.25;
c6=8;
%L_lower=1;
%L_upper=2;

=ADTRR(x,bk,epsilon,c0,c2,c6,N)%,L_lower,L_upper

我已经把程序上传了!!

[ 本帖最后由 eight 于 2007-5-14 00:08 编辑 ]

pengweicai 发表于 2007-5-13 10:37

ADTRR.m中
两个输出参数 fopt,t最后没有给定值啊,所以调用的时候出错。

huright 发表于 2007-5-13 10:41

嗯,楼上说的对。返回参数fopt,t没定义。

sun2006 发表于 2007-5-13 21:21

hehe 谢谢
程序可以通过了!!
非常感谢!!!

:handshake :handshake :handshake
页: [1]
查看完整版本: 请教Matlab编程问题