Calculus

  Not much information on calculus will be logged here, only enough to solve methods like Taylor's, whose solving needs N derivatives for the Nth order of the series.

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))
holy fuck

Multistep methods

y' = f(t, y(t)); a ≤ t ≤ b; y(a) = α

ωi+1 = am-1 ωi + am-2 ωi-1 + am-3 ωi-2 + ... + a0 ωi+1-m + h[bm f(ti+1, ωi+1) + bm-1 f(ti, ωi) + bm-2 f(ti-1, ωi-1) + ... + b0 f(ti+1-m, ωi+1-m)]

m is the number of steps and is an integer greater than 1. (An m = 1 would be a one-step method)

∫(from ti to ti+1) y' dt = ∫(from ti to ti+1) [f(t, y(t)) dt]

y(ti+1) - y(ti) = ∫(from ti to ti+1) [f(t, y(t)) dt]

y(ti+1) = ∫(from ti to ti+1) [f(t, y(t)) dt] + y(ti)


Adams-Bashforth Two Step Explicit Method (Método Explícito de Adams-Bashforth de dois passos):

ω0 = α0; ω1 = α1

ωi+1 = ωi (h/2) [3 f(ti, ωi) - f(ti-1, ωi-1)] → τ(h) = O(h2)


Predictor-Corrector Scheme (Esquema Preditor-Corretor)

Uses the M Step Explicit Method to find the prediction and uses the M-1 Step Implicit methor to correct the prediction. Note that both methods are of τ(h) = O(hm) order.

In this Predictor-Corrector Scheme, ω(0)i+1 and ω(1)i+1, where (0) indicates predictor, and (1) indicates corrector

Example: 4 Step Explicit and 3 Step Implicit on the Predictor-Corrector Scheme y' = t e3t + 2 y

Finite Linear Differences

y''(xi) ≈ (1/h2)[y(xi+1) - 2y(xi) + y(xi-1)] -> Finite CENTERED Differences (Diferenças finitas centradas) of 2° order.

y'(xi) ≈ (1/2h)[y(xi+1) - y(xi-1)] -> Finite Centered Differences









y'' = -(y')² - y + ln(x); 1 ≤ x ≤ 2; y(1) = 0; y(2) = ln(2); h = 0.25;

y''i ≈ (1/h²)(ωi+1 - 2ωi + ωi-1)
y'i ≈ (1/2h)(ωi+1 - ωi-1)

P/x1 : (1/h²)(ω2 - 2ω1 + 0) + (1/4h²)(ω2² - 2ω2 * 0 + 0) + ω1 - ln(1.25) = 0

P/x2 : (1/h²)(ω3 - 2ω2 + ω1) + (1/4h²)(ω3² - 2ω3 * ω1 + ω1²) + ω2 - ln(1.5) = 0

P/x3 : (1/h²)(ln(2) - 2ω3 + ω2) + (1/4h²)(ln(2)² - 2ln(2) * ω2² + ω2²) + ω3 - ln(1.75) = 0





Matriz Jacobiana (J):

(-2/h²) + 1 | (1/h²) + (ω2/2h²) | 0

(1/h²) + [(-ω3 + ω1)/2h²] | (-2/h²) + 1 | (1/h²) + [(ω3 - ω1)/2h²]

0 | (1/h²) + [(-ln(2) + ω2)/2h²] | (-2/h²) + 1





Para montar a equação de formato x(k+1) = x(k) - J(x(k)) F(x(k)), precisamos agora do vetor F(x(k))

ω(0) = [ω1(0) , ω2(0) , ω3(0)] -> [0 , 1 , -1]

J(ω(0)), com o chute inicial (valores de ω):

-31 | 24 | 0

24 | -31 | 8

0 | 18.4548 | -31





F(ω(0)), usando os valores de ω nas funções dadas (P/x):

Eq. geral: 16(ωi+1 - 2ωi + ωi-1) + 4(ωi+1² - 2ωi+1 * ωi-1 + ωi-1²) + ωi - ln(x) = 0

16(1 - 0 + 0) + 4(1 - 2 * 0 + 0) + 0 - 0.2231 = 19.7769

16(-1 -2 + 0) + 4(1 + 2 * 0 + 0) + 1 - 0.4054 = -43.4054

16(0.6931 + 2 + 1) + 4(0.4803 - 1.3862 * 1 + 1) + -1 - 0.5596 = 57.9074





Agora, suponha que J z = F. Com J sendo nossa Jacobiana e F sendo o vetor que acabamos de calcular:

[ -31 | 24 | 0 ] [z1] = [ 19.7769]

[ 24 | -31 | 8 ] [z2] = [-43.4055]

[ 0 | 18.4548 | -31 ] [z3] = [ 57.9074]

[ -31 | 24 | 0 ] [z1] = [ 19.7769]

[ 24 | -31 | 8 ] [z2] = [-43.4055]

[ 0 | 18.4548 | -31 ] [z3] = [ 57.9074]

Com isso, temos que [z1 , z2 , z3] = [ 0.6917 , 1.7175 , -0.8455]





Finalmente, teremos que ω(1) = ω(0) - z

ω(1) = [ 0 , 1 , -1] - [ 0.6917 , 1.7175 , -0.8455]

ω(1) = [ -0.6917 , -0.7175 , -0.1545]

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:

dydt = 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: