From 62c99e26ebba6ad2019eccf88d7739050aed3433 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Wed, 30 Mar 2022 03:03:24 +0200 Subject: [PATCH] Done day 3 --- Day_3/Day_3.jl | 99 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/Day_3/Day_3.jl b/Day_3/Day_3.jl index d44ff1d..f9ca3ca 100644 --- a/Day_3/Day_3.jl +++ b/Day_3/Day_3.jl @@ -388,8 +388,95 @@ savefig("resources/test_figure_export.pdf") # ╔═╡ f44cf458-4ec1-4e2b-b839-f3981683a151 md""" # Data fitting +Using data fitting, you can determine a model that does describe your measurements. + +It is best explained using an example! """ +# ╔═╡ 25362ad6-5b49-4900-8026-c2d54197ba94 +md""" +## Example +""" + +# ╔═╡ d6c9be8a-1025-449c-86c8-7d92ad240965 +# Defining a model. +# Here, we did choose a linear model `f(x) = m * x + c` +@. linear_model(x, p) = p[1] * x + p[2] + +# ╔═╡ 9befeddf-24fa-4af8-9b1d-df1a9865a9ff +# Initial guess of the parameters in `p` +# ⚠️ THE TYPE OF THIS VECTOR HAS TO BE FLOAT FOR NOW (because of a bug). +p0 = [1.0, 1.0] + +# ╔═╡ e4c81d90-8d06-4c38-9886-252aa7285558 +# You have to strip units and remove errors +fit = curve_fit( + linear_model, # First argument is the model + ustrip.(Measurements.value.(df_I_B_with_err.I)), # Measured x values + ustrip.(Measurements.value.(df_I_B_with_err.B)), # Measured y values + p0 +) + +# ╔═╡ ee858e78-6b69-485f-95d5-d735956e26d1 +# Our fit parameters +param = fit.param + +# ╔═╡ 51a17b24-b71b-4670-9bc5-de7576d6fc75 +# The error of the fit parameters +sigma = stderror(fit) + +# ╔═╡ 5957fce3-dcbd-4fc5-83b7-6730b6412dbd +begin + custom_scatter( + df_I_B_with_err, "I", "B"; + label="B(I)", + markershape=:diamond, + markersize=3, + ) + + x = Measurements.value.(ustrip.(LinRange( + minimum(df_I_B_with_err.I), + maximum(df_I_B_with_err.I), + 250 + ))) + + plot!( + x, linear_model(x, param), + label="Linear fit", + linewidth=3, # Change line width + ) +end + +# ╔═╡ 385c3771-757c-49a7-8b8c-916e76524082 +md""" +## Automation +Again, you can automate this process! +""" + +# ╔═╡ ef6274cf-f1fb-4f86-becf-eeb181ed92fc +function automated_fit(model, df, x_column_name, y_column_name, p0=[1.0, 1.0]) + fit = curve_fit( + model, + ustrip.(Measurements.value.(df[!, x_column_name])), + ustrip.(Measurements.value.(df[!, y_column_name])), + p0 + ) + + param = fit.param + sigma = stderror(fit) + + return (param, sigma) +end + +# ╔═╡ 409a9f5a-138a-491f-9789-520926be9dbd +# Test automation function +param2, sigma2 = automated_fit( + linear_model, + df_I_B_with_err, + "I", + "B", +) + # ╔═╡ 00000000-0000-0000-0000-000000000001 PLUTO_PROJECT_TOML_CONTENTS = """ [deps] @@ -1747,8 +1834,18 @@ version = "0.9.1+5" # ╠═6ab56f2d-759d-44ac-8427-55f85942615e # ╟─1d524a9b-84e9-4ffd-b104-331055c78845 # ╠═1e14de84-7d87-4df4-8c88-2307cb2262ba -# ╠═f44cf458-4ec1-4e2b-b839-f3981683a151 +# ╟─f44cf458-4ec1-4e2b-b839-f3981683a151 # ╠═c985a351-cbc7-4385-b5f7-b709eee47092 +# ╟─25362ad6-5b49-4900-8026-c2d54197ba94 +# ╠═d6c9be8a-1025-449c-86c8-7d92ad240965 +# ╠═9befeddf-24fa-4af8-9b1d-df1a9865a9ff +# ╠═e4c81d90-8d06-4c38-9886-252aa7285558 +# ╠═ee858e78-6b69-485f-95d5-d735956e26d1 +# ╠═51a17b24-b71b-4670-9bc5-de7576d6fc75 +# ╠═5957fce3-dcbd-4fc5-83b7-6730b6412dbd +# ╟─385c3771-757c-49a7-8b8c-916e76524082 +# ╠═ef6274cf-f1fb-4f86-becf-eeb181ed92fc +# ╠═409a9f5a-138a-491f-9789-520926be9dbd # ╟─32f4633c-af89-11ec-0059-5392abfd3bc3 # ╟─00000000-0000-0000-0000-000000000001 # ╟─00000000-0000-0000-0000-000000000002