fimincon在做含多参数分段函数优化、积分和嵌套的复杂应用时报错
本帖最后由 motepasserby 于 2012-10-8 15:47 编辑各位大侠:
在用fimincon在做含多参数分段函数优化、积分和嵌套的复杂应用时报错,麻烦各位大侠看看,
多谢!
1.程序简述:funquantum1是关于x的分段函数,同时含有k(1),k(2),k(3),k(4)四个参数需要确定,接着对x进行积分并计算cramer-von mises统计量最终得到一个关于k(1),k(2),k(3),k(4)的函数wcvm,进而通过最优化方法,确定使得函数wcvm最小的k(1),k(2),k(3),k(4)估计值。
2.程序代码:
--------------------------------------------------------------------------------------------------------------------------------------------------
function funalltest4tohelp2%函数主要是通过优化的方法得到k(1),k(2),k(3),k(4)的估计值.
function fqx=funquantum1(x,k)%该函数是x的分段函数,且含有k(1),k(2),k(3),k(4)
%syms x;
fqx=((1./2.*k(1).^(-1./2)+1./4.*(k(2)+k(1)).*(k(3).^(-3./2))+1./2.*(k(2)+k(1)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2))))./k(2)+...
1./4.*(k(2)-k(1)).*(k(2).^(-3./2)).*sin(2.*(k(2).^(1./2)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2)))))+1./2.*(k(1).^(1./2)).*(k(2).^(-1))...
.*(1-cos(2.*(k(2).^(1./2)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2))))))+1./4.*(k(1)-k(2)).*(k(3).^(-3./2)).*cos(2.*(k(2).^(1./2))...
.*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2)))))...
-1./2.*((k(2).*k(1)).^(1./2)).*(k(3).^(-3./2)).*sin(2.*(k(2).^(1./2)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2)))))).^(-1))...%M
.*(exp(2.*(k(1).^(1./2)).*(x-k(4))).*(x<=k(4))+(1./2.*k(1).*(1-cos(2.*(k(2).^(1./2)).*(x-k(4))))./k(2)+1./2.*(1+cos(2.*(k(2).^(1./2)).*(x-k(4))))...
+((k(1)./k(2)).^(1./2)).*sin(2.*(k(2).^(1./2)).*(x-k(4)))).*((x>k(4))&(x<=(k(4)...
+(k(2).^(-1./2).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2)))))))...
+(1./2.*k(2).*(1-cos(2.*(k(2).^(1./2)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2))))))./k(3)...
+1./2.*k(1).*(1+cos(2.*(k(2).^(1./2)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2))))))./k(3)...
-((k(1).*k(2)).^(1./2)).*sin(2.*(k(2).^(1./2)).*((k(2).^(-1./2)).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2)))))./k(3))...
.*exp(-2.*(k(3).^(1./2)).*(x-(k(4)+(k(2).^(-1./2).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2))))))).*(x>(k(4)...
+(k(2).^(-1./2).*atan(((k(2)./k(1)).^(1./2)).*(k(1)+(k(1).*k(3)).^(1./2))./(k(2)-(k(1).*k(3)).^(1./2)))))));
end
shr=';
function vp=cvmtest(shr0,shr)
function px = edfx(xd,D) %返回在点x处的经验概率,经验概率函数由D决定
j = 1; m = 0;
l = length(D); %Compute length of D once
S = sort(D); %Puts data in ascending order
while S(j) <= xd
m = m + 1;
j = j + 1;
if j == l + 1
break
end
end
px = m/l;
end
for si=1:length(shr0)
fp(si) = quad(@(x)funquantum1(x,k),-0.09,shr0(si));%对funquantum1中的x进行积分,得到在shr0(si)处的累积概率
fpe(si) = edfx(shr0(si),shr);%调用嵌套函数edfx,得到在shr0(si)处的经验概率
ff(si) = funquantum1(shr0(si));%得到在shr0(si)处的概率密度
end
vp = (fp-fpe).^2.*ff;
end
function ww=wcvm()
ww=length(shr)*quad(@cvmtest,-0.09,0.09,[],[],shr)%对cvmtest中的shr0进行积分,最后得到关于k(1),k(2),k(3),k(4)的函数,积分限从-0.1到0.1
end
k0=;
A2=;
B2=0.09;
=fmincon(@wcvm,k0,A2,B2)%通过优化方法求使得函数wcvm最小的k(1),k(2),k(3),k(4)估计值
end
--------------------------------------------------------------------------------------------------------------------------------------------------
3.报错信息
--------------------------------------------------------------------------------------------------------------------------------------------------
??? Error using ==> funalltest4tohelp2>wcvm
Too many input arguments.
Error in ==> fmincon at 540
initVals.f = feval(funfcn{3},X,varargin{:});
Error in ==> funalltest4tohelp2 at 47
=fmincon(@wcvm,k0,A2,B2)%通过优化方法求使得函数wcvm最小的k(1),k(2),k(3),k(4)估计值
Caused by:
Failure in initial user-supplied objective function evaluation. FMINCON cannot continue.
--------------------------------------------------------------------------------------------------------------------------------------------------
4.系统及版本
matlab版本:2009b(64位)
windows7 64位
function里边定义function?
说实话,第一次见到这种编程方式的 function ww=wcvm()连优化变量都没有
总而言之,是一段让人无语的代码 function里边定义function?
好像较新版些很早就有!
不过, 个人不太喜欢/习惯如此用 happy 发表于 2012-10-19 09:41 static/image/common/back.gif
function里边定义function?
说实话,第一次见到这种编程方式的连优化变量都没有
嗯,这个是MATLAB 7.0开始增加的嵌套函数功能,很方便参数传递和内存共享。不过楼主没有掌握好,用得很别扭,那个wcvm函数是个没有输入变量得函数,怎么用fmincon来优化?
建议楼主还是理清变量传递逻辑关系,再好好研究下嵌套函数的用法。
rocwoods 发表于 2012-10-21 16:03 static/image/common/back.gif
嗯,这个是MATLAB 7.0开始增加的嵌套函数功能,很方便参数传递和内存共享。不过楼主没有掌握好,用得很别 ...
好几年没太接触matlab了,个人一致停留在2009的阶段
不过个人一致非常反感这种所谓编程方式的改进
虽然在某些方面是方便了,但是不利于良好的编程习惯的形成
很难产出高质量的代码?
一直以来还是比较欣赏Fortran77的格式,虽然麻烦点,不过逻辑性很好
一段没有goto的Fortran77代码,堪称完美
本帖最后由 rocwoods 于 2012-10-22 22:41 编辑
happy 发表于 2012-10-22 19:39 http://forum.chinavib.com/static/image/common/back.gif
好几年没太接触matlab了,个人一致停留在2009的阶段
不过个人一致非常反感这种所谓编程方式的改进
虽然 ...
个人觉得MATLAB本身是一个灵活性和高效性结合得很好的语言。但这是一把双刃剑,上手简单让很多人浅尝辄止,似懂非懂的时候便照猫画虎,有时虽然能做出来,但肯定不是很好的,这也是一些朋友更喜欢C/C++等语法检查严格的语言的原因之一。
不过个人觉得还是要肯定新技术的发展的,MATLAB 7.0以后的嵌套函数、匿名函数等大大方便了程序开发,面向对象编程等全面支持也使得实际工程中用MATLAB和C/C++混合开发大型软件的架构更清晰。如果还是6.5以前的MATLAB,实际比较大的工程中用MATLAB还是比较不方便的,很多工具箱不能编译。那时候更多是把MATLAB当成数学库来用,适合小型应用。
现在的MATLAB反过来了,小型应用不适合,一个MCR的初始化时间太长,反而较大型的应用适合。
rocwoods 发表于 2012-10-21 16:03 static/image/common/back.gif
嗯,这个是MATLAB 7.0开始增加的嵌套函数功能,很方便参数传递和内存共享。不过楼主没有掌握好,用得很别 ...
感谢rocwoods的回答和各位的讨论,确实是变量传递时出了问题。
页:
[1]