mirror of
https://github.com/fverdugo/XM_40017.git
synced 2026-11-15 05:57:17 +01:00
Merge pull request #69 from fverdugo/2025-26
Rephrase exercise 3 in notebook julia_basics
This commit is contained in:
3 files changed
+7361
-12
No files matched your search
@@ -27,12 +27,17 @@ ex2(f,g) = x -> f(x) + g(x)
|
|||||||
### Exercise 3
|
### Exercise 3
|
||||||
|
|
||||||
```julia
|
```julia
|
||||||
using GLMakie
|
|
||||||
max_iters = 100
|
|
||||||
n = 1000
|
n = 1000
|
||||||
x = LinRange(-1.7,0.7,n)
|
x = LinRange(-1.7,0.7,n)
|
||||||
y = LinRange(-1.2,1.2,n)
|
y = LinRange(-1.2,1.2,n)
|
||||||
heatmap(x,y,(i,j)->mandel(i,j,max_iters))
|
values = zeros(n,n)
|
||||||
|
for j in 1:n
|
||||||
|
for i in 1:n
|
||||||
|
values[i,j] = surprise(x[i],y[j])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
using GLMakie
|
||||||
|
heatmap(x,y,values)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Asynchronous programming in Julia
|
## Asynchronous programming in Julia
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
|
After Width: | Height: | Size: 440 KiB |
@@ -1680,7 +1680,7 @@
|
|||||||
"source": [
|
"source": [
|
||||||
"### Exercise 3 (hard)\n",
|
"### Exercise 3 (hard)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"Function `mandel` estimates if a given point `(x,y)` in the complex plane belongs to the [Mandelbrot set](https://en.wikipedia.org/wiki/Mandelbrot_set)."
|
"Function `surprise(x,y)` takes the `x` and `y` coordinates of a point and returns a scalar value. Visualize the result of function `surprise(x,y)` for all points in a Cartesian grid of the box with range $(-1.7,0.7)$ in the horizontal direction and range $(-1.2,1.2)$ in vertical direction. Use at least `n=1000` points in each direction (1000$^2$ points in total). What do you see? Surprise!\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1690,7 +1690,11 @@
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"function mandel(x,y,max_iters)\n",
|
"function surprise(x,y)\n",
|
||||||
|
" # You don't need to understand\n",
|
||||||
|
" # the body of this function.\n",
|
||||||
|
" # Treat it as a black box.\n",
|
||||||
|
" max_iters = 100\n",
|
||||||
" z = Complex(x,y)\n",
|
" z = Complex(x,y)\n",
|
||||||
" c = z\n",
|
" c = z\n",
|
||||||
" threshold=2\n",
|
" threshold=2\n",
|
||||||
@@ -1700,22 +1704,38 @@
|
|||||||
" end\n",
|
" end\n",
|
||||||
" z = z^2 +c\n",
|
" z = z^2 +c\n",
|
||||||
" end\n",
|
" end\n",
|
||||||
" max_iters\n",
|
" return max_iters\n",
|
||||||
"end"
|
"end"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"attachments": {
|
||||||
|
"Screenshot%20from%202025-09-05%2014-41-15.png": {
|
||||||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9EAAANbCAYAAABFGxzNAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AACAASURBVHic7N13fFRl3v7xa1JAQAyEJiGoIKIC+kukS9QlIAgEkIdQVpAiTQHdxfaoi66vfURZBSzAAxKDiItSRLoUKUuR3pSiS0JgEVjpxYCEDDm/P3bhMU4STpK555xJPu/Xa/7wzOS+v3Mte5IrmTnjsSzLEgAAAAAAuK4QpwcAAAAAACBYUKIBAAAAALCJEg0AAAAAgE2UaAAAAAAAbKJEAwAAAABgEyUaAAAAAACbKNEAAAAAANhEiQYAAAAAwCZKNAAAAAAANlGiAQAAAACwiRINAAAAAIBNlGgAAAAAAGyiRAMAAAAAYBMlGgAAAAAAmyjRAAAAAADYRIkGAAAAAMAmSjQAAAAAADZRogEAAAAAsIkSDQAAAACATZRoAAAAAABsokQDAAAAAGATJRoAAAAAAJso0QAAAAAA2ESJBgAAAADAJko0AAAAAAA2UaIBAAAAALCJEg0AAAAAgE1hTg8AOOHQoUM6ceKEz/HY2FiFhPjvd0vff/+9Ll68mO1YqVKlVKdOHb/tAQAAACBwKNEolr755hs99thjPseXLl2qVq1a+WWPU6dO6b777tOlS5eyHR88eLDGjx/vlz0AAAAABBYv50ax1LlzZ1WpUsXn+KRJk/y2xyeffOJToCWpf//+ftsDAAAAQGBRolEslShRQk888YTP8Xnz5uno0aN+2SM5OdnnWOPGjRUbG+uX9QEAAAAEHiUaxdaTTz6p0NDQbMe8Xq8++eSTQq+9Zs0a7d271+f4oEGDCr02AAAAAOdQolFs3XLLLWrTpo3P8aSkJGVlZRVq7ZxeFh4REaGuXbsWal0AAAAAzqJEo1h76qmnfI4dOHBAy5cvL/Cap06d0uzZs32OP/744ypTpkyB1wUAAADgPEo0irVHHnlENWrU8DmelJRU4DWnTp2a4wXF+vXrV+A1AQAAALgDJRrFWkhIiAYOHOhzfO7cuQW+wFhOFxS7//77FRMTU6D1AAAAALgHJRrFXv/+/VWyZMlsxwp6gbE1a9Zoz549Pse5oBgAAABQNFCiUexVrFhRnTt39jlekAuM5fQy8HLlyikxMbHA8wEAAABwD0o0oNwvMLZixQrba5w9e1Zffvmlz/HevXurdOnShZoPAAAAgDtQogFJcXFxuueee3yO5/RRVbmZMmWKLl686HN8wIABhZoNAAAAgHtQooH/ePLJJ32OzZ07V//6179sff1HH33kc+yBBx5Q3bp1Cz0bAAAAAHegRAP/8fjjj+umm27KdszuBcbWrl3LBcUAAACAYoASDfxH2bJl9dhjj/kct3OBsZxe9l2hQoUcL1gGAAAAIHhRooFfyekCY2lpaXleYCy3C4r16tVLN9xwg1/nAwAAAOAsSjTwK/fee6/uv/9+n+M5fXTVVbldUKx///5+nQ0AAACA8yjRwG/k9NfovC4wltMFxR566CHVqVPH77MBAAAAcBYlGviNLl26qHLlytmOZWZmaurUqT6PXbduHRcUAwAAAIoRSjTwGyVLllSfPn18jk+aNMnnAmO5XVCsU6dOpsYDAAAA4CBKNJCDQYMGKSQk+/890tLStHLlymv/ffbsWc2ePdvna/v27csFxQAAAIAiihIN5KBmzZpq1aqVz/FfX2Dsk08+8bmgmMfj0YABA4zPBwAAAMAZlGggFzldYGzOnDnXLjCW0wXFmjdvrtq1axufDQAAAIAzKNFALtq1a6dbb70127GrFxhbt26ddu/e7fM1XFAMAAAAKNoo0UAuQkNDc/ys50mTJunDDz/0OV6xYkV17NgxEKMBAAAAcIjHsizL6SEAt/rpp590yy23KDMzM9vxkJAQnyt1v/jii/rrX/8ayPEAAAAABBh/iQbycPPNN+f4cVW/LdAejyfHv1oDAAAAKFoo0cB15HSBsd9q2bKl7rjjjgBMAwAAAMBJlGjgOn73u9+pXr16eT5m4MCBAZoGAAAAgJMo0YANeZXkKlWqcEExAAAAoJigRAM29OrVS2XKlMnxvieeeELh4eEBnggAAACAEyjRgA0RERFq3769z/GQkBANGDDAgYkAAAAAOIESDdhgWZa2bNnic/zhhx9WjRo1HJgIAAAAgBMo0YANy5cv1/79+32ODxo0yIFpAAAAADiFEg3YMGHCBJ9jVatWzfEl3gAAAACKLko0cB2pqamaP3++z/EBAwYoLCzMgYkAAAAAOIUSDVzHe++9pytXrmQ7Fh4ezmdDAwAAAMUQJRrIw6FDhzRlyhSf4507d1a1atUCPxAAAAAAR1GigVxkZmbqiSee0IULF7IdDwkJ0SuvvOLQVAAAAACcRIkGfiUrK0uHDh3SvHnzFBcXpxUrVvg8plu3brrnnnscmA4AAACA0zyWZVlODwE4qV27dvrqq69sPTYiIkK7du1S9erVDU8FAAAAwI34SzRgk8fj0bhx4yjQAAAAQDFGiQZsCAkJ0TvvvKOePXs6PQoAAAAAB1GigTx4PB49/PDDWrt2rZ577jmnxwEAAADgMN4TjWJv1qxZSktLy3asbNmyqlatmpo0aaIqVao4NBkAAAAAt6FEAwAAAABgEy/nBgAAAADAJko0AAAAAAA2UaIBAAAAALCJEg0AAAAAgE2UaAAAAAAAbKJEAwAAAABgEyUaAAAAAACbKNEAAAAAANhEiQYAAAAAwCZKNAAAAAAANlGiAQAAAACwiRINAAAAAIBNlGgAAAAAAGyiRAMAAAAAYBMlGgAAAAAAmyjRAAAAAADYRIkGAAAAAMAmSjQAAAAAADZRogEAAAAAsIkSDQAAAACATZRoAAAAAABsokQDAAAAAGATJRoAAAAAAJso0YCfnT9/3ukRAAAAABhCiQb85NixY2ratKnKlSunZs2a6dChQ06PBAAAAMDPPJZlWU4PAQS7n376SQ8//LB2796tEiVK6PLly4qKitK6detUo0YNp8cDAAAA4Cf8JRoopIMHDyouLk67d+9WTEyMUlNT1bp1ax09elSPPPKITp065fSIAAAAAPyEEg0UwrFjx/Twww9r//79atasmVauXKnq1atr9uzZatSokfbt26f27dvr7NmzTo8KAAAAwA8o0UABZWZmql27dkpNTVVcXJyWLVum8uXLS5LKlCmjBQsWqFatWtqwYYMaN26sGTNmKCsry+GpAQAAABQGJRoooDFjxmjbtm26++67tXDhQrVv314ej0cej0ctWrRQ5cqVtXbtWtWvX1/79u1T9+7d1bRpU50+fdrp0QEAAAAUECUaKIB//vOf+stf/iJJeuqppxQREZHj426++WZt3rxZn376qWrVqqXNmzerUaNGGj9+vC5duhTIkQEAAAD4ASUaKIAFCxbo4sWLuvHGG9WpU6c8HxsSEqKePXtq06ZNatSokfbv36+hQ4cqLi6O90oDAAAAQYYSDeTT2bNnNWHCBEnSa6+9pujoaFtfFxkZqY0bN2rBggW6++67tW3bNrVv316XL182OS4AAAAAP6JEAzZdvHhRvXv3VmRkpPbu3avY2Fj98Y9/zNcaHo9HCQkJatq0qSRp3bp1+uqrr0yMCwAAAMAASjRgw6VLl9S8eXNNnTpVYWFhiomJ0YIFCxQeHl6g9e6//36FhPz7/37jx4/XhQsX/DkuAAAAAEMo0YANU6ZM0ebNm3XXXXcpJSVFO3bsULVq1Qq8Xr9+/TR//nyVK1dOy5cvV2xsrCZOnKiMjAw/Tg0AAADA3yjRwHWcOXNGo0ePliS9/fbbuvXWW/2ybrt27bRlyxbdd999SklJ0VNPPcXFxgAAAACXo0QDefj555/Vtm1bpaamqmHDhkpISPDr+rVq1dLWrVs1f/583X333dq6das6dOigX375xa/7AAAAAPAPSjSQi23btql+/frauHGj7rzzTi1cuFAej8fv+3g8HrVv314rV65U6dKltXbtWk2cONHv+wAAAAAoPEo08BunT5/WH/7wBzVt2lQpKSlq1KiRli9frsqVKxvd95dfftHFixclSTfddJPRvQAAAAAUDCUa+A+v16tx48apdu3a+uCDDyRJL7/8statW2f7s6ALo0aNGmrUqJEk6YMPPtDRo0eN7wkAAAAgfyjRwH+sXLlSTz/9tE6dOqV27dpp165devPNNwv8MVYFMWfOHN1777367rvv1L1794DtCwAAAMAeSjTwH61atdIf/vAHLVmyRAsXLtSdd94Z8BmioqK0cuVKSdLatWvVrVu3gM8AAAAAIHeUaOBX3nvvPbVu3drRGSpUqKDOnTtLkmbNmqUKFSo4Og8AAACA/0OJBlzoiy++0GOPPSZJysjI0IkTJxyeCAAAAIBEiQZca9q0aWrYsKEuXLigKlWqaPjw4U6PBAAAABR7lGjAxT7//HPFxcXJsiydOnXK6XEAAACAYi/M6QEA5K5mzZpau3atzp8/r1KlSjk9DgAAAFDsUaKBIHDTTTc5PQIAAAAA8XJuAAAAAABso0QDAAAAAGATL+d2gNfr1c8//5zt2A033OCa97xmZWVp7969+vbbb7V3714dP35c586d04033qhy5crptttuU5MmTRQbG6vw8HCnxwUAAACAgKFEG3blyhX98MMP2rZtm7Zu3apt27Zp586dunjxYrbHPfvssxo9erRDU0q//PKL5s+frwULFmjZsmW2Ppc4MjJS/fr109ChQ3XLLbcEYEoAAAAAcBYl2oB//etf+utf/6pt27Zpx44dunDhgtMj5SozM1ODBg3S7Nmzdf78+Xx97enTp/XOO+9owoQJGjVqlAYOHCiPx2NoUgAAAABwHiXagIMHD+r99993egxbMjIy9PHHHxdqjfT0dD355JPau3dv0DxvAAAAACgISjRydPvttysuLk5NmjRRLine truncated
|
||||||
|
}
|
||||||
|
},
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"id": "86ea2591",
|
"id": "de548741",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"source": [
|
"source": [
|
||||||
"If the value of `mandel` is less than `max_iters`, the point is provably outside the Mandelbrot set. If `mandel` is equal to `max_iters`, then the point is provably inside the set. The larger `max_iters`, the better the quality of the estimate (the nicer will be your plot).\n",
|
"The gid of points is shown in the next figure for `n=7` (but you should use at least `n=1000`).\n",
|
||||||
"\n",
|
"\n",
|
||||||
"Plot the value of function `mandel` for each pixel in a 2D grid of the box.\n",
|
"<div>\n",
|
||||||
|
"<img src=\"attachment:Screenshot%20from%202025-09-05%2014-41-15.png\", width=\"550\">\n",
|
||||||
|
"</div>\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "95e81488",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"### Hints\n",
|
||||||
"\n",
|
"\n",
|
||||||
"$$(-1.7,0.7)\\times(-1.2,1.2).$$\n",
|
"* Create a matrix `values` of the right size and fill it in so that `values[i,j]=surprise(x[i],y[j])` is the value for point `i` in the horizontal direction and `j` in the vertical direction (see the figure above).\n",
|
||||||
"\n",
|
"* The vectors `x` and `y` can be created with function `LinRange`.\n",
|
||||||
"Use a grid resolution of at least 1000 points in each direction and `max_iters` at least 10. You can increase these values to get nicer plots. To plot the values use function `heatmap` from the Julia package `GLMakie`. Use `LinRange` to divide the horizontal and vertical axes into pixels. See the documentation of these functions for help. `GLMakie` is a GPU-accelerated plotting back-end for Julia. It is a large package and it can take some time to install and to generate the first plot. Be patient."
|
"* Visualize the values in `values` with function `heatmap` from the Julia package `GLMakie`. `GLMakie` is a GPU-accelerated plotting back-end for Julia. It is a large package and it can take some time to install and to generate the first plot. Be patient.\n",
|
||||||
|
"* See the documentation of these functions for help."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user