## linear interpolation — make grid

By : aloha
Source: Stackoverflow.com
Question!

I want to interpolate between different models. To make things easier, my data is shown below:

I have 10 different simulations (which I will call `z`). For each `z` I have an `array x` and an `array y` (where for a given `z`, `len(x)=len(y)`). For example:

for `z=1`: `x.shape=(1200,)` and `y.shape=(1200,)`

for `z=2`: `x.shape=(1250,)` and `y.shape=(1250,)`

for `z=3`: `x.shape=(1236,)` and `y.shape=(1236,)`

and so on ...

I want to interpolate so that for a given `z` and `x`, I get `y`. For example, for `z=2.5` and `x=10**9`, the code outputs `y`. I am assuming that:

`y = a*x + b*z + c` where of course I don't know `a`, `b`, and `c`.

My question is that how do I store the data in a grid? I am confused since for a different `z` the size of `x` and `y` differs. How is it possible to build a grid?

By : aloha

It seems that in your problem the curves y(x) are well behaving, so you could probably just interpolate y(x) for the given values of z first and then interpolate between the obtained y-values afterwards.

``````import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

import random

#####
# Generate some data
#####
generate = lambda x, z: 1./(x+1.)+(z*x/75.+z/25.)

def f(z):
#create an array of values between zero and 100 of random length
x = np.linspace(0,10., num=random.randint(42,145))
#generate corresponding y values
y = generate(x, z)
return np.array([x,y])

Z = [1, 2, 3, 3.6476, 4, 5.1]
A = [f(z) for z in Z]
#now A contains the dataset of [x,y] pairs for each z value

#####
# Interpolation
#####
def do_interpolation(x,z):
#assume Z being sorted in ascending order
#look for indizes of z values closest to given z
ig = np.searchsorted(Z, z)
il = ig-1
#interpolate y(x) for those z values
yg = np.interp(x, A[ig][0,:], A[ig][1,:])
yl = np.interp(x, A[il][0,:], A[il][1,:])
#linearly interpolate between yg and yl
return yl + (yg-yl)*float(z-Z[il])/(Z[ig] - Z[il])

# do_interpolation(x,z) will now provide the interpolated data
print do_interpolation( np.linspace(0, 10), 2.5)

#####
# Plotting, use Slider to change the value of z.
#####
fig=plt.figure()
for i in range(len(Z)):
ax.plot(A[i][0,:] , A[i][1,:], label="{z}".format(z=Z[i]) )

l, = ax.plot(np.linspace(0, 10) , do_interpolation( np.linspace(0, 10), 2.5), label="{z}".format(z="interpol"), linewidth=2., color="k" )

axn1 = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg='#e4e4e4')
sn1 = Slider(axn1, 'z', Z[0], Z[-1], valinit=2.5)
def update(val):
l.set_data(np.linspace(0, 10), do_interpolation( np.linspace(0, 10), val))
plt.draw()
sn1.on_changed(update)

ax.legend()
plt.show()
``````

try something like this.

You need the variable accessible in both functions so it needs to be declared outside those functions and then defined inside the first one and use `clearInterval()` to cancel an existing interval

``````var timer;
\$('#name').mouseenter(function() {
timer = setInterval(mosaic, 150);
}).mouseleave(function() {
clearInterval(timer);
});
``````