Matlab 矢量化函数fminsearch

Matlab 矢量化函数fminsearch,matlab,math,mathematical-optimization,Matlab,Math,Mathematical Optimization,首先,非常感谢。第一个代码运行良好: 函数f=malibu(m1,m2,m3,k,l,t) f=(m1.*k+(m1+m2)。*l.*exp(-m3.*t); 结束 但是对于更多变量的类似代码给出了错误 function w=anemon(m1,m2,m3,X,Y,k,l) w=(m1.*k+(m1+m2).*l)+X.*exp(-m3.*Y); end function loglik= modelanemon(p) global n x m2 m3 X Y k l ; f =anemon(p

首先,非常感谢。第一个代码运行良好:
函数f=malibu(m1,m2,m3,k,l,t) f=(m1.*k+(m1+m2)。*l.*exp(-m3.*t); 结束

但是对于更多变量的类似代码给出了错误

function w=anemon(m1,m2,m3,X,Y,k,l)
w=(m1.*k+(m1+m2).*l)+X.*exp(-m3.*Y);
end

function loglik= modelanemon(p)
global n x m2 m3 X Y k l ;
f =anemon(p,m2,m3,X,Y,k,l);
if f==0;
    loglik0=0;
else
loglik0=(x*log(f)+(n-x)*log(1-f));%minus likelihood
end
loglik=sum(-loglik0);
end

clear;
global n x Ydata kdata ldata m1 m2 m3;
%parameters
m1=0.002;
m2=0.0001;
m3=7;
%given data
Xdata=[1 3 6 9 10 12]';
Ydata=[11 13 41 81 121 181]';
kdata=[1 1 2 4 5 4]';
ldata=[1 1 3 3 4 5]';
y=anemon(m1,m2,m3,Xdata,Ydata,kdata,ldata);
n=10;
x=y.*n;
pstart=2;
[pbest,modelvalue]=fminsearch(@modelanemon,pstart);

实际上,我已经尝试使用您的建议,但是如果我编写一个不等式而不是f==0,那么第一个代码也会失败。

我认为您混淆了两个概念

矢量化:指的是如何编写代码,以便它可以使用CPU中的一些加速功能。这与fminsearch无关。见:)

我想您希望编写函数,使其接受向量作为输入。最简单的方法是使用如下函数句柄:

fh = @(x) my_complicated_function(const1, const2, x(1), x(2), x(3) )
在本例中,我的函数有5个输入,取前2个常数,为其他3个输入一个3维向量。Fminsearch将处理这个问题

你会打电话的

 x_opt = fminsearch(fh, [1,2,3])

除了一些代码提示外:


  • 不要用
    ==
    来比较数字-比如说
    abs(x1-x2)看起来你所有的“Mfile”都只包含注释。这些文件中的每一行前面都有“%”吗。如果是这样的话,那么您的代码做的不多。否则,请编辑您的帖子。@Kavka,谢谢您的评论。我只想在M文件的部分下划线,但在你的评论之后,我发现这个想法是多么令人困惑。我按照你的建议编辑了它。我很难理解你的问题是什么。你能澄清一下吗也许是一个小片段,或者是一个特定的例子。@bdecaf,谢谢您的关注。当我为“anemon”这样的基本函数定义模型并希望在fminsearch中使用它时,它会运行。然后我想如果我有很多复杂的病例会发生什么。我编写的每个Mfile函数都单独运行良好,例如:interpanemon(3,5,m1,m2,m3,Z,X,Y,4,3)。但是fminsearch不喜欢复杂的函数。首先我想,我应该对我的函数进行调整,但它不起作用。可能,在这种情况下,fminsearce假设参数是常量。事实上,我不确定。非常感谢你的帮助。表面上,我是个白痴,但我还是不太明白。如果我不打扰你,请你解释一下:一开始我假设我没有任何数据。我创建函数anemon(m1,m2,m3,X,Y,k,l),通过这个函数,我在网格(X(I),Y(j))上创建一个函数Z(I,j,k,l)。然后我确定网格点之间的点Xstar,Ystar)的函数,并编写interpanemon(Xstar,Ystar,m1,m2,m3,Z,X,Y,k,l)(5,Ydata,p,m2,m3,Z,X,Y,kdata,ldata)fminsearch应该为p做这件事,但是:(.hmmm…起初我看到你的代码有一些问题。我添加了一些提示。变量数。我遇到了麻烦:(
    函数w=anemon(m1,m2,m3,X,Y,k,l)w=(m1.*k+(m1+m2)。*l)+X.*exp(-m3.*Y);end
    和model
    函数loglik=modelanemon(p)全局n×m2×m1×m1+m1+m2×m1;f=anemon(p,m2,m3,X,Y,k,l);如果f==0;loglik0=0;else loglik0=(X*log(f)+(n-X)*log(1-f));%负似然end loglik=sum(-loglik0);end
    不使用下面的相同脚本运行
    %script anemon clear;全局n X Ydata kdata ldata m1 m2 m3;%parameters m1=0.002;m2=0.0001;m3=7;%给定数据扩展数据=[1 3 6 9 10 12];Ydata=11 81]“;kdata=[1 1 2 4 5 4]”;ldata=[1 3 4 5]”;y=anemon(m1,m2,m3,Xdata,Ydata,kdata,ldata);n=10;x=y.*n;pstart=2;[pbest,modelvalue]=fminsearch(@modelanemon,2)
    运行良好
    函数f=malibu(m1,m2,m3,k,l,t)f=(m1.*k+(m1.*k+(m1+m2)。*l)。*exp.*t(-m3.*t);end
    和modelbu
    函数(lik=malibu=malibu=global)m=m1=m=m=m=m=m=m(p,m2,m3,k,l,t);如果f=0;loglik0=0;否则%f=(fones(41,1))*1;%0
    
     x_opt = fminsearch(fh, [1,2,3])