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

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

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

α       = 0.005;        # Параметр регуляризации
w       = 0.005;        # Эмпирический параметр регуляризации
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 - 300 - 200 - 100 0 100 200 300

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


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)
([-1.3770621819420955e-17, 2.14474328557125, 2.5601892467403466, 2.6273399300054385, 2.624090000034709, 2.6064520479468243, 2.585748689503742, 2.564283666800001, 2.542536072626833, 2.520614361212681  …  2.7808894445926624, 2.791782410236445, 2.796697555981675, 2.789854996026371, 2.7597500148303475, 2.683452941103582, 2.5152149425254793, 2.163695059330096, 1.4465175894652134, 0.0], [13.048450774683097, 13.03805210657401, 13.027661548915908, 13.017279036691802, 13.006904500154779, 12.996537864515942, 12.986179049611193, 12.975827969545747, 12.965484532314697, 12.955148639397922  …  0.0028385512155449794, 0.0028372796435213975, 0.002836009933041631, 0.0028347420820478875, 0.002833476088481413, 0.0028322119502873127, 0.0028309496654108307, 0.002829689231804214, 0.0028284306474185747, 0.002827173910208316], [0.0 -4.0343618611584826e-20 … 2.237726045655905e-17 -4.991850409540096e-17; 0.0 0.005349318664110512 … 2.144659955416068 2.144701623352815; … ; 0.0 -1.8297961322431372e-6 … 1.4463668457442846 1.4464422155520094; 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, 2.1159478343215707, 2.0805488065885163, 2.0750586936641353, 2.0756276190697407, 2.077427788109079, 2.079473472695481, 2.0815626677974355, 2.0836545498104706, 2.085741437953107  …  0.4616483759395755, 0.45991815032192307, 0.4530323726465449, 0.43599216077625186, 0.398772207613682, 0.32128562531871596, 0.16333177842276975, -0.15542944049715274, -0.7952400203042351, -2.074740805227373], [9.82533032307308, 9.795864462840814, 9.766594528385074, 9.73750251046199, 9.708570658258362, 9.679781520782372, 9.651117984275196, 9.622563306006464, 9.594101144814594, 9.565715588743855  …  0.00406253481407688, 0.004061895647035436, 0.004061257166456555, 0.004060619371782798, 0.004059982262463414, 0.004059345837934999, 0.004058710097653614, 0.004058075041057856, 0.0040574406675973574, 0.00405680697672047], [2.3001055985536096 2.30010559855361 … 2.3001055985536105 2.30010559855361; 2.3001055985536096 2.2956138694015893 … 2.1158399483742625 2.115893893795833; … ; -2.074740805227373 -2.0720140289931512 … -0.7954433815760125 -0.7953416998499775; -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.