|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
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 编辑 ] |
|