Calculus
Not much information on calculus will be logged here, only enough to solve methods like Taylor's.
Derivatives
Integrals
Taylor Series
Runge-Kutta Method
We'll take the equation: a1 f (t + α1, y + β1) and expand it to a 2nd order taylor expansion.
a1 f(t, y) + a1 α1 (THINGf/THINGt) + a1 β1 (THINGf/THINGy) + a1 R1
T(2) = f + (h/2) (THINGf/THINGt) + (h/2) (THINGf/THINGy) f, and a1 = 1; The coefficients' values are α1 = (h/2) and β1 = (h/2) f
After equalizing the coefficients, we have that a1 = 1, therefore:
T(2) = f(t + (h/2), y + (h/2) f(t, y)) - R1
With this, we achieve a much easier to compute equation, with a recursive function as part of it. The error rate of this equation is of the O(h2) order.
The mid-point Runge-Kutta method (método R-K do ponto médio) is, with ω0 = α (note, this alpha means initial value, so α = y0 = y(t0)):
ωi+1 = ωi + h f(ti + (h/2), ωi + (h/2) f(ti, ωi))
T(3) ≈ f(t + α1, y + δ1 f(t + α2, y + δ2 f(y, t)))
For a fourth order Runge-Kutta equation, things get freaky. Here, we implement a more computable process:
- ω0 = α
- K1 = h f(ti, ωi)
- K2 = h f(ti + (h/2), ωi + (K1/2))
- K3 = h f(ti + (h/2), ωi + (K2/2))
- K4 = h f(ti + h, ωi + K3)
- ωi+1 = ωi + (1/6)(K1 + 2K2 + 2K3 + K4)
This C code solves 4th order Runge-Kutta equation, from t0 to t1, needing only that the user changes the function:
#include
#include
double f(double t, double y)
{
return (log(sin(pow(t, y))) + (pow(t, 2) * pow(y, 2))) / sqrt(t);
}
int main()
{
double w, h, t;
printf("\n**********************\n");
printf("\nMETODO DE RUNGE-KUTTA:\n");
printf("\n**********************\n");
printf("Digite o valor inicial do sistema (alfa): ");
scanf("%lf", &w);
printf("Digite o tempo inicial do sistema (t0): ");
scanf("%lf", &t);
printf("Digite o passo do sistema (h): ");
scanf("%lf", &h);
double K1 = h * f(t, w);
printf("\nK1: %lf", K1);
double K2 = h * f(t + (h/2), w + (K1/2));
printf("\nK2: %lf", K2);
double K3 = h * f(t + (h/2), w + (K2/2));
printf("\nK3: %lf", K3);
double K4 = h * f(t + h, w + K3);
printf("\nK4: %lf", K4);
double W1 = ((K1 + (2*K2) + (2*K3) + K4) * (1.0/6.0)) + w;
printf("\nw1: %lf\n\n", W1);
return 0;
}
Consider a method (R-K or Taylor) whose local truncation error (erro de truncamento local), represtented by τ(h), is of the O(hn) order.
ω0 = α; ωi+1 = ωi + h ϕ(ti, ωi , h)
Now consier another method with τ'(h) of O(hn+1) order and approximations:
ω'0 = α; ω'i+1 = ω'i + h ϕ'(ti, ω'i , h)
Since ωi = ω'i = y(ti), we can restructure the error function:
τi+1(h) = { [ y(ti+1) - y(ti) ] / h } - ϕ(ti, ωi, h)
This equation then becomes: τi+1(h) = [ y(ti+1) - ωi+1 ] / h, it being analogous to τ'i+1(h)
After several transformations, we achieve: τi+1(h) = τ'i+1 + (1/h)(ω'i+1 - ωi+1), where τ'i+1 is a very small value. That is because τi+1 is of order N (so, for N = 1, an h of 0.1 would still have 0.1 as product), meanwhile τ'i+1 is of order N+1 (0.1 to the power of 2 would be 0.01, making it 10 times smaller).
At the end, τi+1 ≈ (1/h)(ω'i+1 - ωi+1)
In practice, to limit τi+1 by ε (a given tolerance), we calculate a value q:
q = [ (ε h) / ( |ω'i+1 - ωi+1| ) ](1/n);
Note that, here, N = order (So Euler's method would have N = 1, an R-K of order 2 would have N = 2, etc. Euler, R-K and Taylor may be used here).
If q is smaller than 1, then a bad value for h was chosen, likely very big. If q is greater than 1, the entry may be accepted, but the next step should be (q * h). Ideally, q = 1, in which case the best amount of steps (h) was chosen.
Now, obersving the Runge-Kutta-Fehlberg method, it is used with the 4th or 5th order of Runge-Kutta, where each of the Ks is multiplied by specific coefficients. There'd normally be 9 Ks to calculate, but these changes permit only needing to calculate up to K6, with no K2 (although it's still needed to find K3):
ω'i+1 = ωi + (16/135)K1 + (6656/12825)K3 + (28561/56430)K4 - (9/50)K5 + (2/55)K6
ωi+1 = ωi + (25/16)K1 + (1408/2565)K3 + (2197/4104)K4 - (1/5)K5
The equations for each K are:
- K1 = h f(ti, ωi)
- K2 = h f(ti + (h/4), ωi + (K1/4))
- K3 = h f(ti + (3h/8), ωi + (3K1/32) + (9K2/32))
- K4 = h f(ti + (12h/13), ωi + (1932K1/2197) - (7200K2/2197) + (7296K3/2197))
- K5 = h f(ti + h, ωi + (439K1/216) - 8K2 + (3680K3/513) - (845K4/4104))
- K6 = h f(ti + (h/2), ωi - (8K1/27) + 2K2 - (3544K3/2565) + (1859K4/4104) - (11K5/40))
Class Notes
These are simply the transcripts (in portuguese) of the class notes my professor has taken, for us to revise as needed.
1. Problema de valor inicial para Equações Diferenciais Ordinárias. A quase totalidade dos fenômenos físicos que observamos ao nosso redor são descritos matematicamente através de Equações Diferenciais. A este procedimento dá-se o nome de modelagem matemática, ou simplesmente modelagem. As Equações Diferenciais resultantes podem ser ordinárias ou parciais, lineares ou não lineares e de ordens diferentes. A grande maioria destas equações não possuem solução analítica e só podem ser resolvidas aproximadamente, utilizando-se métodos numéricos e suas implementações computacionais correspondentes, apropriadas para este fim. No que se segue, iremos estudar métodos de soluções computacionais para EDOs (no tempo), lineares ou não lineares, de primeira ordem. A generalização para sistemas de equações de 1° ordem e para equações de ordem superior será abordada posteriormente.
1.1 - Método de Euler
Apesar do método de Euler ser raramente utilizado na prática, a simplicidade de uma dedução pode ser usada para ilustrar a lógica por trás da dedução das técnicas mais sofisticadas. O objetivo do método é obter uma aproximação para a solução do problema de valor inicial:
(dy/dt) = f(y, t), a ≤ t ≤ b e y(a) = α
Primeiro, vamos investigar graficamente o problema:
Vamos deduzir o método utilizando o teorema de taylor:
y(ti+1) = y(ti) + (ti+1 - ti) y'(ti) + [(ti+1 - ti)2 / 2] y'' (ξi)
Para algum ξi em [ti, ti+1] como h = ti+1 - ti
=> y(ti+1) = y(ti) + h y'(ti) + (h/2)2 y'' (ξi), onde y'(ti) = f(y, t)
=> y(ti+1) = y(ti) + h f(y(ti), ti) + (h/2)2 y'' (ξi), onde y'(ti) = f(y, t)
Então o método de Euler aproxima y(ti+1) por excluir termos de ordem superior.
ω0 = α ; ωi+1 = ωi + h f(ti, ωi) para cada i = 0, 1, 2, ..., N-1
A equação acima é chamada equação de diferença associada ao método de Euler. Exemplo: y' = y - t2 + 1 ; aproxime y para 0 ≤ t ≤ 2 ; y(0) = 0.5. Vamos fazer N = 10, ou seja, h = 0.2, ti = 0.2 i ; tN = 2.0 e t0 = 0.0. Começamos o nosso procedimento computacional fazendo ω0 = y(t0) = 0.5. Agora, conforme indicado na equação de diferença associada ao método de Euler: