我是Octave的新手虽然我可以说我是Matlab的专家。我在Linux服务器(Red Hat)上通过PuTTY从Windows机器远程运行Octave。
我在Octave观察到一种非常奇怪的行为。我打电话给myfun(a),它按预期执行,给出了所需的结果。现在,如果我用b!= a运行myfun(b),我再次得到myfun(a)。清除-f无法解决问题。我需要重启八度音程来改变参数。
我做错了什么?
非常感谢 弗朗西斯
这是我提到的功能的代码:
function [a, v, obj, infos, iter] = mle_garch( p )
#{
% this function estimates the GARCH(1,1) parameters
% it is assumed we pass the adjusted price level p
#}
global y = (diff(log(p))-mean(diff(log(p))))*100;
global h = zeros(size(y));
a0 = [var(y)*0.9; 0.8; 0.1];
[a, obj, infos, iter] = sqp(a0, @loglike_garch, [], @loglike_con, [], [], 1000);
v = sqrt(h * 260);
endfunction
function g = loglike_garch( a )
global y h
n = length(y);
h(1) = var(y);
for i = 2 : n,
h(i) = a(1) + a(2) * h(i-1) + a(3) * y(i-1)^2;
endfor
g = 0.5 * ( sum(log(h)) + sum(y.^2./h) ) / n;
endfunction
function f = loglike_con( a )
f = [1;0;0;0] + [0 -1 -1;eye(3)] * a;
endfunction
答案 0 :(得分:0)
我假设你提到的myfun
是mle_garch
。问题在于您初始化全局h
和v
变量的方式(您真的需要它们是全局变量吗?)。当你有一段这样的代码时
global y = (diff(log(p))-mean(diff(log(p))))*100;
global h = zeros(size(y));
y
和h
的值仅在第一次定义。您可以稍后更改其值,但此特定行将永远不会再次运行。由于您的代码仅使用输入参数来定义这两个变量,因此第一次运行该函数时使用的值将每隔一次使用一次。如果您确实希望将这些变量保持全局,请将其替换为以下内容:
global y;
global h;
y = (diff(log(p))-mean(diff(log(p))))*100;
h = zeros(size(y));
但我认为没有任何理由让它们保持全球化,所以只是不要让它们全球化。
另外,您提到此代码在Matlab中运行良好。我的印象是你无法在Matlab中初始化全局变量和持久变量,这会使你的代码在Matlab中成为非法。