From 7fdc530b6c9ff6b1efd49a17756e792e4b0b3629 Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Sat, 14 Dec 2013 00:20:46 +0100 Subject: [PATCH] fixed some errors --- .../constant-visualization/constant-vis.html | 42 ++++ .../constant-visualization/constant-vis.js | 233 ++++++++++++++++++ ...ath-minimal-distance-to-cubic-function.pdf | Bin 434111 -> 434003 bytes .../problem-description.tex | 9 +- .../quadratic-vis.js | 11 +- 5 files changed, 283 insertions(+), 12 deletions(-) create mode 100644 documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.html create mode 100644 documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.js diff --git a/documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.html b/documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.html new file mode 100644 index 0000000..9f518d3 --- /dev/null +++ b/documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.html @@ -0,0 +1,42 @@ + + + + + Quadratic visualization + + + + + + + + + + + + + + + + + + + + + + + + + +
c
STRETCH_XSTRETCH_YX_OFFSETY_OFFSET
pDistancespreadclear board
+ + + + + diff --git a/documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.js b/documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.js new file mode 100644 index 0000000..f0d79db --- /dev/null +++ b/documents/math-minimal-distance-to-cubic-function/constant-visualization/constant-vis.js @@ -0,0 +1,233 @@ +'use strict'; + +/* global variables */ +var STRETCH_X = 3; +var STRETCH_Y = 0.5; +var X_MIN = -10; +var X_MAX = +10; +var Y_MIN = -10; +var Y_MAX = +10; +var X_OFFSET = -128; +var Y_OFFSET = 256; +var INITIAL_RADIUS = 20; +var POINT_RADIUS = 5; + +/*******************************************************************/ +/* Graphics */ +/*******************************************************************/ +/** + * Calculates coordinates from worldspace to screenspace + * @param {Number} x the coordinate you want to transform + * @param {bool} isX true iff x is a x-coordinate, otherwise false + * @return {Number} transformed coordinate + */ +function c(x, isX) { + if (isX) { + return STRETCH_X * (x - X_OFFSET); + } + + return STRETCH_Y * (-x + Y_OFFSET); +} + +/** + * Calculates coordinates from screenspace to worldspace + * @param {Number} x the coordinate you want to transform + * @param {bool} isX true iff x is a x-coordinate, otherwise false + * @return {Number} transformed coordinate + */ +function r(x, isX) { + if (isX) { + return (x / STRETCH_X) + X_OFFSET; + } + + return (-x / STRETCH_Y) + Y_OFFSET; +} + +function setCursorByID(id,cursorStyle) { + var elem; + if (document.getElementById && + (elem=document.getElementById(id)) ) { + if (elem.style) elem.style.cursor=cursorStyle; + } +} + +function drawEllipse(centerX, centerY, width, height) { + context.beginPath() ; + + var x = centerX; + var y = centerY; + var rx = width; + var ry = height; + var rotation = 0; // The rotation of the ellipse (in radians) + var start = 0; // The start angle (in radians) + var end = 2 * Math.PI; // The end angle (in radians) + var anticlockwise = false; + + context.ellipse(x, y, rx, ry, rotation, start, end, anticlockwise); + context.fillStyle = "rgba(255, 0, 0, 0.5)"; + context.fill(); +} + +function getColor(i, transparency) { + //var t = (i+1)*(360/k); + //var color = 'hsla('+t+', 100%, 50%, '+transparency+')'; + var x = i / 256; + if (x > 1) {x = 1.0;} + x = parseInt(x*255); + var color = 'rgba('+x+','+x+','+x+','+transparency+')'; + return color; +} + +function drawFunction(canvas) { + var add = parseInt(document.getElementById("density").value); + + context.beginPath(); + context.fillStyle = 'red'; + + context.moveTo(0, c(getValue(r(0))), false); + for (var xS=0; xS < canvas.width; xS+=add) { + var x = r(xS); + var y = getValue(x); + context.lineTo(c(x, true), c(y, false)); + } + + context.closePath(); + context.stroke(); +} + +/*******************************************************************/ +/* Math */ +/*******************************************************************/ +function euklideanDist(p1, p2) { + return Math.sqrt( + Math.pow(p1["x"]-p2["x"], 2) + + Math.pow(p1["y"]-p2["y"], 2)); +} + +/** + * Calculates the value of a constant function at x + * @param {Number} x + * @return {Number} f(x) + */ +function getValue(x) { + var c1 = parseFloat(document.getElementById("c").value); + return c1; +} + +/** + * Calculates the drivate f'(x) + * @param {Number} x + * @return {Number} f'(x) + */ +function getDValue(x) { + var a = parseFloat(document.getElementById("a").value); + var b = parseFloat(document.getElementById("b").value); + return 2*a*x+b; +} + +/** + * Calculates the drivate f''(x) + * @param {Number} x + * @return {Number} f''(x) + */ +function getDDValue(x) { + var a = parseFloat(document.getElementById("a").value); + return 2*a; +} + +/** + * Calculates (f(x)^2)' = ((a*x*x+b*x+c)^2)' = 2 (b + 2 a x) (c + x (b + a x)) + * @param {Number} x + * @return {Number} (f(x)^2)' + */ +function gedSquaredValueD(x) { + var a = parseFloat(document.getElementById("a").value); + var b = parseFloat(document.getElementById("b").value); + var c1 = parseFloat(document.getElementById("c").value); + return 2*(2*a*x+b)*(x*(a*x+b)+c1); +} + +/** + * Calculates (f(x)^2)'' = ((a*x*x+b*x+c)^2)'' = 2 (b^2 + 6 a b x + 2 a (c + 3 a x^2)) + * @param {Number} x + * @return {Number} (f(x)^2)'' + */ +function gedSquaredValueDD(x) { + var a = parseFloat(document.getElementById("a").value); + var b = parseFloat(document.getElementById("b").value); + var c1 = parseFloat(document.getElementById("c").value); + + return 2*(b*b+6*a*b*x+2*a*(c1+3*a*x*x)); +} + +function findMin(p) { + return p.x; +} + +/*******************************************************************/ +/* Start / Update */ +/*******************************************************************/ +function drawBoard(canvas, mouseCoords, radius) { + var context = canvas.getContext('2d'); + context.canvas.width = window.innerWidth - 50; + context.canvas.height = window.innerHeight - 120; + context.clearRect(0, 0, canvas.width, canvas.height); + + drawFunction(canvas); + if (document.getElementById("pDistance").checked) { + var add = parseInt(document.getElementById("density").value)+10; + for (var x=0; x < canvas.width; x+=add) { + for (var y=0; y < canvas.height; y+=add) { + var dist = getDist({"x":r(x,true), "y":r(y,false)}, findMin({"x":r(x,true), "y":r(y,false)})); + context.fillStyle = getColor(dist,0.5); + context.fillRect(x, y, add/2, add/2); + } + } + } +} + +function updateBoard(){ + var canvas = document.getElementById("myCanvas"); + STRETCH_X = parseFloat(document.getElementById("STRETCH_X").value); + STRETCH_Y = parseFloat(document.getElementById("STRETCH_Y").value); + X_OFFSET = parseFloat(document.getElementById("X_OFFSET").value); + Y_OFFSET = parseFloat(document.getElementById("Y_OFFSET").value); + drawBoard(canvas, {"x":0,"y":0}, INITIAL_RADIUS); +} + +var canvas = document.getElementById("myCanvas"); +var context = canvas.getContext("2d"); +drawBoard(canvas, {"x":0,"y":0}, INITIAL_RADIUS); +setCursorByID("myCanvas", "crosshair"); + +/** get the current position of the mouse */ +function getMouseCoords(canvas, evt) { + var rect = canvas.getBoundingClientRect(); + return { + "x": evt.clientX - rect.left, + "y": evt.clientY - rect.top + }; +} + +/** event listeners */ +canvas.addEventListener('mousemove', + function (evt) { + var mouseCoords = getMouseCoords(canvas, evt); + drawBoard(canvas, mouseCoords, 10); + // draw coordinates next to mouse + context.fillStyle = "blue"; + context.font = "bold 16px Arial"; + var x = r(mouseCoords.x, true).toFixed(3); + var y = r(mouseCoords.y, false).toFixed(3); + context.fillText("(" + x + ", " + y + ")", mouseCoords.x + 5, mouseCoords.y - 5); + var minX = findMin({"x": r(mouseCoords.x,true), "y": r(mouseCoords.y,false)}); + var minY = getValue(minX); + context.beginPath(); + context.moveTo(c(minX,true), c(minY, false)); + context.lineTo(mouseCoords.x, mouseCoords.y, false); + context.stroke(); + var minRadius = euklideanDist({"x": r(mouseCoords.x,true), "y": r(mouseCoords.y,false)}, {"x":minX,"y":minY}); + + /* Draw circle */ + drawEllipse(mouseCoords.x, mouseCoords.y, minRadius*STRETCH_X, minRadius*STRETCH_Y); + }, false); diff --git a/documents/math-minimal-distance-to-cubic-function/math-minimal-distance-to-cubic-function.pdf b/documents/math-minimal-distance-to-cubic-function/math-minimal-distance-to-cubic-function.pdf index 3f2752356b93493541f6d787062033e83547a0d7..2f6f650f6a865086a64287f64bdea159e747d351 100644 GIT binary patch delta 17107 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 updVrNoBl3T08N*ct@N;O^94U_5B~#enf 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 diff --git a/documents/math-minimal-distance-to-cubic-function/problem-description.tex b/documents/math-minimal-distance-to-cubic-function/problem-description.tex index 071b533..389aca9 100644 --- a/documents/math-minimal-distance-to-cubic-function/problem-description.tex +++ b/documents/math-minimal-distance-to-cubic-function/problem-description.tex @@ -1,18 +1,15 @@ \chapter{Description of the Problem} Let $f: D \rightarrow \mdr$ with $D \subseteq \mdr$ be a polynomial function and $P \in \mdr^2$ be a point. Let $d_{P,f}: \mdr \rightarrow \mdr_0^+$ -be the Euklidean distance of a point $P$ and a point $\left (x, f(x) \right )$ +be the Euklidean distance of a point $P$ to a point $\left (x, f(x) \right )$ on the graph of $f$: \[d_{P,f} (x) := \sqrt{(x_P - x)^2 + (y_P - f(x))^2}\] Now there is finite set $M = \Set{x_1, \dots, x_n} \subseteq D$ of minima for given $f$ and $P$: \[M = \Set{x \in D | d_{P,f}(x) = \min_{\overline{x} \in D} d_{P,f}(\overline{x})}\] -But minimizing $d_{P,f}$ is the same as minimizing $d_{P,f}^2$: -\begin{align} - d_{P,f}(x)^2 &= \sqrt{(x_P - x)^2 + (y_P - f(x))^2}^2\\ - &= x_p^2 - 2x_p x + x^2 + y_p^2 - 2y_p f(x) + f(x)^2 -\end{align} +But minimizing $d_{P,f}$ is the same as minimizing +$d_{P,f}^2 = x_p^2 - 2x_p x + x^2 + y_p^2 - 2y_p f(x) + f(x)^2$. \begin{theorem}[Fermat's theorem about stationary points]\label{thm:required-extremum-property} Let $x_0$ be a local extremum of a differentiable function $f: \mathbb{R} \rightarrow \mathbb{R}$. diff --git a/documents/math-minimal-distance-to-cubic-function/quadratic-min-visualization/quadratic-vis.js b/documents/math-minimal-distance-to-cubic-function/quadratic-min-visualization/quadratic-vis.js index 1734e4f..3748242 100644 --- a/documents/math-minimal-distance-to-cubic-function/quadratic-min-visualization/quadratic-vis.js +++ b/documents/math-minimal-distance-to-cubic-function/quadratic-min-visualization/quadratic-vis.js @@ -78,7 +78,7 @@ function getColor(i, transparency) { return color; } -function drawQuadraticFunction(canvas) { +function drawFunction(canvas) { var add = parseInt(document.getElementById("density").value); context.beginPath(); @@ -88,7 +88,6 @@ function drawQuadraticFunction(canvas) { for (var xS=0; xS < canvas.width; xS+=add) { var x = r(xS); var y = getValue(x); - //context.fillRect(c(x), c(y, false), add/2, add/2); context.lineTo(c(x, true), c(y, false)); } @@ -215,7 +214,7 @@ function drawBoard(canvas, mouseCoords, radius) { context.canvas.height = window.innerHeight - 120; context.clearRect(0, 0, canvas.width, canvas.height); - drawQuadraticFunction(canvas); + drawFunction(canvas); if (document.getElementById("pDistance").checked) { var add = parseInt(document.getElementById("density").value)+10; for (var x=0; x < canvas.width; x+=add) { @@ -262,13 +261,13 @@ canvas.addEventListener('mousemove', var x = r(mouseCoords.x, true).toFixed(3); var y = r(mouseCoords.y, false).toFixed(3); context.fillText("(" + x + ", " + y + ")", mouseCoords.x + 5, mouseCoords.y - 5); - var minX = findMin({"x": mouseCoords.x, "y": mouseCoords.y}); + var minX = findMin({"x": r(mouseCoords.x,true), "y": r(mouseCoords.y,false)}); var minY = getValue(minX); context.beginPath(); - context.moveTo(c(minX, true), c(minY, false), false); + context.moveTo(c(minX,true), c(minY, false)); context.lineTo(mouseCoords.x, mouseCoords.y, false); context.stroke(); - var minRadius = getDist({"x":x, "y":y}, minX); + var minRadius = euklideanDist({"x": r(mouseCoords.x,true), "y": r(mouseCoords.y,false)}, {"x":minX,"y":minY}); /* Draw circle */ drawEllipse(mouseCoords.x, mouseCoords.y, minRadius*STRETCH_X, minRadius*STRETCH_Y);