Saturday, December 28, 2013
Natural Cubic Spline interpolation (Application)
For (n+1) points we now have 3 generic equations
$\frac{3(y_{i+2}-y_{i+1})}{(x_{i+2}-x_{i+1})^2} +\frac{3(y_{i+1}-y_i)}{(x_{i+1}-x_i)^2} = \frac{k_i}{x_{i+1}-x_i }+k_{i+1}[\frac{2}{x_{i+1}-x_i} +\frac{2}{x_{i+2}-x_{i+1}}]+\frac{k_{i+2}}{x_{i+2}-x_{i+1}}$ —(1)
$3\frac{y_{n+1}-y_n}{(x_{n+1}-x_n)^2}= \frac{2k_{n+1}}{x_{n+1}-x_n}+ \frac{k_n}{(x_{n+1}-x_n)}$ —(2)
$3\frac{y_1-y_0}{(x_1-x_0)^2} = \frac{2k_0}{x_1-x_0}+\frac{k_1}{x_1-x_0}$ —(3)
For i=[0,n-2]
The unknow here is k which is $f_i'(x_i)=c_i$, we have also seen that the rest of $a_i,b_i, d_i$ are all known as follows:
$a_i=\frac{1}{3}[\frac{(k_{i+1}-k_i)}{(x_{i+1}-x_i)^2}-\frac{2b_i}{(x_{i+1}-x_i )}]$ ---(4)
$b_i= \frac{3(y_{i+1}-y_i )}{(x_{i+1}-x_i)^2} - \frac{k_{i+1}+2k_i}{(x_{i+1}-x_i)}$ ---(5)
$c_i=k_i$ ---(6)
$d_i = y_i$ ---(7)
What is left now is to find k and it can be found by applying equation (1) - (3) and put them into matrix form and solve k using simple linear algebra.
$Wk = F$
$k_{(n+1)x1}=[k_0,k_1,...,k_n]^T$
$F_{(n+1)x1} =[ f_0,f_1,...,f_n]^T$
Where $f_i$ are the Left Hand sides of (1)-(3) and W is the (n+1)x(n+1) matrix formed by the Right Hand side of (1)-(3).
By obtaining the inverse of W,
$k = W^{-1} F$
we can solve for k.
To do interpolation for a value x, follow the following algorithm:
Step 1:
Find the interval $[x_i,x_{i+1}]$ by which x belongs.
Step 2:
Apply (4)-(7) to obtain the cubic equation coefficient.
Step 3:
Plug in the coefficients into the equation:
$y(x) = a_i(x-x_i)^3 + b_i(x-x_i)^2+c_i(x-x_i)+d_i$
Done! Now you got an estimated value of y(x)!
Tuesday, December 24, 2013
Natural Cubic Spline interpolation (Derivation)
$f_i (x) = a_i(x-x_i)^3 + b_i(x-x_i)^2 + c_i (x-x_i) + d_i$
The conditions for a natural cubic spline is given by the following:
$f_i (x_i) = a_i(x-x_i)^3 + b_i(x-x_i)^2 + c_i (x-x_i)+d_i = y_i$ —(1)
$f_i (x_i) = f_{i+1}(x_i)$ —(2)
$f_i '(x_i) = f_{i+1}'(x_i)=c_i$ —(3)
$f_i ''(x_{i+1}) = f_{i+1}''(x_{i+1})=2b_i$ —(4)
$f_0''(x_0) = 0$ —(5)
$f_{n-1}''(x_{n-1}) = 0$ —(6)
From here we will derive the solution to conduct cubic spline interpolation. The end results will be as specified in Wikipedia. The idea is the same as when you try to solve simultaneous equations and place them into systems of linear equations and solve them using simple linear algebra.
From (3) we are going to express everything in $f_i '(x_i) = f_{i+1} '(x_i) = k_{i+1}$.
First we obtain $a_i$ in terms of $b_i$ and $k_i$
$f_{i+1}'(x_i)=c_i$
From (4) we will get,
$f_{i+1}''(x_{i+1})=2b_{i+1}=6a_i(x_{i+1}-x_i)+2b_i$
$b_{i+1}-b_i= 3a_i (x_{i+1}-x_i )$ —(8)
Next we will substitute (7) into (8)
$b_{i+1}-b_i= 3*\frac{1}{3}[ \frac{k_(i+1)-k_i}{(x_{i+1}-x_i)^2} - \frac{2b_i}{(x_{i+1}-x_i )}]*(x_{i+1}-x_i ) $
$b_{i+1}+b_i= \frac{(k_{i+1}-k_i)}{(x_{i+1}-x_i )}$ — (9)
Equation (9) will be used in one of the final substitution so let's just hang on to equation (9) first and we will come back to this later. Now we try to substitute (1) and (7) into (2) to express $b_i$ in terms of $k_i$:
$y_{i+1}= a_i (x_{i+1}-x_i )^3+b_i (x_{i+1}-x_i)^2+c_i (x_{i+1}-x_i )+d_i$
$y_{i+1}-y_i= \frac{1}{3}[ \frac{(k_{i+1}-k_i)}{(x_{i+1}-x_i)^2} -\frac{2b_i}{(x_{i+1}-x_i )}](x_{i+1}-x_i )^3+b_i (x_{i+1}-x_i)^2+k_i (x_{i+1}-x_i )$
$\frac{(y_{i+1}-y_i)}{(x_{i+1}-x_i)^2} = \frac{1}{3}[\frac{(k_{i+1}-k_i)}{(x_{i+1}-x_i}-2b_i ]+b_i+\frac{k_i}{(x_{i+1}-x_i )}$
$\frac{3(y_{i+1}-y_i )}{(x_{i+1}-x_i)^2} = [\frac{(k_{i+1}-k_i)}{(x_{i+1}-x_i)}-2b_i ]+3b_i+\frac{3k_i}{x_{i+1}-x_i } $
$b_i= \frac{3(y_{i+1}-y_i )}{(x_{i+1}-x_i)^2} - \frac{(k_{i+1}-k_i)}{x_{i+1}-x_i}-\frac{3k_i}{(x_{i+1}-x_i )}$
$b_i= \frac{3(y_{i+1}-y_i )}{(x_{i+1}-x_i)^2} - \frac{k_{i+1}+2k_i}{(x_{i+1}-x_i)}$ —(10)
Finally substitute (10) into (9) to get a equation with only ks, ys and xs.
$\frac{3(y_{i+2}-y_{i+1} )}{(x_{i+2}-x_{i+1})^2} - \frac{(k_{i+2}+2k_{i+1})}{(x_{i+2}-x_{i+1})}+\frac{3(y_{i+1}-y_i )}{(x_{i+1}-x_i)^2} - \frac{(k_{i+1}+2k_i)}{(x_{i+1}-x_i)}= \frac{k_{i+1}-k_i}{x_{i+1}-x_i}$
$\frac{3(y_{i+2}-y_{i+1})}{(x_{i+2}-x_{i+1})^2} +\frac{3(y_{i+1}-y_i )}{(x_{i+1}-x_i)^2} = \frac{k_{i+1}-k_i}{x_{i+1}-x_i}+ \frac{k_{i+2}+2k_{i+1}}{x_{i+2}-x_{i+1}}+ \frac{k_{i+1}+2k_i}{x_{i+1}-x_i}$
$\frac{3(y_{i+2}-y_{i+1})}{(x_{i+2}-x_{i+1})^2} +\frac{3(y_{i+1}-y_i}{(x_{i+1}-x_i)^2} = \frac{k_i}{x_{i+1}-x_i }+k_{i+1}[\frac{2}{x_{i+1}-x_i} +\frac{2}{x_{i+2}-x_{i+1}}]+\frac{k_{i+2}}{x_{i+2}-x_{i+1}}$ —(11)
$0= 2[\frac{(k_{n+1}-k_n)}{(x_{n+1}-x_n)^2} -\frac{2b_n}{x_{n+1}-x_n }](x_{n+1}-x_n )+2b_n$
$b_n =\frac{k_{n+1}-k_n}{x_{n+1}-x_n }$
$3\frac{y_{n+1}-y_n }{(x_{n+1}-x_n)^2} = \frac{k_{n+1}-k_n}{x_{n+1}-x_n }+
\frac{k_{n+1}+2k_n}{x_{n+1}-x_n}$
$3\frac{y_{n+1}-y_n}{(x_{n+1}-x_n)^2}= \frac{2k_{n+1}}{x_{n+1}-x_n}+ \frac{k_n}{(x_{n+1}-x_n)}$ —(12)
$3\frac{y_1-y_0}{(x_1-x_0)^2} = \frac{2k_0}{x_1-x_0}+\frac{k_1}{x_1-x_0}$ —(13)
Friday, December 20, 2013
Natural Cubic Spline interpolation (Theory)
In cubic spline, the idea is the same, we have 2 points and we want to find a cubic equation to describe the points in between such that we can use it to estimate the intermediate values. Now let us consider 4 points as shown below.
In this case, we have 4 points and we will need to model 3 equations; if we have n+1 points we will need n such equations Each of these equation will look like this:
Thus there are 4n unknown we need to find. Here are the 4n equations that will help us determine these unknowns:
We know that at each equation has to fix the points hence we have the following:
We also would want the slope, first derivative, at the connecting points to be continuous or the same hence,
This will give us n-1 equations.
We also want the second derivative to be continuous or the same at connecting points, hence,
$f_i''(x_i) = 2b_i$
Hence, now we have in total 4n-2 equations and we still need 2 more.
There are a few types of cubic spline and one of the most commonly seen is the natural cubic spline. For this we specify the final 2 equations:
And solve them using Matrix Algebra.
Sunday, November 24, 2013
Reduce screen brightness in Ubuntu LTS 12.04.3
One of the things that kept bugging me was how the Ubuntu login screen would be so much brighter than I needed it to be. Coming directly from a black / purple background for the terminal and boot sequence, it would explode into colour and momentarily daze me.
It's almost part of my muscle memory now to tap the Fn-Brightness Down key combination until it reaches a more comfortable level at every startup. So I decided to take a different approach - find a command that allows me to issue the brightness level myself.
And it turns out that in Linux, there is a simple text file that controls the brightness of your backlight. For each laptop, it will differ, but I found mine using:
# find / -name brightness
That means, when logged in as the root user (the prompt typically shows a #
), find files recursively starting from the root of the filesystem /
with the -name brightness
. This yielded the following files:
/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/backlight/acpi_video0/brightness
/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight/brightness
/sys/devices/pci0000:00/0000:00:02.0/backlight/acpi_video1/brightness
/sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/ath9k-phy0/brightness
/sys/devices/pci0000:00/0000:00:1c.5/0000:07:00.0/leds/mmc0::/brightness
There we can immediately rule out the last two entries for leds
since we are looking for entries to change screen brightness and not LEDs. Since the first three also involve backlight
we can safely say we are on the right track. Then I changed to the pci0000:00/
directory to save a little typing*:
# cd /sys/devices/pci0000:00/
# cat 0000:00:01.0/0000:01:00.0/backlight/acpi_video0/brightness
# cat 0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight/brightness
# cat 0000:00:02.0/backlight/acpi_video0/brightness
Initially, I got 10
for both the acpi_video
files, and 976
for the Intel one. This suggested that the Intel file offered finer control over the brightness settings than the other two, which seemed to be supported by the max_brightness
files I found poking about in the same directories, which had values 10, 4882, 10
respectively.
So, while logged in as root, I tried:
# echo 0 > 0000:00:01.0/0000:01:00.0/backlight/acpi_video0/brightness
and that dimmed the screen somewhat. And trying the same for the Intel file turned off the screen completely, so I had to type** the last in the dark:
# echo 0 > 0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight/brightness
# echo 200 > 0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight/brightness
And then I played around with the values for a bit to see what brightness values I would be comfortable with. Once I'd had enough, I decided to set up a shortcut so that I could adjust it without logging in as root. First, I made it writeable by all, then I set up a link to it in my home directory:
# chmod 666 0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight/brightness
# ln -s /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight/brightness ~/brightness
Now I can adjust it to whatever value I want by issuing the following command within my home directory:
$ echo MY_PREFERRED_VALUE > brightness
Naturally, you might prefer to place the command in your startup scripts to use a preferred value automatically. That also means you don't have to change the permissions of that file, since root is active at startup. But that would need a bit more explaining, so I will leave it out of this post.
- * if tab completion works, it saves a lot of typing.
- ** here, press Up to retrieve the previous command, Home or Ctrl-A to go to the beginning, then replace 0 with 200 manually.
Sunday, October 20, 2013
Selectively sum substring value in a cell/row given condition on substring values in cell/row
0.5AL,,,,1.0BL,1.0BL,1.0BL,1.0BL,1.0BL,1.0BL,1.0BL,1.0BL,1.0BL,1.0BL
- There are empty cells in this row.We could do a VALUE(LEFT(B5:AF5,3)) to get the numerical value. But we will get an error if the cell is empty.
- The cells contain strings and not numbers. The typical "sumif" applies conditions and sum on the same range. This is not what we want because we want to condition on the substring instead of the whole string.
I was asking around for alternative solutions here are some alternative solutions:
1. An improved version can be done with the following formula:
Sunday, September 29, 2013
Free Web Hosting using Google Doc/Drive
I found that Google Drive not only allows you to store information on the web, it also allows you to publish materials on the web for free! If you tried to visit the helps sites here and here,you will realize that there are many information that will confuse you as it had confused me. Here is what you need to do to publish your site.
Step 1.
I believe most would know how to do this since you are reading this.
Create a public folder accessible to the Public and upload all your web files (HTML, ...) to the folder you just created.
Step 2.
Find out the folder ID by going to https://drive.google.com/#folders.
Navigate to the public folder you created in Step 1.
Noticed that the address now looks something like this:
https://drive.google.com/#folders/0BzarOaYG8nb6QlJCRTl5MjJp (this link is invalid)
Copy "0BzarOaYG8nb6QlJCRTl5MjJp" and that is your Folder ID.
Step 3.
Now you need to identify your website address. Mine looks like this:
https://googledrive.com/host/0BzarOaYG8nb6UzBrT1NzUzJuSEU/
Have you already figured it out already?
Your address to your website is https://googledrive.com/host/<folder id>, hence in this case it will be:
https://googledrive.com/host/0BzarOaYG8nb6QlJCRTl5MjJp
Some other useful sites you can visit:
http://www.labnol.org/internet/host-website-on-google-drive/28178/
http://www.youtube.com/watch?v=fwyZqyGEPNk
Thursday, September 12, 2013
Python On Android
Step 1.
You will need to install both Python for Android and SLA4 onto your Android phone. However, they are considered "unknown application" so you have to allow unknown application to install on your phone by checking the option at setting->security.
I shall not go through the installation as it is rather straight forward.
Step 2.
Next you are ready to code in Python!! Just start SLA4A application and you will see a list of sample scripts there.
The API for Python on Android can be found here and you can find some tutorial here. Also do note that similar to Python on PC, you will also be able to install packages and use it when it is available.
A few interesting things you will be able to do with this...
- Take photo/video
- Location discovery
- Bluetooth connectivity
- SMS
- Whatsapp (I have not tried this myself)
A sample example I did here is to use location discovery to get the coordinate of the current location. Using this coordinates, I launch Google Map and it will display your location.