Resolve o problema de valor inicial na forma autônoma para um sistema de EDOs usando o método previsor-corretor Adams-Bashforth - Blog do Estudante de Atuariais

quinta-feira, 2 de maio de 2019

Resolve o problema de valor inicial na forma autônoma para um sistema de EDOs usando o método previsor-corretor Adams-Bashforth


function Y=ab4_am4(F,x,h,t1)
    // Y=ab4_am4(F,x,h,t1)
    // Resolve o problema de valor inicial na forma autônoma para um
    // sistema de EDOs usando o método previsor-corretor Adams-Bashforth/
    // Adams-Moulton de 4a ordem.
    // Os valores iniciais encontram-se no vetor "x" passado como
    // argumento de entrada, e o primeiro elemento
    // de "x" contém o valor inicial de t, t_0.
    // A função F pode ser passada de duas formas:
    // a) como um vetor coluna contendo as funções expressas como "strings",
    //    com as variáveis de interesse sendo especificadas em termos dos
    //    elementos do vetor "x", como por exemplo:
    //    ['1' ; 'x(1)' ; 'x(1)*x(3)' ; 'x(1)*x(2)-x(3)'];
    // b) como uma função definida externamente no Scilab, utilizando-se
    //    um arquivo com extensão ".sci", a qual deve ter um vetor coluna
    //    como argumento de entrada, o qual contém os valores das variáveis
    //    de interesse, e devolver um outro vetor coluna, o qual conterá
    //    os resultados das funções avaliadas nos valores das variáveis de
    //    interesse. Ambos os vetores devem ter a mesma quantidade de elementos.
    //    As variáveis de interesse devem ser especificadas em termos dos
    //    elementos do vetor de entrada, como no exemplo abaixo (equivalente
    //    ao exemplo no item "a"):
    //       function Y=F(X)
    //           Y(1) = 1
    //           Y(2) = X(1)
    //           Y(3) = X(1)*X(3)
    //           Y(4) = X(1)*X(2)-X(3)
    //       endfunction
    // (C) Rudnei Dias da Cunha 2015

    // Definição da função F, se passada como vetor coluna de funções
    // expressas como strings
    n = max(size(x));
    if type(F)==10 then
        m = max(size(F));
        if n~=m then
            mprintf('Erro, dimensões incompatíveis entre F e x\n')
            Y = [];
            return
        end
        s = "v=[";
        for i=1:m-1
            s = s+F(i)+";";
        end
        s = s+F(m)+"]";
        deff('[v]=F(x)',s);
    end

    // Iteração
    F0 = h*F(x);
    x=x+F0;
    F1 = h*F(x);
    x=x+F1;
    F2 = h*F(x);
    x=x+F2;
    F3 = h*F(x);
    k = 1
    while x(1)<t1
        mprintf("k=%d ",k) ; disp(x')
        Y(k,:) = x'
        y = x+1.0/24.0*(55*F3-59*F2+37*F1-9*F0);
        F0 = F1;
        F1 = F2;
        F2 = F3;
        F3 = h*F(y);
        x = x+1.0/24.0*(9*F3+19*F2-5*F1+F0);
        k = k+1
    end
endfunction

Nenhum comentário:

Postar um comentário