
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1310__algorithms/Julia/Notebooks/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1310__algorithms/Julia/Notebooks/Grid of Resistors.ipynb |
{
"metadata": {
"language": "Julia",
"name": "",
"signature": "sha256:3ba2851c943194a1d546a0b026996d63b6058353acb50aa804a965398775d8ad"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The problem is to compute the voltages and the effective\n",
"resistance of a $2n+1$ by $2n+2$ grid of $1 \\Omega$ resistors if\n",
"a battery is connected to the two center points. This is a discrete\n",
"version of finding the lines of force using iron filings for a magnet.\n",
"The picture below describes the two dimensional problem.\n",
"\n",
"<img src=\"http://beowulf.lcs.mit.edu/18.337-2004/hw1/battery.gif\">\n",
"\n",
"The method of solution that we will use here is <i>successive\n",
"overrelaxation</i> (SOR) with red-black ordering. This is certainly\n",
"not the fastest way to solve the problem, but it does illustrate many\n",
"important programming ideas.\n",
"\n",
"It is not so important that you know the details of SOR. Some of the\n",
"basic ideas may be found on pages 407-409 of Gil\n",
"Strang's <a href=\"http://www-math.mit.edu/%7Egs/books/itam_toc.html\">Introduction\n",
"to Applied Mathematics</a>. A somewhat more in-depth discussion may be\n",
"found in any serious numerical analysis text such as Stoer and\n",
"Bulirsch's <em>Introduction to Numerical Analysis</em>. What is\n",
"important is that you see that the nodes are divided in half into red\n",
"nodes and black nodes. During the first pass, the red nodes obtain the\n",
"voltages as a weighted average of their original voltage, the input\n",
"(if any) <i>and the four surrounding black nodes</i>. During the\n",
"second pass, the black nodes obtain voltages from the four surrounding\n",
"red nodes. The process converges in the limit to the correct answer\n",
"for the finite grid."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Matlab solution to the problem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" n=1000;\n",
" niter=10;\n",
"\n",
" mu = (cos(pi/(2*n))+cos(pi/(2*n+1)))/2;\n",
" om = 2*(1-sqrt(1-mu^2))/mu^2;\n",
"\n",
" v=zeros(2*n+1,2*n+2);\n",
"\n",
" ie=2:2:2*n;\n",
" io=3:2:2*n-1;\n",
" je=2:2:2*n;\n",
" jo=3:2:2*n+1;\n",
"\n",
" tic\n",
" for k=1:niter\n",
" v(ie,je)=(1-om)*v(ie,je)+ ... \n",
" om*0.25*(v(ie+1,je)+v(ie-1,je)+v(ie,je+1)+v(ie,je-1));\n",
" v(io,jo)=(1-om)*v(io,jo)+ ...\n",
" om*0.25*(v(io+1,jo)+v(io-1,jo)+v(io,jo+1)+v(io,jo-1));\n",
" v(n+1,n+1)=v(n+1,n+1)+om*0.25;\n",
"\n",
" v(ie,jo)=(1-om)*v(ie,jo)+ ...\n",
" om*0.25*(v(ie+1,jo)+v(ie-1,jo)+v(ie,jo+1)+v(ie,jo-1));\n",
" v(io,je)=(1-om)*v(io,je)+ ...\n",
" om*0.25*(v(io+1,je)+v(io-1,je)+v(io,je+1)+v(io,je-1));\n",
" v(n+1,n+2)=v(n+1,n+2)-om*0.25;\n",
"\n",
" r=2*v(n+1,n+1);\n",
" fprintf('Iter = %4d, r = %.16f\\n',k,r);\n",
" end\n",
" \n",
" tottime=toc;\n",
" fprintf('Time/iteration = %.5f s',tottime/niter);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SOR is best described, as you take the omage (om) and apply a scaled version of the neighbours, scale them and add it to the evens likewise for the odds.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## One to one Julia translation"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"function do_sor(n, niter)\n",
" mu = (cos(pi/(2n))+cos(pi/(2n+1)))/2\n",
" om = 2(1-sqrt(1-mu^2))/mu^2\n",
" \n",
" v = zeros(2n+1,2n+2)\n",
"\n",
" ie = 2:2:2n\n",
" io = 3:2:2n-1\n",
" je = 2:2:2n\n",
" jo = 3:2:2n+1\n",
"\n",
" tic()\n",
" for k = 1:niter\n",
" v[ie,je] = (1-om)*v[ie,je] + om*0.25(v[ie+1,je]+v[ie-1,je]+v[ie,je+1]+v[ie,je-1])\n",
" v[io,jo] = (1-om)*v[io,jo] + om*0.25(v[io+1,jo]+v[io-1,jo]+v[io,jo+1]+v[io,jo-1])\n",
" v[n+1,n+1] = v[n+1,n+1]+0.25om\n",
" \n",
" v[ie,jo] = (1-om)*v[ie,jo] + om*0.25(v[ie+1,jo]+v[ie-1,jo]+v[ie,jo+1]+v[ie,jo-1])\n",
" v[io,je] = (1-om)*v[io,je] + om*0.25(v[io+1,je]+v[io-1,je]+v[io,je+1]+v[io,je-1])\n",
" v[n+1,n+2] = v[n+1,n+2]-0.25om\n",
"\n",
" r = 2v[n+1,n+1]\n",
" println(\"Iter = $k, r = $r\")\n",
" end\n",
" tottime = toq();\n",
"end"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": [
"do_sor (generic function with 1 method)"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"n = 1000;\n",
"niter = 10;"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tottime = do_sor(n, niter)\n",
"println(\"Time/iteration = $(tottime/niter) s\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 1, r = 0.9984320590719546\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 2, r = 0.5000012253646902"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 3, r = 0.6238295603973248"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 4, r = 0.500002739828493"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 5, r = 0.5692203483150747"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 6, r = 0.5000042542377603"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 7, r = 0.5477712690495544"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 8, r = 0.5000057543536284"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 9, r = 0.536348537566667"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 10, r = 0.5000072374513715"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Time/iteration = 0.6990544940000001 s\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Doing it the Julia way"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"stencil(v,i,j,om) = (1-om)*v[i,j] + om*0.25(v[i+1,j]+v[i-1,j]+v[i,j+1]+v[i,j-1])\n",
"\n",
"function do_sor2(n, niter)\n",
"\n",
"\tv = zeros(2n+1,2n+2)\n",
"\n",
"\tmu = (cos(pi/(2n))+cos(pi/(2n+1)))/2\n",
"\tom = 2(1-sqrt(1-mu^2))/mu^2\n",
"\n",
"\ttic()\n",
"\tfor k = 1:niter\n",
"\t v[2:2:2n , 2:2:2n ] = [ stencil(v, i, j, om) for i=2:2:2n, j=2:2:2n ]\n",
"\t v[3:2:2n-1, 3:2:2n+1] = [ stencil(v, i, j, om) for i=3:2:2n-1, j=3:2:2n+1 ]\n",
"\t v[n+1,n+1] += 0.25om\n",
"\n",
"\t v[2:2:2n , 3:2:2n+1] = [ stencil(v, i, j, om) for i=2:2:2n, j=3:2:2n+1 ]\n",
"\t v[3:2:2n-1, 2:2:2n ] = [ stencil(v, i, j, om) for i=3:2:2n-1, j=2:2:2n ]\n",
"\t v[n+1,n+2] -= 0.25om\n",
"\n",
"\t r = 2v[n+1,n+1]\n",
"\t println(\"Iter = $k, r = $r\")\n",
"\tend\n",
"\ttoq()\n",
"\n",
"end"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"do_sor2 (generic function with 1 method)"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tottime = do_sor2(n, niter)\n",
"println(\"Time/iteration = $(tottime/niter) s\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 1, r = 0.9984320590719546\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 2, r = 0.5000012253646902\n",
"Iter = 3, r = 0.6238295603973248"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 4, r = 0.500002739828493\n",
"Iter = 5, r = 0.5692203483150747"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 6, r = 0.5000042542377603\n",
"Iter = 7, r = 0.5477712690495544"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 8, r = 0.5000057543536284\n",
"Iter = 9, r = 0.536348537566667"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 10, r = 0.5000072374513715\n",
"Time/iteration = 0.07988044720000001 s\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"@time do_sor(n, niter)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 1, r = 0.9984320590719546\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 2, r = 0.5000012253646902"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 3, r = 0.6238295603973248"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 4, r = 0.500002739828493"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 5, r = 0.5692203483150747"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 6, r = 0.5000042542377603"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 7, r = 0.5477712690495544"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 8, r = 0.5000057543536284"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 9, r = 0.536348537566667"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 10, r = 0.5000072374513715"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"elapsed time: 4.22001013 seconds (3870276648 bytes allocated, 40.22% gc time)\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"4.210031937"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"@time do_sor2(n, niter)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 1, r = 0.9984320590719546\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iter = 2, r = 0.5000012253646902\n",
"Iter = 3, r = 0.6238295603973248"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 4, r = 0.500002739828493\n",
"Iter = 5, r = 0.5692203483150747"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 6, r = 0.5000042542377603\n",
"Iter = 7, r = 0.5477712690495544"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 8, r = 0.5000057543536284\n",
"Iter = 9, r = 0.536348537566667"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Iter = 10, r = 0.5000072374513715\n",
"elapsed time: 0.817264472 seconds (351947348 bytes allocated, 18.07% gc time)\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"0.77910283"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}