neil ha revisionato questo gist 11 months ago. Vai alla revisione
Nessuna modifica
neil ha revisionato questo gist 11 months ago. Vai alla revisione
Nessuna modifica
neil ha revisionato questo gist 11 months ago. Vai alla revisione
1 file changed, 41 insertions
implicit_relaxation.jl(file creato)
| @@ -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) | |
Più nuovi
Più vecchi