sábado, 10 de maio de 2025

Comparando Métodos Runge-Kutta Explícitos de Alta Ordem

 

As equações diferenciais ordinárias (EDOs) são a espinha dorsal da modelagem matemática em inúmeras áreas da ciência e engenharia. Elas descrevem como quantidades mudam ao longo do tempo ou espaço, capturando a dinâmica de fenômenos tão diversos quanto o movimento planetário, reações químicas, crescimento populacional, circuitos elétricos, sistemas mecânicos e a propagação de doenças. No entanto, encontrar soluções analíticas exatas para muitas EDOs, especialmente aquelas que surgem em problemas do mundo real, pode ser uma tarefa árdua ou mesmo impossível. É aqui que os métodos numéricos entram em cena, oferecendo ferramentas poderosas para aproximar as soluções dessas equações complexas. Dentre a vasta gama de técnicas numéricas disponíveis, os métodos de Runge-Kutta se destacam por sua eficiência e precisão na resolução de problemas de valor inicial (PVIs) para EDOs. Um PVI consiste em uma EDO acompanhada de uma condição inicial que especifica o valor da solução em um ponto particular. A ideia central dos métodos de Runge-Kutta é realizar múltiplas avaliações da função que define a EDO (a função que descreve a taxa de variação) dentro de cada passo de integração, combinando-as de forma ponderada para obter uma aproximação mais acurada da solução no próximo ponto. 

Os métodos de Runge-Kutta são classificados como métodos de passo simples, o que significa que a aproximação da solução no próximo ponto temporal, digamos $y_{i+1}$, depende apenas da solução no ponto atual, $y_i$, e de informações sobre a derivada (a função $f(t,y))$ avaliada em diferentes pontos intermediários dentro do intervalo $[t_i, t_{i+1}]$. Isso contrasta com os métodos de passo múltiplo, que utilizam informações de vários pontos anteriores para calcular o próximo valor. 

A "ordem" de um método Runge-Kutta está diretamente relacionada à sua precisão. De forma simplificada, um método de ordem $p$ consegue igualar os $p+1$ primeiros termos da expansão em série de Taylor da solução exata. Isso implica que o erro local de truncamento (o erro cometido em um único passo, assumindo que todos os valores anteriores são exatos) é proporcional a $h^{p+1}$, onde $h$ é o tamanho do passo. Portanto, métodos de alta ordem tendem a fornecer resultados mais precisos para um mesmo tamanho de passo, ou permitir o uso de passos maiores para alcançar uma precisão desejada, o que pode levar a uma maior eficiência computacional, especialmente em integrações longas. 

Os métodos Runge-Kutta "explícitos" são aqueles em que o cálculo da solução no próximo ponto, $y_{i+1}$, pode ser feito diretamente a partir dos valores conhecidos no ponto atual, $y_i$, e das avaliações da função $f(t,y)$. Não há necessidade de resolver equações implícitas para $y_{i+1}$ a cada passo, o que simplifica a implementação computacional. A forma geral de um método Runge-Kutta explícito de s estágios pode ser escrita como:
\[ y_{i+1} = y_i + h \sum_{j=1}^{s} (b_j  k_j)\]

onde $h$ é o tamanho do passo, e os $k_j$ são as avaliações intermediárias da função $f$: 

$k_1 = f(t_i, y_i) $

$k_2 = f(t_i + c_2h, y_i + h(a_{21}k_1))$

$k_3 = f(t_i + c_3h, y_i + h(a_{31}k_1 + a_{32}k_2))$

 ... 

$k_s = f(t_i + c_sh, y_i + h(a_{s1}k_1 + a_{s2}k_2 + ... + a_{s,s-1}k_{s-1})) $

Os coeficientes $b_j$, $c_j$ e $a_{ij}$ são constantes específicas que definem um método Runge-Kutta particular e determinam sua ordem e propriedades de estabilidade. Esses coeficientes são frequentemente apresentados de forma compacta em uma tabela conhecida como Tabela de Butcher. Um dos exemplos mais conhecidos e amplamente utilizados de método Runge-Kutta explícito é o método clássico de quarta ordem (RK4). Ele requer quatro avaliações da função $f$ por passo e alcança uma precisão de quarta ordem, o que significa que seu erro local é da ordem de $h^5$. Este método oferece um bom equilíbrio entre precisão e custo computacional para uma vasta gama de problemas. 

Além do RK4, existem outros métodos Runge-Kutta explícitos de ordens ainda mais elevadas, como os de quinta, sexta ordem, sétima, oitava ordem ou ainda maiores. No entanto, a complexidade na derivação dos coeficientes e o número de avaliações da função por passo aumentam com a ordem. Para problemas que exigem altíssima precisão ou onde a avaliação da função $f$ é computacionalmente cara, a escolha da ordem do método Runge-Kutta torna-se uma consideração crucial. 

Outra inovação importante na família Runge-Kutta são os métodos com controle de passo adaptativo, como os métodos de Runge-Kutta-Fehlberg (RKF45) ou Dormand-Prince (DOPRI5). Estes métodos utilizam pares de fórmulas Runge-Kutta explícitas de ordens diferentes (por exemplo, uma de quarta e outra de quinta ordem) para estimar o erro local em cada passo. Com base nessa estimativa de erro, o tamanho do passo $h$ pode ser ajustado dinamicamente: aumentado quando o erro é pequeno (para economizar cálculos) e diminuído quando o erro é grande (para manter a precisão desejada). Essa capacidade de adaptação torna esses métodos particularmente eficientes para problemas onde a solução varia rapidamente em algumas regiões e lentamente em outras. 

Em resumo, os métodos Runge-Kutta explícitos de alta ordem representam uma classe de ferramentas numéricas versáteis e poderosas para a solução de equações diferenciais ordinárias. Sua capacidade de alcançar alta precisão com um esforço computacional razoável os tornou um pilar na simulação científica e na engenharia, permitindo-nos explorar e entender a dinâmica de sistemas complexos que, de outra forma, permaneceriam inacessíveis.

Nesta postagem vamos comparar os métodos RK de 6a., 8a. 10a. e 12a. ordens. Usamos o Scilab para fazer as simulações. 

Referências:

Feagin, Terry. "A tenth-order Runge-Kutta method with error estimate." Proceedings of the IAENG Conf. on Scientific Computing, 2007.

academia.edu/83821799/The_Effectiveness_of_Runge_Kutta

coeficientes:
https://sce.uhcl.edu/rungekutta/

Resultados gráficos:


y_analitica =  (1-exp(-t/2))./(1+exp(-2*t)); 
dy/dt = (4 e^(2 t))/(e^(2 t) + 1)^2

 ----------------------

y_analitica = exp(-t).*sin(4*t); 
dy/dt = 4*exp(-t).*cos(4*t) - y;
---------------- 

Código Scilab:

close(winsid()); clc;

// Definir a função da equação diferencial dy/dt = f(t, y)
function dydt=ff(t, y)
   //dydt = 2*t.*exp(-t) - y;
   //dydt=r*y*exp(-t/2)*(1-y) - y/2;
   dydt = (exp((3*t)/2)*(-3 + 4*exp(t/2) + exp(2*t)))/(2*(1 + exp(2*t))^2);
   //dydt = exp(-t) - y;
   //dydt = 4*exp(-t).*cos(4*t) - y;
endfunction

////////
    // t0: tempo inicial
    // y0: valor inicial de y
    // tf: tempo final
    // h: tamanho do passo
    
    t0 = 0;
    y0 = 0;
    tf = 10;
    h = 0.25;
    r = 2.5;
    // Número de passos
    N = ceil((tf - t0) / h);
    
    // Inicializar vetores para armazenar os resultados
    t = t0:h:(t0 + N*h);
    y = zeros(1, N+1);
    y6 = y;
    y6(1) = y0;
    y6i = y0;
    for i = 1:N
        ti = t(i);
        y6i = y6(i);

        // Estágios do RK6
        k1 = h * ff(ti, y6i);
        k2 = h * ff(ti + h/5, y6i + k1/5);
        k3 = h * ff(ti + 2*h/5, y6i + 2*k2/5);
        k4 = h * ff(ti + h/5, y6i + (11*k1 - 4*k2+5*k3)/60);
        k5 = h * ff(ti + 3*h/5, y6i + (-3*k1+4*k2+3*k3+8*k4)/20);
        k6 = h * ff(ti + 4*h/5, y6i + (-12*k2-8*k3+22*k4+10*k5)/15);
        k7 = h * ff(ti + h, y6i + (51*k1+140*k2+225*k3-280*k4-...
        120*k5+60*k6)/76);
        // Atualizar y usando a combinação dos estágios
        y6(i+1) = y6i + (19*k1+50*k3+75*k4+50*k5+75*k6+19*k7)/288;
end;
//The coefficients in exact form are:
c(1)=0;
c(2)=1/2,
c(3)=1/2,
c(4)=1/2+(1/14)*(21^(1/2)),
c(5)=c(4); //1/2+1/14*21^(1/2),
c(6)=1/2,
c(7)=1/2-(1/14)*(21^(1/2)),
c(8)=c(7); //1/2-1/14*21^(1/2),
c(9)=1/2,
c(10)=c(4); //1/2+1/14*21^(1/2),
c(11)=1,

a(2,1)=1/2,
a(3,1)=1/4,
a(3,2)=1/4,
a(4,1)=1/7,
a(4,2)=-1/14-(3/98)*(21^(1/2)),
a(4,3)=3/7+5/49*21^(1/2),
a(5,1)=11/84+1/84*21^(1/2),
a(5,2)=0,
a(5,3)=2/7+4/63*21^(1/2),
a(5,4)=1/12-1/252*21^(1/2),
a(6,1)=5/48+1/48*21^(1/2),
a(6,2)=0,
a(6,3)=1/4+1/36*21^(1/2),
a(6,4)=-77/120+7/180*21^(1/2),
a(6,5)=63/80-7/80*21^(1/2),
a(7,1)=5/21-1/42*21^(1/2),
a(7,2)=0,
a(7,3)=-48/35+92/315*21^(1/2),
a(7,4)=211/30-29/18*21^(1/2),
a(7,5)=-36/5+23/14*21^(1/2),
a(7,6)=9/5-13/35*21^(1/2),
a(8,1)=1/14,
a(8,2)=0,
a(8,3)=0,
a(8,4)=0,
a(8,5)=1/9-1/42*21^(1/2),
a(8,6)=13/63-1/21*21^(1/2),
a(8,7)=1/9,
a(9,1)=1/32,
a(9,2)=0,
a(9,3)=0,
a(9,4)=0,
a(9,5)=91/576-7/192*21^(1/2),
a(9,6)=11/72,
a(9,7)=-385/1152-25/384*21^(1/2),
a(9,8)=63/128+13/128*21^(1/2),
a(10,1)=1/14,
a(10,2)=0,
a(10,3)=0,
a(10,4)=0,
a(10,5)=1/9,
a(10,6)=-733/2205-1/15*21^(1/2),
a(10,7)=515/504+37/168*21^(1/2),
a(10,8)=-51/56-11/56*21^(1/2),
a(10,9)=132/245+4/35*21^(1/2),
a(11,1)=0,
a(11,2)=0,
a(11,3)=0,
a(11,4)=0,
a(11,5)=-7/3+7/18*21^(1/2),
a(11,6)=-2/5+28/45*21^(1/2),
a(11,7)=-91/24-53/72*21^(1/2),
a(11,8)=301/72+53/72*21^(1/2),
a(11,9)=28/45-28/45*21^(1/2),
a(11,10)=49/18-7/18*21^(1/2),

b(1)=1/20,
b(2)=0,
b(3)=0,
b(4)=0,
b(5)=0,
b(6)=0,
b(7)=0,
b(8)=49/180,
b(9)=16/45,
b(10)=49/180,
b(11)=1/20

// Inicializar vetores para armazenar os resultados
    N = ceil((tf - t0) / h);
    t = t0:h:(t0 + N*h);
    y = zeros(1, N+1);
    y8 = y;
    y8(1) = y0;
    for i = 1:N
        ti = t(i);
        y8i = y8(i);
        k = 0*c;
        k(1)=h*ff(ti, y8i)
        for n=2:11
            sk=0;
            for p=1:(n-1)
               sk = sk + a(n,p)*k(p);
            end;
        k(n) = h*ff(ti+c(n)*h, y8i + sk);
    end
    sb = 0;
    for n=1:11
        sb = sb + b(n)*k(n);
    end
y8(i+1) = y8i + sb;
end;

//////////////
c(1) = 0;
c(2) = 0.1000000000000000000000000000000000000000000000000000000;
c(3) = 0.5393578408029817875324851978813024368572734497010090155055;
c(4) = 0.80903676120447268129872779682195365528591017455151352325825;
c(5) = 0.30903676120447268129872779682195365528591017455151352325825;
c(6) = 0.981074190219795268254879548310562080489056746118724882027805;
c(7) = 0.833333333333333333333333333333333333333333333333333333333333;
c(8) = 0.354017365856802376329264185948796742115824053807373968324184;
c(9) = 0.882527661964732346425501486979669075182867844268052119663791;
c(10) = 0.642615758240322548157075497020439535959501736363212695909875;
c(11) = 0.357384241759677451842924502979560464040498263636787304090125;
c(12) = 0.117472338035267653574498513020330924817132155731947880336209;
c(13) = 0.833333333333333333333333333333333333333333333333333333333333;
c(14) = 0.309036761204472681298727796821953655285910174551513523258250;
c(15) = 0.5393578408029817875324851978813024368572734497010090155055;
c(16) = 0.1000000000000000000000000000000000000000000000000000000000;
c(17) = 1.00000000000000000000000000000000000000000000000000000000000;

b(1) = 0.0333333333333333333333333333333333333333333333333333333333333;
b(2) = 0.025000000000000000000000000000000000000000000000000000000000;
b(3) = 0.0333333333333333333333333333333333333333333333333333333333333;
b(4) = 0;
b(5) = 0.050000000000000000000000000000000000000000000000000000000000;
b(6) = 0;
b(7) = 0.04000000000000000000000000000000000000000000000000000000000;
b(8) = 0;
b(9) = 0.189237478148923490158306404106012326238162346948625830327194;
b(10) = 0.277429188517743176508360262560654340428504319718040836339472;
b(11) = 0.277429188517743176508360262560654340428504319718040836339472;
b(12) = 0.189237478148923490158306404106012326238162346948625830327194;
b(13) = -0.0400000000000000000000000000000000000000000000000000000000000;
b(14) = -0.0500000000000000000000000000000000000000000000000000000000000;
b(15) = -0.0333333333333333333333333333333333333333333333333333333333333;
b(16) = -0.0250000000000000000000000000000000000000000000000000000000000;
b(17) = 0.0333333333333333333333333333333333333333333333333333333333333;

a(2,1) = 0.100000000000000000000000000000000000000000000000000000000000;
a(3,1) = -0.915176561375291440520015019275342154318951387664369720564660;
a(3,2) = 1.45453440217827322805250021715664459117622483736537873607016;
a(4,1) = 0.202259190301118170324681949205488413821477543637878380814562;
a(4,2) = 0.000000000000000000000000000000000000000000000000000000000000;
a(4,3) = 0.606777570903354510974045847616465241464432630913635142443687;
a(5,1) = 0.184024714708643575149100693471120664216774047979591417844635;
a(5,2) = 0.000000000000000000000000000000000000000000000000000000000000;
a(5,3) = 0.197966831227192369068141770510388793370637287463360401555746;
a(5,4) =  -0.0729547847313632629185146671595558023015011608914382961421311
a(6,1) =  0.0879007340206681337319777094132125475918886824944548534041378
a(6,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(6,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(6,4) =  0.410459702520260645318174895920453426088035325902848695210406
a(6,5) =  0.482713753678866489204726942976896106809132737721421333413261
a(7,1) =  0.0859700504902460302188480225945808401411132615636600222593880
a(7,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(7,3) = 0.000000000000000000000000000000000000000000000000000000000000
a(7,4) =  0.330885963040722183948884057658753173648240154838402033448632
a(7,5) =  0.489662957309450192844507011135898201178015478433790097210790
a(7,6) =  -0.0731856375070850736789057580558988816340355615025188195854775
a(8,1) =  0.120930449125333720660378854927668953958938996999703678812621
a(8,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(8,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(8,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(8,5) =  0.260124675758295622809007617838335174368108756484693361887839
a(8,6) =  0.0325402621549091330158899334391231259332716675992700000776101
a(8,7) =  -0.0595780211817361001560122202563305121444953672762930724538856
a(9,1) =  0.110854379580391483508936171010218441909425780168656559807038
a(9,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(9,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(9,4) = 0.000000000000000000000000000000000000000000000000000000000000
a(9,5) = 0.000000000000000000000000000000000000000000000000000000000000
a(9,6) =  -0.0605761488255005587620924953655516875526344415354339234619466
a(9,7) =  0.321763705601778390100898799049878904081404368603077129251110
a(9,8) =  0.510485725608063031577759012285123416744672137031752354067590
a(10,1) =  0.112054414752879004829715002761802363003717611158172229329393
a(10,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(10,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(10,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(10,5) =  0.000000000000000000000000000000000000000000000000000000000000
a(10,6) =  -0.144942775902865915672349828340980777181668499748506838876185
a(10,7) =  -0.333269719096256706589705211415746871709467423992115497968724
a(10,8) =  0.499269229556880061353316843969978567860276816592673201240332
a(10,9) =  0.509504608929686104236098690045386253986643232352989602185060
a(11,1) =  0.113976783964185986138004186736901163890724752541486831640341
a(11,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(11,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(11,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(11,5) =  0.000000000000000000000000000000000000000000000000000000000000
a(11,6) =  -0.0768813364203356938586214289120895270821349023390922987406384
a(11,7) =  0.239527360324390649107711455271882373019741311201004119339563
a(11,8) =  0.397774662368094639047830462488952104564716416343454639902613
a(11,9) =  0.0107558956873607455550609147441477450257136782823280838547024
a(11,10) =  -0.327769124164018874147061087350233395378262992392394071906457
a(12,1) =  0.0798314528280196046351426864486400322758737630423413945356284
a(12,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(12,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(12,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(12,5) =  0.000000000000000000000000000000000000000000000000000000000000
a(12,6) =  -0.0520329686800603076514949887612959068721311443881683526937298
a(12,7) =  -0.0576954146168548881732784355283433509066159287152968723021864
a(12,8) =  0.194781915712104164976306262147382871156142921354409364738090
a(12,9) =  0.145384923188325069727524825977071194859203467568236523866582
a(12,10) =  -0.0782942710351670777553986729725692447252077047239160551335016
a(12,11) =  -0.114503299361098912184303164290554670970133218405658122674674
a(13,1) =  0.985115610164857280120041500306517278413646677314195559520529
a(13,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(13,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(13,4) =  0.330885963040722183948884057658753173648240154838402033448632
a(13,5) =  0.489662957309450192844507011135898201178015478433790097210790
a(13,6) =  -1.37896486574843567582112720930751902353904327148559471526397
a(13,7) =  -0.861164195027635666673916999665534573351026060987427093314412
a(13,8) =  5.78428813637537220022999785486578436006872789689499172601856
a(13,9) =  3.28807761985103566890460615937314805477268252903342356581925
a(13,10) =  -2.38633905093136384013422325215527866148401465975954104585807
a(13,11) =  -3.25479342483643918654589367587788726747711504674780680269911
a(13,12) =  -2.16343541686422982353954211300054820889678036420109999154887
a(14,1) =  0.895080295771632891049613132336585138148156279241561345991710
a(14,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(14,3) =  0.197966831227192369068141770510388793370637287463360401555746
a(14,4) =  -0.0729547847313632629185146671595558023015011608914382961421311
a(14,5) =  0.0000000000000000000000000000000000000000000000000000000000000
a(14,6) =  -0.851236239662007619739049371445966793289359722875702227166105
a(14,7) =  0.398320112318533301719718614174373643336480918103773904231856
a(14,8) =  3.63937263181035606029412920047090044132027387893977804176229
a(14,9) =  1.54822877039830322365301663075174564919981736348973496313065
a(14,10) =  -2.12221714704053716026062427460427261025318461146260124401561
a(14,11) =  -1.58350398545326172713384349625753212757269188934434237975291
a(14,12) =  -1.71561608285936264922031819751349098912615880827551992973034
a(14,13) =  -0.0244036405750127452135415444412216875465593598370910566069132
a(15,1) =  -0.915176561375291440520015019275342154318951387664369720564660
a(15,2) =  1.45453440217827322805250021715664459117622483736537873607016
a(15,3) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,5) =  -0.777333643644968233538931228575302137803351053629547286334469
a(15,6) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,7) =  -0.0910895662155176069593203555807484200111889091770101799647985
a(15,8) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,9) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,10) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,11) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,12) =  0.000000000000000000000000000000000000000000000000000000000000
a(15,13) =  0.0910895662155176069593203555807484200111889091770101799647985
a(15,14) =  0.777333643644968233538931228575302137803351053629547286334469
a(16,1) =  0.100000000000000000000000000000000000000000000000000000000000
a(16,2) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,3) =  -0.157178665799771163367058998273128921867183754126709419409654
a(16,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,5) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,6) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,7) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,8) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,9) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,10) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,11) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,12) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,13) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,14) =  0.000000000000000000000000000000000000000000000000000000000000
a(16,15) =  0.157178665799771163367058998273128921867183754126709419409654
a(17,1) =  0.181781300700095283888472062582262379650443831463199521664945
a(17,2) =  0.675000000000000000000000000000000000000000000000000000000000
a(17,3) =  0.342758159847189839942220553413850871742338734703958919937260
a(17,4) =  0.000000000000000000000000000000000000000000000000000000000000
a(17,5) =  0.259111214548322744512977076191767379267783684543182428778156
a(17,6) =  -0.358278966717952089048961276721979397739750634673268802484271
a(17,7) =  -1.04594895940883306095050068756409905131588123172378489286080
a(17,8) =  0.930327845415626983292300564432428777137601651182965794680397
a(17,9) =  1.77950959431708102446142106794824453926275743243327790536000
a(17,10) =  0.100000000000000000000000000000000000000000000000000000000000
a(17,11) =  -0.282547569539044081612477785222287276408489375976211189952877
a(17,12) =  -0.159327350119972549169261984373485859278031542127551931461821
a(17,13) =  -0.145515894647001510860991961081084111308650130578626404945571
a(17,14) = -0.259111214548322744512977076191767379267783684543182428778156
a(17,15) =  -0.342758159847189839942220553413850871742338734703958919937260
a(17,16) =  -0.675000000000000000000000000000000000000000000000000000000000

// Inicializar vetores para armazenar os resultados
    N = ceil((tf - t0) / h);
    t = t0:h:(t0 + N*h);
    y = zeros(1, N+1);
    y10 = y;
    y10(1) = y0;
    for i = 1:N
        ti = t(i);
        y10i = y10(i);
        k = 0*c;
        k(1)=h*ff(ti, y10i)
        for n=2:17
            sk=0;
            for p=1:(n-1)
                sk = sk + a(n,p)*k(p);
            end;
        k(n) = h*ff(ti+c(n)*h, y10i + sk);
        end
        sb = 0;
        for n=1:17
            sb = sb + b(n)*k(n);
        end
    y10(i+1) = y10i + sb;
end;

ck=[0    0.000000000000000000000000000000000000000000000000000000000000
  1    0.200000000000000000000000000000000000000000000000000000000000
  2    0.555555555555555555555555555555555555555555555555555555555556
  3    0.833333333333333333333333333333333333333333333333333333333333
  4    0.333333333333333333333333333333333333333333333333333333333333
  5    1.00000000000000000000000000000000000000000000000000000000000
  6    0.671835709170513812712245661002797570438953420568682550710222
  7    0.288724941110620201935458488967024976908118598341806976469674
  8    0.562500000000000000000000000000000000000000000000000000000000
  9    0.833333333333333333333333333333333333333333333333333333333333
 10    0.947695431179199287562380162101836721649589325892740646458322
 11    0.0548112876863802643887753674810754475842153612931128785028369
 12    0.0848880518607165350639838930162674302064148175640019542045934
 13    0.265575603264642893098114059045616835297201264164077621448665
 14    0.500000000000000000000000000000000000000000000000000000000000
 15    0.734424396735357106901885940954383164702798735835922378551335
 16    0.915111948139283464936016106983732569793585182435998045795407
 17    0.947695431179199287562380162101836721649589325892740646458322
 18    0.833333333333333333333333333333333333333333333333333333333333
 19    0.288724941110620201935458488967024976908118598341806976469674
 20    0.671835709170513812712245661002797570438953420568682550710222
 21    0.333333333333333333333333333333333333333333333333333333333333
 22    0.555555555555555555555555555555555555555555555555555555555556
 23    0.200000000000000000000000000000000000000000000000000000000000
 24    1.00000000000000000000000000000000000000000000000000000000000 ];

bk=[0    0.0238095238095238095238095238095238095238095238095238095238095
  1    0.0234375000000000000000000000000000000000000000000000000000000
  2    0.0312500000000000000000000000000000000000000000000000000000000
  3    0.000000000000000000000000000000000000000000000000000000000000
  4    0.0416666666666666666666666666666666666666666666666666666666667
  5    0.000000000000000000000000000000000000000000000000000000000000
  6    0.0500000000000000000000000000000000000000000000000000000000000
  7    0.0500000000000000000000000000000000000000000000000000000000000
  8    0.000000000000000000000000000000000000000000000000000000000000
  9    0.100000000000000000000000000000000000000000000000000000000000
 10    0.0714285714285714285714285714285714285714285714285714285714286
 11    0.000000000000000000000000000000000000000000000000000000000000
 12    0.138413023680782974005350203145033146748813640089941234591267
 13    0.215872690604931311708935511140681138965472074195773051123019
 14    0.243809523809523809523809523809523809523809523809523809523810
 15    0.215872690604931311708935511140681138965472074195773051123019
 16    0.138413023680782974005350203145033146748813640089941234591267
 17   -0.0714285714285714285714285714285714285714285714285714285714286
 18   -0.100000000000000000000000000000000000000000000000000000000000
 19   -0.0500000000000000000000000000000000000000000000000000000000000
 20   -0.0500000000000000000000000000000000000000000000000000000000000
 21   -0.0416666666666666666666666666666666666666666666666666666666667
 22   -0.0312500000000000000000000000000000000000000000000000000000000
 23   -0.0234375000000000000000000000000000000000000000000000000000000
 24    0.0238095238095238095238095238095238095238095238095238095238095];

////
c = ck(:,2);
b = bk(:,2);

ak=[1    0    0.200000000000000000000000000000000000000000000000000000000000
  2    0   -0.216049382716049382716049382716049382716049382716049382716049
  2    1    0.771604938271604938271604938271604938271604938271604938271605
  3    0    0.208333333333333333333333333333333333333333333333333333333333
  3    1    0.000000000000000000000000000000000000000000000000000000000000
  3    2    0.625000000000000000000000000000000000000000000000000000000000
  4    0    0.193333333333333333333333333333333333333333333333333333333333
  4    1    0.000000000000000000000000000000000000000000000000000000000000
  4    2    0.220000000000000000000000000000000000000000000000000000000000
  4    3   -0.0800000000000000000000000000000000000000000000000000000000000
  5    0    0.100000000000000000000000000000000000000000000000000000000000
  5    1    0.000000000000000000000000000000000000000000000000000000000000
  5    2    0.000000000000000000000000000000000000000000000000000000000000
  5    3    0.400000000000000000000000000000000000000000000000000000000000
  5    4    0.500000000000000000000000000000000000000000000000000000000000
  6    0    0.103364471650010477570395435690481791543342708330349879244197
  6    1    0.000000000000000000000000000000000000000000000000000000000000
  6    2    0.000000000000000000000000000000000000000000000000000000000000
  6    3    0.124053094528946761061581889237115328211074784955180298044074
  6    4    0.483171167561032899288836480451962508724109257517289177302380
  6    5   -0.0387530245694763252085681443767620580395733302341368038804290
  7    0    0.124038261431833324081904585980175168140024670698633612292480
  7    1    0.000000000000000000000000000000000000000000000000000000000000
  7    2    0.000000000000000000000000000000000000000000000000000000000000
  7    3    0.000000000000000000000000000000000000000000000000000000000000
  7    4    0.217050632197958486317846256953159942875916353757734167684657
  7    5    0.0137455792075966759812907801835048190594443990939408530842918
  7    6   -0.0661095317267682844455831341498149531672668252085016565917546
  8    0    0.0914774894856882983144991846980432197088832099976660100090486
  8    1    0.000000000000000000000000000000000000000000000000000000000000
  8    2    0.000000000000000000000000000000000000000000000000000000000000
  8    3    0.000000000000000000000000000000000000000000000000000000000000
  8    4    0.000000000000000000000000000000000000000000000000000000000000
  8    5   -0.00544348523717469689965754944144838611346156873847009178068318
  8    6    0.0680716801688453518578515120895103863112751730758794372203952
  8    7    0.408394315582641046727306852653894780093303185664924644551239
  9    0    0.0890013652502551018954509355423841780143232697403434118692699
  9    1    0.000000000000000000000000000000000000000000000000000000000000
  9    2    0.000000000000000000000000000000000000000000000000000000000000
  9    3    0.000000000000000000000000000000000000000000000000000000000000
  9    4    0.000000000000000000000000000000000000000000000000000000000000
  9    5    0.00499528226645532360197793408420692800405891149406814091955810
  9    6    0.397918238819828997341739603001347156083435060931424970826304
  9    7    0.427930210752576611068192608300897981558240730580396406312359
  9    8   -0.0865117637557827005740277475955029103267246394128995965941585
 10    0    0.0695087624134907543112693906409809822706021061685544615255758
 10    1    0.000000000000000000000000000000000000000000000000000000000000
 10    2    0.000000000000000000000000000000000000000000000000000000000000
 10    3    0.000000000000000000000000000000000000000000000000000000000000
 10    4    0.000000000000000000000000000000000000000000000000000000000000
 10    5    0.129146941900176461970759579482746551122871751501482634045487
 10    6    1.53073638102311295076342566143214939031177504112433874313011
 10    7    0.577874761129140052546751349454576715334892100418571882718036
 10    8   -0.951294772321088980532340837388859453930924498799228648050949
 10    9   -0.408276642965631951497484981519757463459627174520978426909934
 11    0    0.0444861403295135866269453507092463581620165501018684152933313
 11    1    0.000000000000000000000000000000000000000000000000000000000000
 11    2    0.000000000000000000000000000000000000000000000000000000000000
 11    3    0.000000000000000000000000000000000000000000000000000000000000
 11    4    0.000000000000000000000000000000000000000000000000000000000000
 11    5   -0.00380476867056961731984232686574547203016331563626856065717964
 11    6    0.0106955064029624200721262602809059154469206077644957399593972
 11    7    0.0209616244499904333296674205928919920806734650660039898074652
 11    8   -0.0233146023259321786648561431551978077665337818756053603898847
 11    9    0.00263265981064536974369934736325334761174975280887405725010964
 11   10    0.00315472768977025060103545855572111407955208306374459723959783
 12    0    0.0194588815119755475588801096525317761242073762016273186231215
 12    1    0.000000000000000000000000000000000000000000000000000000000000
 12    2    0.000000000000000000000000000000000000000000000000000000000000
 12    3    0.000000000000000000000000000000000000000000000000000000000000
 12    4    0.000000000000000000000000000000000000000000000000000000000000
 12    5    0.000000000000000000000000000000000000000000000000000000000000
 12    6    0.000000000000000000000000000000000000000000000000000000000000
 12    7    0.000000000000000000000000000000000000000000000000000000000000
 12    8    0.0000678512949171812509306121653452367476194364781259165332321534
 12    9   -0.0000429795859049273623271005330230162343568863387724883603675550
 12   10    0.0000176358982260285155407485928953302139937553442829975734148981
 12   11    0.0653866627415027051009595231385181033549511358787382098351924
 13    0    0.206836835664277105916828174798272361078909196043446411598231
 13    1    0.000000000000000000000000000000000000000000000000000000000000
 13    2    0.000000000000000000000000000000000000000000000000000000000000
 13    3    0.000000000000000000000000000000000000000000000000000000000000
 13    4    0.000000000000000000000000000000000000000000000000000000000000
 13    5    0.000000000000000000000000000000000000000000000000000000000000
 13    6    0.000000000000000000000000000000000000000000000000000000000000
 13    7    0.000000000000000000000000000000000000000000000000000000000000
 13    8    0.0166796067104156472828045866664696450306326505094792505215514
 13    9   -0.00879501563200710214457024178249986591130234990219959208704979
 13   10    0.00346675455362463910824462315246379209427513654098596403637231
 13   11   -0.861264460105717678161432562258351242030270498966891201799225
 13   12    0.908651882074050281096239478469262145034957129939256789178785
 14    0    0.0203926084654484010091511314676925686038504449562413004562382
 14    1    0.000000000000000000000000000000000000000000000000000000000000
 14    2    0.000000000000000000000000000000000000000000000000000000000000
 14    3    0.000000000000000000000000000000000000000000000000000000000000
 14    4    0.000000000000000000000000000000000000000000000000000000000000
 14    5    0.000000000000000000000000000000000000000000000000000000000000
 14    6    0.000000000000000000000000000000000000000000000000000000000000
 14    7    0.000000000000000000000000000000000000000000000000000000000000
 14    8    0.0869469392016685948675400555583947505833954460930940959577347
 14    9   -0.0191649630410149842286436611791405053287170076602337673587681
 14   10    0.00655629159493663287364871573244244516034828755253746024098838
 14   11    0.0987476128127434780903798528674033899738924968006632201445462
 14   12    0.00535364695524996055083260173615567408717110247274021056118319
 14   13    0.301167864010967916837091303817051676920059229784957479998077
 15    0    0.228410433917778099547115412893004398779136994596948545722283
 15    1    0.000000000000000000000000000000000000000000000000000000000000
 15    2    0.000000000000000000000000000000000000000000000000000000000000
 15    3    0.000000000000000000000000000000000000000000000000000000000000
 15    4    0.000000000000000000000000000000000000000000000000000000000000
 15    5    0.000000000000000000000000000000000000000000000000000000000000
 15    6    0.000000000000000000000000000000000000000000000000000000000000
 15    7    0.000000000000000000000000000000000000000000000000000000000000
 15    8   -0.498707400793025250635016567442511512138603770959682292383042
 15    9    0.134841168335724478552596703792570104791700727205981058201689
 15   10   -0.0387458244055834158439904226924029230935161059142806805674360
 15   11   -1.27473257473474844240388430824908952380979292713250350199641
 15   12    1.43916364462877165201184452437038081875299303577911839630524
 15   13   -0.214007467967990254219503540827349569639028092344812795499026
 15   14    0.958202417754430239892724139109781371059908874605153648768037
 16    0    2.00222477655974203614249646012506747121440306225711721209798
 16    1    0.000000000000000000000000000000000000000000000000000000000000
 16    2    0.000000000000000000000000000000000000000000000000000000000000
 16    3    0.000000000000000000000000000000000000000000000000000000000000
 16    4    0.000000000000000000000000000000000000000000000000000000000000
 16    5    0.000000000000000000000000000000000000000000000000000000000000
 16    6    0.000000000000000000000000000000000000000000000000000000000000
 16    7    0.000000000000000000000000000000000000000000000000000000000000
 16    8    2.06701809961524912091954656438138595825411859673341600679555
 16    9    0.623978136086139541957471279831494466155292316167021080663140
 16   10   -0.0462283685500311430283203554129062069391947101880112723185773
 16   11   -8.84973288362649614860075246727118949286604835457092701094630
 16   12    7.74257707850855976227437225791835589560188590785037197433615
 16   13   -0.588358519250869210993353314127711745644125882130941202896436
 16   14   -1.10683733362380649395704708016953056176195769617014899442903
 16   15   -0.929529037579203999778397238291233214220788057511899747507074
 17    0    3.13789533412073442934451608989888796808161259330322100268310
 17    1    0.000000000000000000000000000000000000000000000000000000000000
 17    2    0.000000000000000000000000000000000000000000000000000000000000
 17    3    0.000000000000000000000000000000000000000000000000000000000000
 17    4    0.000000000000000000000000000000000000000000000000000000000000
 17    5    0.129146941900176461970759579482746551122871751501482634045487
 17    6    1.53073638102311295076342566143214939031177504112433874313011
 17    7    0.577874761129140052546751349454576715334892100418571882718036
 17    8    5.42088263055126683050056840891857421941300558851862156403363
 17    9    0.231546926034829304872663800877643660904880180835945693836936
 17   10    0.0759292995578913560162301311785251873561801342333194895292058
 17   11  -12.3729973380186513287414553402595806591349822617535905976253
 17   12    9.85455883464769543935957209317369202080367765721777101906955
 17   13    0.0859111431370436529579357709052367772889980495122329601159540
 17   14   -5.65242752862643921117182090081762761180392602644189218673969
 17   15   -1.94300935242819610883833776782364287728724899124166920477873
 17   16   -0.128352601849404542018428714319344620742146491335612353559923
 18    0    1.38360054432196014878538118298167716825163268489922519995564
 18    1    0.000000000000000000000000000000000000000000000000000000000000
 18    2    0.000000000000000000000000000000000000000000000000000000000000
 18    3    0.000000000000000000000000000000000000000000000000000000000000
 18    4    0.000000000000000000000000000000000000000000000000000000000000
 18    5    0.00499528226645532360197793408420692800405891149406814091955810
 18    6    0.397918238819828997341739603001347156083435060931424970826304
 18    7    0.427930210752576611068192608300897981558240730580396406312359
 18    8   -1.30299107424475770916551439123047573342071475998399645982146
 18    9    0.661292278669377029097112528107513072734573412294008071500699
 18   10   -0.144559774306954349765969393688703463900585822441545655530145
 18   11   -6.96576034731798203467853867461083919356792248105919255460819
 18   12    6.65808543235991748353408295542210450632193197576935120716437
 18   13   -1.66997375108841486404695805725510845049807969199236227575796
 18   14    2.06413702318035263832289040301832647130604651223986452170089
 18   15   -0.674743962644306471862958129570837723192079875998405058648892
 18   16   -0.00115618834794939500490703608435907610059605754935305582045729
 18   17   -0.00544057908677007389319819914241631024660726585015012485938593
 19    0    0.951236297048287669474637975894973552166903378983475425758226
 19    1    0.000000000000000000000000000000000000000000000000000000000000
 19    2    0.000000000000000000000000000000000000000000000000000000000000
 19    3    0.000000000000000000000000000000000000000000000000000000000000
 19    4    0.217050632197958486317846256953159942875916353757734167684657
 19    5    0.0137455792075966759812907801835048190594443990939408530842918
 19    6   -0.0661095317267682844455831341498149531672668252085016565917546
 19    7    0.000000000000000000000000000000000000000000000000000000000000
 19    8    0.152281696736414447136604697040747131921486432699422112099617
 19    9   -0.337741018357599840802300793133998004354643424457539667670080
 19   10   -0.0192825981633995781534949199286824400469353110630787982121133
 19   11   -3.68259269696866809932409015535499603576312120746888880201882
 19   12    3.16197870406982063541533528419683854018352080342887002331312
 19   13   -0.370462522106885290716991856022051125477943482284080569177386
 19   14   -0.0514974200365440434996434456698127984941168616474316871020314
 19   15   -0.000829625532120152946787043541792848416659382675202720677536554
 19   16    0.00000279801041419278598986586589070027583961355402640879503213503
 19   17    0.0418603916412360287969841020776788461794119440689356178942252
 19   18    0.279084255090877355915660874555379649966282167560126269290222
 20    0    0.103364471650010477570395435690481791543342708330349879244197
 20    1    0.000000000000000000000000000000000000000000000000000000000000
 20    2    0.000000000000000000000000000000000000000000000000000000000000
 20    3    0.124053094528946761061581889237115328211074784955180298044074
 20    4    0.483171167561032899288836480451962508724109257517289177302380
 20    5   -0.0387530245694763252085681443767620580395733302341368038804290
 20    6    0.000000000000000000000000000000000000000000000000000000000000
 20    7   -0.438313820361122420391059788940960176420682836652600698580091
 20    8    0.000000000000000000000000000000000000000000000000000000000000
 20    9   -0.218636633721676647685111485017151199362509373698288330593486
 20   10   -0.0312334764394719229981634995206440349766174759626578122323015
 20   11    0.000000000000000000000000000000000000000000000000000000000000
 20   12    0.000000000000000000000000000000000000000000000000000000000000
 20   13    0.000000000000000000000000000000000000000000000000000000000000
 20   14    0.000000000000000000000000000000000000000000000000000000000000
 20   15    0.000000000000000000000000000000000000000000000000000000000000
 20   16    0.000000000000000000000000000000000000000000000000000000000000
 20   17    0.0312334764394719229981634995206440349766174759626578122323015
 20   18    0.218636633721676647685111485017151199362509373698288330593486
 20   19    0.438313820361122420391059788940960176420682836652600698580091
 21    0    0.193333333333333333333333333333333333333333333333333333333333
 21    1    0.000000000000000000000000000000000000000000000000000000000000
 21    2    0.220000000000000000000000000000000000000000000000000000000000
 21    3   -0.0800000000000000000000000000000000000000000000000000000000000
 21    4    0.000000000000000000000000000000000000000000000000000000000000
 21    5    0.000000000000000000000000000000000000000000000000000000000000
 21    6    0.0984256130499315928152900286856048243348202521491288575952143
 21    7   -0.196410889223054653446526504390100417677539095340135532418849
 21    8    0.000000000000000000000000000000000000000000000000000000000000
 21    9    0.436457930493068729391826122587949137609670676712525034763317
 21   10    0.0652613721675721098560370939805555698350543810708414716730270
 21   11    0.000000000000000000000000000000000000000000000000000000000000
 21   12    0.000000000000000000000000000000000000000000000000000000000000
 21   13    0.000000000000000000000000000000000000000000000000000000000000
 21   14    0.000000000000000000000000000000000000000000000000000000000000
 21   15    0.000000000000000000000000000000000000000000000000000000000000
 21   16    0.000000000000000000000000000000000000000000000000000000000000
 21   17   -0.0652613721675721098560370939805555698350543810708414716730270
 21   18   -0.436457930493068729391826122587949137609670676712525034763317
 21   19    0.196410889223054653446526504390100417677539095340135532418849
 21   20   -0.0984256130499315928152900286856048243348202521491288575952143
 22    0   -0.216049382716049382716049382716049382716049382716049382716049
 22    1    0.771604938271604938271604938271604938271604938271604938271605
 22    2    0.000000000000000000000000000000000000000000000000000000000000
 22    3    0.000000000000000000000000000000000000000000000000000000000000
 22    4   -0.666666666666666666666666666666666666666666666666666666666667
 22    5    0.000000000000000000000000000000000000000000000000000000000000
 22    6   -0.390696469295978451446999802258495981249099665294395945559163
 22    7    0.000000000000000000000000000000000000000000000000000000000000
 22    8    0.000000000000000000000000000000000000000000000000000000000000
 22    9    0.000000000000000000000000000000000000000000000000000000000000
 22   10    0.000000000000000000000000000000000000000000000000000000000000
 22   11    0.000000000000000000000000000000000000000000000000000000000000
 22   12    0.000000000000000000000000000000000000000000000000000000000000
 22   13    0.000000000000000000000000000000000000000000000000000000000000
 22   14    0.000000000000000000000000000000000000000000000000000000000000
 22   15    0.000000000000000000000000000000000000000000000000000000000000
 22   16    0.000000000000000000000000000000000000000000000000000000000000
 22   17    0.000000000000000000000000000000000000000000000000000000000000
 22   18    0.000000000000000000000000000000000000000000000000000000000000
 22   19    0.000000000000000000000000000000000000000000000000000000000000
 22   20    0.390696469295978451446999802258495981249099665294395945559163
 22   21    0.666666666666666666666666666666666666666666666666666666666667
 23    0    0.200000000000000000000000000000000000000000000000000000000000
 23    1    0.000000000000000000000000000000000000000000000000000000000000
 23    2   -0.164609053497942386831275720164609053497942386831275720164609
 23    3    0.000000000000000000000000000000000000000000000000000000000000
 23    4    0.000000000000000000000000000000000000000000000000000000000000
 23    5    0.000000000000000000000000000000000000000000000000000000000000
 23    6    0.000000000000000000000000000000000000000000000000000000000000
 23    7    0.000000000000000000000000000000000000000000000000000000000000
 23    8    0.000000000000000000000000000000000000000000000000000000000000
 23    9    0.000000000000000000000000000000000000000000000000000000000000
 23   10    0.000000000000000000000000000000000000000000000000000000000000
 23   11    0.000000000000000000000000000000000000000000000000000000000000
 23   12    0.000000000000000000000000000000000000000000000000000000000000
 23   13    0.000000000000000000000000000000000000000000000000000000000000
 23   14    0.000000000000000000000000000000000000000000000000000000000000
 23   15    0.000000000000000000000000000000000000000000000000000000000000
 23   16    0.000000000000000000000000000000000000000000000000000000000000
 23   17    0.000000000000000000000000000000000000000000000000000000000000
 23   18    0.000000000000000000000000000000000000000000000000000000000000
 23   19    0.000000000000000000000000000000000000000000000000000000000000
 23   20    0.000000000000000000000000000000000000000000000000000000000000
 23   21    0.000000000000000000000000000000000000000000000000000000000000
 23   22    0.164609053497942386831275720164609053497942386831275720164609
 24    0    1.47178724881110408452949550989023611293535315518571691939396
 24    1    0.787500000000000000000000000000000000000000000000000000000000
 24    2    0.421296296296296296296296296296296296296296296296296296296296
 24    3    0.000000000000000000000000000000000000000000000000000000000000
 24    4    0.291666666666666666666666666666666666666666666666666666666667
 24    5    0.000000000000000000000000000000000000000000000000000000000000
 24    6    0.348600717628329563206854421629657569274689947367847465753757
 24    7    0.229499544768994849582890233710555447073823569666506700662510
 24    8    5.79046485790481979159831978177003471098279506036722411333192
 24    9    0.418587511856506868874073759426596207226461447604248151080016
 24   10    0.307039880222474002649653817490106690389251482313213999386651
 24   11   -4.68700905350603332214256344683853248065574415794742040470287
 24   12    3.13571665593802262152038152399873856554395436199962915429076
 24   13    1.40134829710965720817510506275620441055845017313930508348898
 24   14   -5.52931101439499023629010306005764336421276055777658156400910
 24   15   -0.853138235508063349309546894974784906188927508039552519557498
 24   16    0.103575780373610140411804607167772795518293914458500175573749
 24   17   -0.140474416950600941142546901202132534870665923700034957196546
 24   18   -0.418587511856506868874073759426596207226461447604248151080016
 24   19   -0.229499544768994849582890233710555447073823569666506700662510
 24   20   -0.348600717628329563206854421629657569274689947367847465753757
 24   21   -0.291666666666666666666666666666666666666666666666666666666667
 24   22   -0.421296296296296296296296296296296296296296296296296296296296
 24   23   -0.787500000000000000000000000000000000000000000000000000000000];

aa = zeros(24,24);
for nn=1:max(size(ak))
    px = ak(nn,1);
    py = ak(nn,2)+1;
    vv = ak(nn,3);
    aa(px,py) = vv;
end

// Inicializar vetores para armazenar os resultados
//    N = ceil((tf - t0) / h);
//    t = t0:h:(t0 + N*h);
    y = zeros(1, N+1);
    y12 = y;
    y12(1) = y0;
    
for i = 1:N
ti = t(i);
y12i = y12(i);
k = 0*c;
k(1)=h*ff(ti+c(1)*h, y12i);
k(2)=h*ff(ti+c(2)*h, y12i+aa(1,1)*k(1));
k(3)=h*ff(ti+c(3)*h, y12i+aa(2,1)*k(1)+aa(2,2)*k(2));
k(4)=h*ff(ti+c(4)*h, y12i+aa(3,1)*k(1)+aa(3,2)*k(2)+aa(3,3)*k(3));
for n=5:25
    sk=0;
    for p=1:(n-1)
        sk = sk + aa(n-1,p)*k(p);
    end;
    k(n) = h*ff(ti+c(n)*h, y12i + sk);
end
sb = 0;
for n=1:max(size(b))
    sb = sb + b(n)*k(n);
end
y12(i+1) = y12i + sb;
end;

// Solução analítica para comparação
// y_analitica = t.*t.*exp(-t);  
// eqs = 'dy/dt = 2texp(-t) - y';
  y_analitica =  (1-exp(-t/2))./(1+exp(-2*t));
 eqs = 'dy/dt = (4 e^(2 t))/(e^(2 t) + 1)^2';
// y_analitica = t.*exp(-t);  
// eqs = 'dy/dt = exp(-t) - y';
//y_analitica = exp(-t).*sin(4*t); 
//eqs = 'dy/dt = 4*exp(-t).*cos(4*t) - y';

plot(t,y_analitica, 'm',"LineWidth", 2);
plot(t,y6, 'b', "LineWidth", 2);
plot(t,y8, 'k', "LineWidth", 2);
plot(t,y10,'y', "LineWidth", 2);
plot(t,y12,'k', "LineWidth", 2); 
title('Sinal e soluções numéricas (RK6, RK8, RK10 e RK12). Passo: '+string(h));
legend('Sinal','RK6','RK8','RK10','RK12',4);

//Erro e erro acumulado: 
e6 = y_analitica - y6; E6a = sum(abs(e6)); 
e8 = y_analitica - y8; E8a = sum(abs(e8)); 
e10 = y_analitica - y10; E10a = sum(abs(e10)); 
e12 = y_analitica - y12; E12a = sum(abs(e12)); 

figure;
subplot(2,2,1); plot(e6); title('Erro RK-6. E6a = '+string(E6a)); xgrid;
subplot(2,2,2); plot(e8); title('Erro RK-8. E8a = '+string(E8a)); xgrid;
subplot(2,2,3); plot(e10); title('Erro RK-10. E10a = '+string(E10a)); xgrid;
subplot(2,2,4); plot(e12); title('Erro RK-12. E12a = '+string(E12a)); xgrid;

Nenhum comentário:

Postar um comentário