非常感谢,首先。第一个代码运行良好:
函数f = malibu(m1,m2,m3,k,l,t)
F =(M1 * K +(M1 + M2)* L。)* EXP(-m3 * T。);
端
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 :(得分: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,所以只有最后一次计算生效。看起来它应该输出一个恒定的值 - 没有用来优化它。您案例中的调用可能如下所示:
min_p = fminsearch(@(x)interpanemon(5,Ydata,x,m2,m3,Z,X,Y,kdata,ldata),1)
总的来说,它看起来非常不寻常 - 如果您能解释为什么选择这样做,它可能会有所帮助。如果您以更简单的形式重述问题,它也可能会有所帮助。