motepasserby 发表于 2012-10-8 15:22

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位

happy 发表于 2012-10-19 09:41

function里边定义function?
说实话,第一次见到这种编程方式的 function ww=wcvm()连优化变量都没有

总而言之,是一段让人无语的代码

ChaChing 发表于 2012-10-19 21:57

function里边定义function?
好像较新版些很早就有!
不过, 个人不太喜欢/习惯如此用

rocwoods 发表于 2012-10-21 16:03

happy 发表于 2012-10-19 09:41 static/image/common/back.gif
function里边定义function?
说实话,第一次见到这种编程方式的连优化变量都没有



嗯,这个是MATLAB 7.0开始增加的嵌套函数功能,很方便参数传递和内存共享。不过楼主没有掌握好,用得很别扭,那个wcvm函数是个没有输入变量得函数,怎么用fmincon来优化?
建议楼主还是理清变量传递逻辑关系,再好好研究下嵌套函数的用法。

happy 发表于 2012-10-22 19:39

rocwoods 发表于 2012-10-21 16:03 static/image/common/back.gif
嗯,这个是MATLAB 7.0开始增加的嵌套函数功能,很方便参数传递和内存共享。不过楼主没有掌握好,用得很别 ...

好几年没太接触matlab了,个人一致停留在2009的阶段
不过个人一致非常反感这种所谓编程方式的改进
虽然在某些方面是方便了,但是不利于良好的编程习惯的形成
很难产出高质量的代码?

一直以来还是比较欣赏Fortran77的格式,虽然麻烦点,不过逻辑性很好
一段没有goto的Fortran77代码,堪称完美

rocwoods 发表于 2012-10-22 22:27

本帖最后由 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的初始化时间太长,反而较大型的应用适合。

motepasserby 发表于 2012-11-2 22:14

rocwoods 发表于 2012-10-21 16:03 static/image/common/back.gif
嗯,这个是MATLAB 7.0开始增加的嵌套函数功能,很方便参数传递和内存共享。不过楼主没有掌握好,用得很别 ...

感谢rocwoods的回答和各位的讨论,确实是变量传递时出了问题。
页: [1]
查看完整版本: fimincon在做含多参数分段函数优化、积分和嵌套的复杂应用时报错