I have the following problem:
I have two grids, s0B
and s1B
, both 20x20
, and a function s_0(s0, s1)
evaluated at these grid points.
However, for some corners, s_0(s0, s1)
cannot be evaluated, and returns np.nan
.
I would like to have an interpolated function of my evaluated grid points that I can then use in a root solving problem (Fixed point in s_0
and the analogue s_1
). Here is a rough sketch of the code right now:
# mesh 1d grids:
ss0 = np.array([ 0.38445455, 0.40388198, 0.42110923, 0.43626859, 0.44949237,
0.46091287, 0.47066239, 0.47887323, 0.48567771, 0.49120811,
0.49559675, 0.49897593, 0.50147794, 0.50323509, 0.50437969,
0.50504404, 0.50536044, 0.50546118, 0.50547859, 0.50554495])
ss1 = np.array([ 0.43490909, 0.50764658, 0.5719651 , 0.62838234, 0.67741596,
0.71958365, 0.75540309, 0.78539195, 0.81006791, 0.82994865,
0.84555185, 0.85739519, 0.86599635, 0.87187299, 0.87554281,
0.87752348, 0.87833267, 0.87848808, 0.87850736, 0.87890821])
s0B, s1B = np.meshgrid(ss0, ss1, indexing='ij')
# generate interpolated functions
idx = ~np.isnan(s0Max)
if idx.sum() == 0:
# check if there are any points at all
raise notImplementedError
s0MaxInterp = interpolate.interp2d(
s0B[idx], s1B[idx], s0Max[idx],
fill_value=np.nan, kind='linear')
idx = ~np.isnan(s1Max)
s1MaxInterp = interpolate.interp2d(
s0B[idx], s1B[idx], s1Max[idx],
fill_value=np.nan, kind='linear')
def errorFixedPoint(x, s0MaxInterp, s1MaxInterp, grids):
s0, s1 = x
# I skip some checks whether s0, s1 are inside the interpolation range
return np.array([s0 - s0MaxInterp(s0, s1)[0], s1 - s1MaxInterp(s0, s1)[0]])
result = optimize.root(errorFixedPoint, np.array([0.5, 0.9]),
args=(s0MaxInterp, s1MaxInterp, (ss0, ss1)), method='lm')
However, when trying this, I'm getting a RunTimeWarning
:
RuntimeWarning: No more knots can be added because the number of B-spline
coefficients already exceeds the number of data points m.
Probable causes: either s or m too small. (fp>s)
kx,ky=1,1 nx,ny=20,20 m=314 fp=0.000001 s=0.000000
warnings.warn(RuntimeWarning(_iermess2[ierm][0] + _mess))
The interpolation appears sometimes quite off the mark:
However, this can be because the function is quite nonlinear over both dimensions:
I read on other places that scipy.interpolate.griddata
is recommended as opposed to interpolate2d
. However, I have to iteratively interpolate (for the root finding process), and grid data does not support that.
How can I attack this problem?
For reproducibility, I paste the values of s0Max
and s1Max
here:
nan = np.nan
s0Max = np.array([[ nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan,
0.51494141, 0.51347656, 0.51210937, 0.51210937, 0.51210937,
0.51210937, 0.51210937, 0.51210937, 0.51210937, 0.51210937],
[ nan, nan, nan, nan, nan,
0.51337891, 0.5109375 , 0.51083984, 0.50253906, 0.50175781,
0.50429687, 0.50957031, 0.50859375, 0.50849609, 0.50839844,
0.50839844, 0.50839844, 0.50839844, 0.50839844, 0.50839844],
[ nan, nan, nan, 0.51347656, 0.50527344,
0.50009766, 0.49824219, 0.49746094, 0.49746094, 0.496875 ,
0.49746094, 0.49941406, 0.50742187, 0.50732422, 0.50732422,
0.50732422, 0.50732422, 0.50732422, 0.50732422, 0.50732422],
[ nan, nan, 0.51347656, 0.5015625 , 0.49863281,
0.49746094, 0.49628906, 0.49619141, 0.49570313, 0.49570313,
0.49619141, 0.49746094, 0.50722656, 0.50634766, 0.50625 ,
0.50625 , 0.50625 , 0.50625 , 0.50625 , 0.50625 ],
[ nan, nan, 0.50253906, 0.49824219, 0.496875 ,
0.49619141, 0.49560547, 0.49511719, 0.49511719, 0.49511719,
0.49550781, 0.49677734, 0.50625 , 0.50625 , 0.50625 ,
0.50625 , 0.50625 , 0.50625 , 0.50625 , 0.50625 ],
[ nan, 0.51210937, 0.49941406, 0.49746094, 0.49619141,
0.49560547, 0.49511719, 0.49453125, 0.49453125, 0.49453125,
0.49511719, 0.49628906, 0.50625 , 0.50527344, 0.50527344,
0.50527344, 0.50527344, 0.50527344, 0.50527344, 0.50527344],
[ nan, 0.50341797, 0.49804688, 0.49628906, 0.49570313,
0.49511719, 0.49453125, 0.49414062, 0.49404297, 0.49404297,
0.49453125, 0.49570313, 0.50527344, 0.50527344, 0.50527344,
0.50527344, 0.50527344, 0.50527344, 0.50527344, 0.50527344],
[ nan, 0.50078125, 0.49746094, 0.49619141, 0.49511719,
0.49453125, 0.49414062, 0.49404297, 0.49394531, 0.49394531,
0.49453125, 0.49570313, 0.50527344, 0.50527344, 0.50527344,
0.50527344, 0.50527344, 0.50527344, 0.50527344, 0.50527344],
[ nan, 0.49941406, 0.496875 , 0.49570313, 0.49511719,
0.49453125, 0.49404297, 0.49394531, 0.49355469, 0.49394531,
0.49414062, 0.49570313, 0.50527344, 0.50527344, 0.50517578,
0.50517578, 0.50507812, 0.50507812, 0.50507812, 0.50449219],
[ nan, 0.49873047, 0.49667969, 0.49560547, 0.49462891,
0.49414062, 0.49394531, 0.49355469, 0.49345703, 0.49355469,
0.49453125, 0.49628906, 0.50527344, 0.50517578, 0.50429687,
0.50429687, 0.50429687, 0.50429687, 0.50429687, 0.50429687],
[ 0.51347656, 0.49863281, 0.49628906, 0.49511719, 0.49453125,
0.49404297, 0.49394531, 0.49355469, 0.49355469, 0.49404297,
0.49570313, 0.50527344, 0.50429687, 0.50429687, 0.50429687,
0.50429687, 0.50429687, 0.50429687, 0.50429687, 0.50429687],
[ 0.51347656, 0.49814453, 0.49628906, 0.49511719, 0.49453125,
0.49404297, 0.49394531, 0.49355469, 0.49404297, 0.49570313,
0.50527344, 0.50429687, 0.50429687, 0.50429687, 0.50351563,
0.50351563, 0.50341797, 0.50341797, 0.50341797, 0.50341797],
[ 0.51347656, 0.49814453, 0.49619141, 0.49511719, 0.49453125,
0.49404297, 0.49394531, 0.49404297, 0.49511719, 0.50527344,
0.50429687, 0.50429687, 0.50351563, 0.50341797, 0.50341797,
0.50332031, nan, nan, nan, nan],
[ 0.51347656, 0.49814453, 0.49619141, 0.49511719, 0.49453125,
0.49404297, 0.49404297, 0.49453125, 0.49873047, 0.50507812,
0.50429687, 0.50351563, 0.50341797, nan, nan,
nan, nan, nan, nan, nan],
[ 0.51347656, 0.49814453, 0.49619141, 0.49511719, 0.49453125,
0.49404297, 0.49404297, 0.49511719, 0.50527344, 0.50429687,
0.50429687, 0.50341797, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.51347656, 0.49804688, 0.49619141, 0.49511719, 0.49453125,
0.49404297, 0.49453125, 0.49570313, 0.50527344, 0.50429687,
0.50429687, 0.50341797, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.51347656, 0.49804688, 0.49619141, 0.49511719, 0.49453125,
0.49414062, 0.49453125, 0.49619141, 0.50527344, 0.50429687,
0.50429687, 0.50341797, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.51347656, 0.49804688, 0.49619141, 0.49511719, 0.49453125,
0.49414062, 0.49453125, 0.49628906, 0.50527344, 0.50429687,
0.50351563, 0.50341797, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.51347656, 0.49804688, 0.49619141, 0.49511719, 0.49453125,
0.49414062, 0.49453125, 0.49628906, 0.50527344, 0.50429687,
0.50351563, 0.50341797, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.51347656, 0.49804688, 0.49619141, 0.49511719, 0.49453125,
0.49414062, 0.49453125, 0.49628906, 0.50527344, 0.50429687,
0.50351563, 0.50332031, nan, nan, nan,
nan, nan, nan, nan, nan]])
and
s1Max = np.array([[ nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan,
0.99894531, 0.99895996, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, nan, nan, nan, nan,
0.99895996, 0.99895996, 0.99895996, 0.98726563, 0.98429688,
0.99896118, 0.99895996, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, nan, nan, 0.99895996, 0.99896118,
0.97 , 0.95265625, 0.93984375, 0.93195313, 0.930625 ,
0.93929688, 0.96421875, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, nan, 0.99895996, 0.98117188, 0.95429688,
0.93351563, 0.91695313, 0.90453125, 0.89703125, 0.896875 ,
0.908125 , 0.93789063, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, nan, 0.98648438, 0.95296875, 0.9278125 ,
0.9075 , 0.89101563, 0.87859375, 0.8715625 , 0.8725 ,
0.88617188, 0.92085938, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, 0.99895996, 0.9640625 , 0.93265625, 0.90789063,
0.88757813, 0.87109375, 0.85875 , 0.85210938, 0.8540625 ,
0.86992188, 0.90914063, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, 0.99023438, 0.94773438, 0.91703125, 0.89234375,
0.87203125, 0.85546875, 0.84320313, 0.83695313, 0.83976563,
0.85757813, 0.9009375 , 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, 0.97570313, 0.93515625, 0.90476563, 0.88015625,
0.8596875 , 0.843125 , 0.8309375 , 0.825 , 0.82867188,
0.84820313, 0.8953125 , 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, 0.96515625, 0.92546875, 0.89515625, 0.87046875,
0.85 , 0.83335938, 0.82140625, 0.81585938, 0.82046875,
0.84203125, 0.89390625, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ nan, 0.95757813, 0.918125 , 0.88773438, 0.86296875,
0.8425 , 0.82609375, 0.8146875 , 0.81054688, 0.81820313,
0.84664063, 0.91648438, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ 0.99896484, 0.953125 , 0.913125 , 0.88242188, 0.8575 ,
0.83726563, 0.821875 , 0.81289062, 0.81414063, 0.83429688,
0.89601563, 0.99895996, 0.99895996, 0.99895996, 0.99895996,
0.99895996, 0.99895996, 0.99895996, 0.99895996, 0.99895996],
[ 0.99896484, 0.95078125, 0.90992188, 0.87867188, 0.85390625,
0.83453125, 0.82164063, 0.81859375, 0.83421875, 0.89546875,
0.99895996, 0.99895996, 0.99895996, 0.99896484, 0.99125 ,
0.9909375 , 0.99078125, 0.99078125, 0.99078125, 0.99070313],
[ 0.99896484, 0.94945313, 0.9078125 , 0.87632813, 0.85195313,
0.83429688, 0.82554688, 0.83273438, 0.87804688, 0.99895996,
0.99895996, 0.99895996, 0.99117188, 0.99023438, 0.98945313,
0.98890625, nan, nan, nan, nan],
[ 0.99896484, 0.94859375, 0.90640625, 0.875 , 0.85125 ,
0.835625 , 0.83203125, 0.8534375 , 0.9571875 , 0.99895996,
0.99895996, 0.99125 , 0.98992188, nan, nan,
nan, nan, nan, nan, nan],
[ 0.99896484, 0.948125 , 0.905625 , 0.87429688, 0.85125 ,
0.83757813, 0.83914063, 0.87632813, 0.99895996, 0.99895996,
0.99896484, 0.99046875, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.99896484, 0.94789063, 0.90523438, 0.87398438, 0.85148438,
0.83929688, 0.8446875 , 0.89546875, 0.99895996, 0.99895996,
0.99896484, 0.98992188, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.99896484, 0.94773438, 0.905 , 0.87382813, 0.85164063,
0.84023438, 0.84789063, 0.906875 , 0.99895996, 0.99895996,
0.99140625, 0.98960938, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.99896484, 0.94773438, 0.90492188, 0.87382813, 0.85171875,
0.84054688, 0.84890625, 0.9109375 , 0.99895996, 0.99895996,
0.99132813, 0.98953125, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.99896484, 0.94773438, 0.90492188, 0.87375 , 0.85171875,
0.840625 , 0.84914063, 0.91164063, 0.99895996, 0.99895996,
0.99132813, 0.98945313, nan, nan, nan,
nan, nan, nan, nan, nan],
[ 0.99896484, 0.94765625, 0.90492188, 0.87375 , 0.85179688,
0.84085938, 0.84984375, 0.91445313, 0.99895996, 0.99895996,
0.99132813, 0.989375 , nan, nan, nan,
nan, nan, nan, nan, nan]])