diff --git a/exercise7/main.pdf b/exercise7/main.pdf index be11ac8..c86342c 100644 Binary files a/exercise7/main.pdf and b/exercise7/main.pdf differ diff --git a/exercise7/main.typ b/exercise7/main.typ index eb22182..5ed9a5f 100644 --- a/exercise7/main.typ +++ b/exercise7/main.typ @@ -37,3 +37,7 @@ this document was created using = problem 2 #include "problem2.typ" + += problem 4 + +#include "problem4.typ" diff --git a/exercise7/problem4.typ b/exercise7/problem4.typ new file mode 100644 index 0000000..eae10d1 --- /dev/null +++ b/exercise7/problem4.typ @@ -0,0 +1,70 @@ +#import "@preview/physica:0.9.6": * + +== a) + +given the explicit midpoint method +$ + y_(n+1) = y_n + h f(t_n + 0.5h, y_n + 0.5h f(t_n, y_n)), +$ +notice $k_1 = f(t_n, y_n)$ appears at depth 1 meaning the funcion is only nested +twice, such that our number of stages $s = 2$. furthermore, we have $c_2 = 0.5$ +from the time step and $a_21 = 0.5$ from the function step. we can also observe +that $b_1 = 1$ and $b_2 = 0$. this can be visualized in a mnemonic butcher +tableau. + +#let butcher(s, nums) = { + let nums = nums.map(x => $#x$) + table( + stroke: (x, y) => if x == 0 and y == s { + (right: 0.7pt + black, top: 0.7pt + black) + } else if x == 0 { + (right: 0.7pt + black) + } else if y == s { + (top: 0.7pt + black) + }, + align: (x, y) => ( + if x > 0 { center } else { left } + ), + columns: s + 1, + $0$, ..range(s).map(x => none), // first row + ..range(2, s + 1) + .map(i => { + let p(i) = calc.floor(i * i / 2 + i / 2 - 1) + ( + nums.slice(p(i - 1), p(i - 1) + i), + range(i, s + 1).map(x => none), + ).flatten() + }) + .flatten(), + none, ..nums.rev().slice(0, s).rev() // last row + ) +} + +#align(center)[#butcher(2, (0.5, 0.5, 1, 0))] + +#pagebreak() + +== b) + +I don't wanna write python right now, so I'm gonna solve this in typst. yes, I'm +coding this in the typesetting language I use to write this text. + +#let code = ```typc + let h = 0.01; + let f(t, y) = calc.exp(-y * y); + let y_1(t_0, y_0) = y_0 + + h * f(t_0 + 0.5 * h, + y_0 + 0.5 * h * f(t_0, y_0)); + let t = 0; + let y = 1; + while t < 1 { + y = y_1(t, y); + t += h; + }; + [the value for $y$ at $t = 1$ is + #calc.round(y, digits: 4)] +``` + +#eval(code.text.split("\n").join()) + +#code