Эксперимент №1

Здесь, выберем минимальный эмпирический параметр $w$ в аппроксимации дельта-функции по следующему критерию: количество ненулевых элементов неоднородности на точном решении минимально.

Набор параметров

α       = 0.005;        # Параметр регуляризации
w       = 0.0001;       # Эмпирический параметр регуляризации
S       = 5000;         # Количество итераций
β       = 0.001;        # Шаг минимизации
x_tp    = 0.1;          # Стартовое местоположение фронта
T_end   = 0.42;         # Регулируем конечное местоположение фронта
ε       = 0.03;         # Крутизна фронта

in("Travis", keys(ENV)) && S = 300

using NonLinearReactionAdvectionDiffusionWithFrontData
using NonLinearReactionAdvectionDiffusionWithFrontData: heterogeneity_map;
using Plots; gr();

a, b, t₀, T, N, M, ε, Xₙ, Tₘ, qₙ, ulₘ, urₘ, u₀ = dparams(x_tp=0.1,
                                                        ε = 0.03,
                                                        Nx = 200,
                                                        Mt = 250,
                                                        T_end = 0.42);
u, XX, TP = solve(u₀, Xₙ, N, Tₘ, M, ε, ulₘ, urₘ, qₙ);
ϕl, ϕr, ϕ, f1_data, f2_data = generate_obs_data(u, Xₙ, N, Tₘ, M, qₙ, ulₘ, urₘ);
directP = draft(u, Xₙ, N, Tₘ, M, title = "Эскиз прямого решения")

Найдем начальное приближение

q_guess = initial_guess(f1_data, Xₙ, N, Tₘ, M, ulₘ, urₘ, α);
plot(Xₙ, qₙ, label="Истинное");
plot!(Xₙ, q_guess, label="Найденное")
0.00 0.25 0.50 0.75 1.00 -4 -2 0 2 4 Истинное Найденное

В следующей строке, мы записываем все параметры в latex формате, не забываем экранировать все спецсимволы. Дальше, мы отобразим все эти параметры на графике.

using Printf;
params = "\$w = $(w), \\varepsilon = $(ε), "*
"\\beta = $(β), f_1 \\in $(@sprintf("[%.2f, %.2f]", extrema(f1_data)...)), "*
"\\alpha = $(α)\$"

Выбор эмпирического параметра в аппроксимации дельта-функции


Ненулевых элементов должно быть мало

hmap = heterogeneity_map(XX, N, Tₘ, M, u, f1_data, f2_data, w);
@info "Ненулевых элементов $(length( findall( x -> ! isapprox(x, 0), hmap)))"

heterogeneityP = heatmap(hmap, yflip=true)
50 100 150 200 250 25 50 75 100 125 150 175 - 200 - 100 0 100 200

Старт с нулевого начального приближения


q₀ = zero(q_guess);
@time qs, Js, Qs = minimize(q₀, u₀, ulₘ, urₘ, Xₙ, N, Tₘ, M, ε, f1_data, f2_data, S = S, β = β, w = w)
([-2.581991591141429e-17, 1.0918282029611521, 1.3080519308803966, 1.348498569080109, 1.3537208469320756, 1.351901244551985, 1.3486863128656565, 1.3452154748618548, 1.3417314058601775, 1.33830135591564  …  1.3481269899283095, 1.354123850367748, 1.3572228724875643, 1.3545790133371247, 1.3405360757897957, 1.3038493561277265, 1.2221648995057508, 1.0510467519585045, 0.7021712724461707, 0.0], [13.048450774683097, 13.042664938806995, 13.036891287665913, 13.031129761315341, 13.025380299766407, 13.019642842984458, 13.013917330887438, 13.008203703344128, 13.002501900172156, 12.996811861135857  …  7.770555207853637, 8.336375161485751, 7.770247431115131, 8.33589445592494, 7.769939768164151, 8.335413888131272, 7.76963221894758, 8.334933458070594, 7.769324783412476, 8.334453165708645], [0.0 -7.396330078790552e-20 … -8.606638637138096e-18 -3.4426554548552385e-17; 0.0 0.0030233365025913745 … 1.0917481336907922 1.0655710372429077; … ; 0.0 -8.501978378641149e-7 … 0.7020992399823549 0.711159538689802; 0.0 0.0 … 0.0 0.0])

эскиз

noguessP = minimization_draft(qₙ, Qs, Xₙ, N, Js, zoom = true, annotate_string = params)

Старт с найденного приближения


q₀ = q_guess;
@time qs, Js, Qs = minimize(q₀, u₀, ulₘ, urₘ, Xₙ, N, Tₘ, M, ε, f1_data, f2_data, S = S, β = β, w = w)
([2.30010559855361, 1.9297670300955256, 1.8560534559448747, 1.841499465922379, 1.8388498666200577, 1.8386162010885059, 1.8388728132350551, 1.839223605531247, 1.839584677545235, 1.839936161630901  …  0.2869442984631779, 0.28267314432324736, 0.27381473515113863, 0.2557512745456522, 0.21921830949816418, 0.14565100408737905, -0.0021045304650731678, -0.2982933392839536, -0.8909957139124927, -2.074740805227373], [9.82533032307308, 9.821945353348971, 9.818559478220235, 9.815172692883866, 9.811784992544782, 9.808396372415794, 9.80500682771745, 9.801616353678071, 9.79822494553358, 9.794832598527522  …  1.4855736545582805, 0.9278165725337845, 1.485235131941975, 0.9277453512727728, 1.4848968104519003, 0.927674206915832, 1.4845586899519463, 0.9276031393812332, 1.4842207703059938, 0.9275321485874101], [2.3001055985536096 2.30010559855361 … 2.3001055985536096 2.3001055985536096; 2.3001055985536096 2.299922947848893 … 1.9297424967222174 1.948464519472656; … ; -2.074740805227373 -2.073731122715058 … -0.8910293504435957 -0.8967935408974335; -2.074740805227373 -2.074740805227373 … -2.074740805227373 -2.074740805227373])

эскиз

withguessP = minimization_draft(qₙ, Qs, Xₙ, N, Js,
                        zoom = true, annotate_string = params)


savefig(directP, "direct2.png")
savefig(heterogeneityP, "heterogeneity2.png")
savefig(noguessP, "noguess2.png")
savefig(withguessP, "withguess2.png")


This page was generated using Literate.jl.