声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 799|回复: 3

[编程技巧] 请教Matlab编程问题

[复制链接]
发表于 2007-5-13 10:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在做数值试验(优化方面的)时,程序出现了如下问题:
??? 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[NF,NG,fopt,t]=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;

[NF,NG,fopt,t]=ADTRR(x,bk,epsilon,c0,c2,c6,N)%,L_lower,L_upper

我已经把程序上传了!!

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

ADTRR.m

1.64 KB, 下载次数: 7

f.m

106 Bytes, 下载次数: 6

g.m

160 Bytes, 下载次数: 6

test1.m

276 Bytes, 下载次数: 6

回复
分享到:

使用道具 举报

发表于 2007-5-13 10:37 | 显示全部楼层
ADTRR.m中
两个输出参数 fopt,t  最后没有给定值啊,所以调用的时候出错。

评分

1

查看全部评分

发表于 2007-5-13 10:41 | 显示全部楼层
嗯,楼上说的对。返回参数fopt,t没定义。
 楼主| 发表于 2007-5-13 21:21 | 显示全部楼层
hehe 谢谢
程序可以通过了!!
非常感谢!!!

:handshake :handshake :handshake
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-24 11:26 , Processed in 0.062984 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表