{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Week 3 - Fitting a curve"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Plots.GRBackend()"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# You may need this setup\n",
"using Plots\n",
"gr() # Activate the GR backend for use with Plots"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"using DelimitedFiles"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import the supplied data representing 15 pairs to x- and y-values. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"data_tofit = readdlm(\"Week3_PR_Data.dat\", '\\t');"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.1268004831284406, -1.6416953879765301]\n",
"[0.5013092807380928, -0.9776975375269383]\n",
"[1.5280121125586477, 0.5277112203195138]\n",
"[1.7001225303407743, 1.711524991194374]\n",
"[1.9924936253216172, 1.8910000148140624]\n",
"[2.706075824201991, -0.46342779446395]\n",
"[2.9949319274309043, -0.4435666186385725]\n",
"[3.4918528112833935, -1.275179133203867]\n",
"[3.501191722475427, -0.6904995966451337]\n",
"[4.459924502120439, -5.51613079927097]\n",
"[4.936965850879389, -6.001703074115855]\n",
"[5.023289852369695, -8.364169009651015]\n",
"[5.042336980089736, -7.924477516763416]\n",
"[5.507392850419521, -10.774823709545498]\n",
"[5.568665171088307, -10.917187797703853]\n"
]
}
],
"source": [
"for i = 1:size(data_tofit)[1]\n",
" println(data_tofit[i,:])\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"x, y = data_tofit[:,1], data_tofit[:,2];"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we do a scatterplot, this gives us the points the line must go through."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Plot the x and y data points using a scatter plot of the x and y array variables\n",
"plot(x,y,line=:scatter,legend=:false)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the line, we need a function, which we now define. Note that the parameters a, b, c need not be passed to the function: we will keep resetting them to try to improve the fit."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"parabfit (generic function with 1 method)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create a function called parabfit, with x as the argument, returning a*x^2 + b*x + c\n",
"function parabfit(x)\n",
" return a*x^2 + b*x + c\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check that we do get a reasonable parabola. Choose your own interval [xmin, xmax] and parameters a, b, c. If it looks too much like a straight line, chance your choices until it does."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create variables a, b and c, assigning each the value 1\n",
"a = 1\n",
"b = 1\n",
"c = 1\n",
"\n",
"f = Array{Float64}(undef,length(-5:0.5:5))\n",
"\n",
"# Plot the function parabfit, for x values between -5 and 5 \n",
"i = 1\n",
"for j = -5:0.5:5\n",
" f[i] = parabfit(j) \n",
" i = i + 1\n",
"end\n",
"\n",
"plot(-5:0.5:5,f)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we choose a, b, c and plot the curve together with the points. \n",
"\n",
"Note that by looking at where the data points lie, we can deduce some of the properties for a, b, c, as follows.\n",
"\n",
"The plot must have a y-intersection that is close to 0, so c is close to 0. Also, the parabola is open downwards, so a must be negative. Finally, it has its maximum at a positive x, so b must be positive. \n",
"\n",
"Use plot() to start with the scatter plot and plot!() to add the curve for parabfit. (There are other ways to do this ...)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# More plot!() tries.\n",
"rangez = 0:0.5:6\n",
"a,b,c = -1,4,-3\n",
"\n",
"f = Array{Float64}(undef,length(rangez))\n",
"\n",
"# Plot the function parabfit, for x values between -5 and 5 \n",
"i = 1\n",
"for j = rangez\n",
" f[i] = parabfit(j) \n",
" i = i + 1\n",
"end\n",
"plot(x,y,line=:scatter,legend=:false)\n",
"plot!(rangez,f)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.2.0",
"language": "julia",
"name": "julia-1.2"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.2.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}