2012-02-25 74 views
0

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

function loglik= modelmalibu(p) 
global k l t x n m2 m3; 
f =malibu(p,m2,m3,k,l,t); 
if f==0; 
    loglik0=0; 
else 
loglik0=(x.*log(f)+(n-x).*log(1-f));%minus likelihood 
end 
loglik=sum(-loglik0); 
end 

clear all; 
global n t x k l m2 m3; 
m1=0.1; 
m2=0.2; 
m3=0.3; 
t=[1 3 6 9 12 18]'; 
k=[1 1 2 3 3 4]'; 
l=[0 0 1 3 4 5]'; 
y=meltem(m1,m2,m3,k,l,t); 
n=100;%trial 
x=y.*n;%correct replies 
pstart=0.3; 
[p1,modelvalue]=fminsearch(@modelmalibu,pstart); 

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

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,第一个代码塌下来为好。

+0

看起来你所有的“Mfile”只包含注释。你在这些文件的每一行前都有真正的“%”。如果是这种情况,那么你的代码没有太大的作用。否则,请修改您的帖子。 – Kavka 2012-02-26 03:01:11

+0

@Kavka,谢谢你的评论。我只想强调M-Files的一部分,但是我在你的评论后看到这个想法有多混乱。我按照你的建议编辑它。 – user1018331 2012-02-26 08:32:28

+0

我有一个问题,理解你的问题是什么。你能澄清吗? - 也许在一个小片段,或一个具体的例子。 – bdecaf 2012-02-26 08:58:36

回答

1

我认为你在混合两个概念。

矢量化:确实指出如何编写代码,以便它可以使用CPU中的某些加速功能。它与fminsearch无关。见:http://en.wikipedia.org/wiki/Vectorization_(parallel_computing

我想你要写你的函数,使它接受一个向量作为输入。最简单的方法是只用一个函数处理这样:

fh = @(x) my_complicated_function(const1, const2, x(1), x(2), x(3)) 

在这种情况下my_complicated_function有5个输入,你把第一个2常数和输入3暗淡矢量对另外3 Fminsearch将与合作。

你会打电话

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

除了一些提示代码:

  • 不要使用==对数字的比较 - 去如。 abs(x1-x2)<0.1而不是
  • interpanemon看起来很奇怪 - 它不会做什么人会说插值,如果你看 - 在每次迭代中重新计算p,所以只有最后一次计算才会生效。因为它看起来应该输出一个固定值 - 没有使用优化。
  • 使用预先计算的Z可能不是您想要的。它已经决定你的最佳状态。如果使用线性优化,则最佳值必须已经在Z中 - 无需进行插值。
  • 在你的情况下,调用可能看起来像:

    min_p = fminsearch(@(X)interpanemon(5,YDATA中,x,M2,M3,Z,X,Y,KDATA,LDATA),1)

总的来说,它看起来非常不寻常 - 如果你想解释这些想法,这真的可以帮助你为什么选择这样做。如果以更简单的形式重述问题,也可能有所帮助。

+0

,非常感谢您的帮助。显然,我是一个白痴,但我仍然不太了解。如果我不打扰你,请你解释一下:在开始时我假设我没有任何数据。我创建函数anemon(m1,m2,m3,X,Y,k,l),借助这个函数我在网格上创建一个函数Z(i,j,k,l) Y(j)),然后我确定网格点之间的点Xstar,Ystar的函数,并写入interpanemon(Xstar,Ystar,m1,m2,m3,Z,X,Y,k,l)。为了尽量减少interpanemon(5,Ydata,p,m2,m3,Z,X,Y,kdata,ldata)fminsearch应该为p做,但是:(。 – user1018331 2012-02-26 12:53:41

+0

hmmm ...起初我看到你的代码存在一些问题。我添加了一些提示: – bdecaf 2012-02-26 13:15:17

+0

变量数我得到了麻烦:(函数w = anemon(m1,m2,m3,X,Y,k,l) w =(m1。* k +(m1 + m2)。* l )+ X. * EXP(-m3 * Y); end'和模型'函数loglik = modelanemon(p) 全球NX平方米立方米XY KL; F =银莲花(p,M2,M3,X,Y, K,L); 如果f == 0; loglik0 = 0;否则 loglik0 =(x * log(f)+(n-x)* log(1-f));%减去似然性 结束 loglik = sum(-loglik0); end'不能用下面的脚本 – user1018331 2012-02-26 20:26:02