0

我是 Octave 的新手,尽管我可以说我是一名专业的 Matlab 用户。我在 Windows 机器上通过 PuTTY 在 Linux 服务器(Red Hat)上远程运行 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
4

1 回答 1

0

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

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 中非法。

于 2013-09-04T20:45:46.273 回答