在调用myfun之后,新的参数化不会影响结果,这符合第一次调用

时间:2013-09-04 17:54:49

标签: octave

我是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

1 个答案:

答案 0 :(得分:0)

我假设你提到的myfunmle_garch。问题在于您初始化全局hv变量的方式(您真的需要它们是全局变量吗?)。当你有一段这样的代码时

global y = (diff(log(p))-mean(diff(log(p))))*100;
global h = zeros(size(y));

yh的值仅在第一次定义。您可以稍后更改其值,但此特定行将永远不会再次运行。由于您的代码仅使用输入参数来定义这两个变量,因此第一次运行该函数时使用的值将每隔一次使用一次。如果您确实希望将这些变量保持全局,请将其替换为以下内容:

global y;
global h;
y = (diff(log(p))-mean(diff(log(p))))*100;
h = zeros(size(y));

但我认为没有任何理由让它们保持全球化,所以只是不要让它们全球化。

另外,您提到此代码在Matlab中运行良好。我的印象是你无法在Matlab中初始化全局变量和持久变量,这会使你的代码在Matlab中成为非法。