neil zrewidował ten Gist 11 months ago. Przejdź do rewizji
Brak zmian
neil zrewidował ten Gist 11 months ago. Przejdź do rewizji
Brak zmian
neil zrewidował ten Gist 11 months ago. Przejdź do rewizji
1 file changed, 41 insertions
implicit_relaxation.jl(stworzono plik)
| @@ -0,0 +1,41 @@ | |||
| 1 | + | using McCormick, BenchmarkTools | |
| 2 | + | ||
| 3 | + | """ | |
| 4 | + | Direct relaxation of implicit function | |
| 5 | + | """ | |
| 6 | + | function direct_relax(f, x, p) | |
| 7 | + | delta = Inf | |
| 8 | + | while delta > 1e-8 | |
| 9 | + | x_prev = x | |
| 10 | + | x = f(x, p) | |
| 11 | + | delta = abs(x_prev.cv - x.cv) + abs(x_prev.cc - x.cc) | |
| 12 | + | end | |
| 13 | + | ||
| 14 | + | return x | |
| 15 | + | end | |
| 16 | + | ||
| 17 | + | """ | |
| 18 | + | Faster alternative | |
| 19 | + | """ | |
| 20 | + | function fast_direct_relax(f, x, p) | |
| 21 | + | delta = Inf | |
| 22 | + | while delta > 1e-8 | |
| 23 | + | x_prev = x | |
| 24 | + | x_m = x.cv + .5 * (x.cc - x.cv) | |
| 25 | + | x = f(x_m, p) | |
| 26 | + | delta = abs(x_prev.cv - x.cv) + abs(x_prev.cc - x.cc) | |
| 27 | + | end | |
| 28 | + | ||
| 29 | + | return x | |
| 30 | + | end | |
| 31 | + | ||
| 32 | + | f(x, p) = (p - (p^3)/6 + (p^5)/120)*x^(-1/2) + 100 | |
| 33 | + | ||
| 34 | + | p = MC{1,NS}(1.0, 1.0, Interval(0.5, 5.0)) | |
| 35 | + | x = MC{1,NS}(1.0, 1.0) | |
| 36 | + | ||
| 37 | + | res = @btime direct_relax(f, x, p) | |
| 38 | + | println(res) # 342.860 μs (2414 allocations: 96.52 KiB) MC{1, NS}(99.8362536820914, 100.40188539116205, [97.9454, 103.135], [0.0], [0.0], true) | |
| 39 | + | ||
| 40 | + | res = @btime fast_direct_relax(f, x, p) | |
| 41 | + | println(res) # 2.972 μs (301 allocations: 4.75 KiB) MC{1, NS}(99.8675794497822, 100.37248484959062, [97.9679, 103.101], [0.0], [0.0], true) | |
Nowsze
Starsze